我试图覆盖"供应商"部分。按照本指南https://symfony.com/doc/3.4/bundles/override.html制作了此代码
namespace AppBundle\DependencyInjection\Compiler;
use AppBundle\Service\Subscriber;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class OverrideServiceCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition('MyOldService');
$definition->setClass(Subscriber::class); //my new service class
}
}
我在" AppBundle \ Service \ Subscriber"上创建了一个订阅者课程。并试图覆盖一个动作:
<?php
namespace AppBundle\Service;
class Subscriber
{
public function the_same_name_of_function_from_vendor()
{
dump('I am a new function!');die;
return new Response('ok');
}
}
但没有任何开心,symfony继续称呼来自&#34;供应商&#34;部分。
如何正确覆盖该功能?
答案 0 :(得分:4)
您必须在src / AppBundle / AppBundle.php中添加此代码:
在function build()
中$container->addCompilerPass(new OverrideServiceCompilerPass());
所有课程:
class AppBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new OverrideServiceCompilerPass());
}
}
https://symfony.com/doc/3.4/service_container/compiler_passes.html
否则你的compilepass没有加载。
答案 1 :(得分:1)
对于覆盖服务的特定情况,您唯一需要做的就是在您的捆绑(或应用程序文件夹)services.yml中定义一个新服务
perl
当然有一些规则:
lexik_jwt_authentication.security.guard.jwt_token_authenticator:
class: SeguridadBundle\DependencyInjection\MyJWTTokenAuthenticator
arguments: ["@lexik_jwt_authentication.jwt_manager", "@event_dispatcher", "@lexik_jwt_authentication.extractor.chain_extractor"]
的另一个服务。因此,在覆盖服务时,您需要创建一个与原始名称保持相同名称的新定义,但具有不同的实例化类。 请注意,对于兼容性问题,建议实现与原始相同的接口,即:遵循与原始服务相同的约定,以保证兼容性。
对不起我的英语,我希望有所帮助