You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:23