Symfony4自定义Bundle中如何注入KernelInterface等服务?
在Symfony4自定义Bundle中注入KernelInterface的正确姿势
嘿,我来帮你搞定在自定义Bundle里注入KernelInterface的问题!先看看你当前代码里的小问题,再一步步修正:
1. 先解决构造函数参数不匹配的问题
我注意到你的LilworksYoutubeDl类构造函数需要三个参数:$foo、$bar和KernelInterface,但你在services.xml里只注入了kernel这一个服务参数,这会直接导致依赖注入失败。你需要把所有参数都配置好:
修正后的services.xml
如果$foo和$bar是静态配置参数,可以这样写:
<?xml version="1.0" encoding="UTF-8" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <!-- 先定义需要的参数 --> <parameters> <parameter key="lilworks.youtubedl.foo">你的foo值</parameter> <parameter key="lilworks.youtubedl.bar">你的bar值</parameter> </parameters> <services> <service id="lilworks.youtubedl" class="Lilworks\YoutubeDlBundle\LilworksYoutubeDl" public="true"> <!-- 按构造函数顺序注入参数 --> <argument>%lilworks.youtubedl.foo%</argument> <argument>%lilworks.youtubedl.bar%</argument> <!-- 注入kernel服务,它默认实现了KernelInterface --> <argument type="service" id="kernel" /> </service> <service id="Lilworks\YoutubeDlBundle\LilworksYoutubeDl" alias="lilworks.youtubedl" public="true"/> </services> </container>
如果$foo和$bar是其他服务,就把参数改成服务注入的形式:
<argument type="service" id="对应的服务ID"/>
2. 移除不必要的继承
你的LilworksYoutubeDl类继承了AbstractController,但这个类只是一个普通服务,不是控制器,继承它会引入不必要的依赖,建议去掉:
<?php namespace Lilworks\YoutubeDlBundle; use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; // 去掉AbstractController继承 class LilworksYoutubeDl { private $foo; private $bar; private $kernel; public function __construct($foo,$bar,KernelInterface $kernelInterface) { $this->foo = $foo; $this->bar = $bar; $this->kernel = $kernelInterface; } // 示例:使用kernel的业务方法 public function getProjectRoot() { return $this->kernel->getProjectDir(); } }
3. 确保Bundle配置被正确加载
最后要确认你的Bundle类已经加载了这个services.xml配置,在LilworksYoutubeDlBundle.php里添加加载逻辑:
<?php namespace Lilworks\YoutubeDlBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\Config\FileLocator; class LilworksYoutubeDlBundle extends Bundle { public function load(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/Resources/config')); $loader->load('services.xml'); } }
4. 清除缓存
做完以上修改后,记得清除Symfony缓存,避免旧配置影响:
php bin/console cache:clear
这样你就能在自定义Bundle的服务里正常使用KernelInterface了!
内容的提问来源于stack exchange,提问作者lil-works
相关产品推荐
相关产品推荐

