如何在Symfony 4项目中为控制器使用PHP-DI Symfony Bridge?
在Symfony 4中集成PHP-DI 6与PHP-DI Symfony Bridge 3
我来一步步教你把PHP-DI 6和它的Symfony Bridge 3集成到你的Symfony 4项目里,完全适配你的现有项目结构,跟着做就行:
1. 安装依赖包
首先在项目根目录下运行Composer命令,把需要的包装进去:
composer require php-di/php-di:^6.0 php-di/symfony-bridge:^3.0
2. 修改Kernel.php文件
这是集成的关键一步,我们要把默认的Symfony Kernel替换成PHP-DI提供的Kernel类。打开项目根目录的Kernel.php,修改父类并调整配置加载逻辑:
<?php use PhpDiSymfonyBridge\Kernel\PhpDiKernel; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; class Kernel extends PhpDiKernel { // 保留你原来的registerBundles方法,不用改 protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) { // 先加载Symfony默认的配置文件 parent::configureContainer($container, $loader); // 加载你自己的PHP-DI依赖定义文件 $loader->load(__DIR__.'/config/dependencies/common.php'); } }
3. 完善依赖配置文件
打开config/dependencies/common.php,补充接口与实现的绑定,以及控制器的自动注入配置:
<?php use DI\ContainerBuilder; use Interop\Services\Dummy\FooService; use Interop\Services\Dummy\FooServiceInterface; use Interop\Website\Controller\IndexController; return function (ContainerBuilder $builder) { $builder->addDefinitions([ // 把FooServiceInterface接口绑定到具体的实现类 FooServiceInterface::class => DI\autowire(FooService::class), // 如果需要切换成BuzService实现,直接替换这里就行: // FooServiceInterface::class => DI\autowire(BuzService::class), // 让控制器支持自动注入依赖 IndexController::class => DI\autowire(), ]); };
4. 在控制器中使用注入的服务
现在打开Interop/Website/Controller/IndexController.php,通过构造函数注入FooServiceInterface,就能直接使用服务了:
<?php namespace Interop\Website\Controller; use Interop\Services\Dummy\FooServiceInterface; use Symfony\Component\HttpFoundation\Response; class IndexController { private $fooService; // 构造函数自动注入FooServiceInterface的实现类 public function __construct(FooServiceInterface $fooService) { $this->fooService = $fooService; } public function index() { // 这里可以调用服务的方法,比如 $this->fooService->yourMethod(); return new Response('成功集成PHP-DI!'); } }
5. 测试集成效果
启动Symfony内置服务器:
php bin/console server:run
访问你给IndexController配置的路由,如果能正常返回响应,就说明PHP-DI已经成功集成并工作了!
内容的提问来源于stack exchange,提问作者automatix
相关产品推荐
相关产品推荐

