如何解决Symfony-在接口内获取容器
我正在使用symfony,需要知道如何将容器注入EventSubscriberInterface吗?
我的目标是使用“ mail_template_type.repository”。在控制器中可以正常工作,但是EventSubscriberInterface似乎没有容器,或者至少dumpe($ event)没有显示它。
/**
* @var EntityRepositoryInterface $mailTypeRepository
* @var EntityRepositoryInterface $mailRepository
*/
$mailTypeRepository = getContainer()->get('mail_template_type.repository');
$mailRepository = getContainer()->get('mail_template.repository');
这是完整的代码:
<?php
namespace RegistrationExtension\Subscriber;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Checkout\Customer\CustomerEvents;
use Shopware\Core\Checkout\Customer\CustomerEntity;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
use Shopware\Storefront\Page\Account\Login\AccountLoginPageLoadedEvent;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Psr\Container\ContainerInterface;
use RegisterExtension\Struct\RegisterStruct;
class RegisterExtensionSubscriber implements EventSubscriberInterface{
/**
* @param ContainerInterface|NULL $container
*/
public function setContainer(ContainerInterface $container = NULL){
$this->container = $container;
return $this;
}
/**
* @return ContainerInterface
*/
protected function getContainer(){
return $this->container;
}
public static function getSubscribedEvents(): array{
return [
AccountLoginPageLoadedEvent::class => 'onCustomRegister'
];
}
public function onCustomRegister(AccountLoginPageLoadedEvent $event){
//dump($this->getContainer('mail_template_type.repository'));
//$event->getPage()->addExtension('custom_struct',new RegisterStruct());
/**
* @var EntityRepositoryInterface $mailTypeRepository
* @var EntityRepositoryInterface $mailRepository
*/
$mailTypeRepository = getContainer()->get('mail_template_type.repository');
$mailRepository = getContainer()->get('mail_template.repository');
$mailEntity = $mailTypeRepository->search(
(new Criteria())->addFilter(new EqualsFilter('mail_template_type.technicalName',"customer_register")),$event->getContext()
);
$mailTypeId = $mailEntity->getEntities()->first()->getId();
$mailEntity = $mailRepository->search(
(new Criteria())->addFilter(new EqualsFilter('mail_template.mailTemplateTypeId',$mailTypeId)),$event->getContext()
);
//$mailEntity->getEntities()->setContentHtml("test");
$mail = $mailEntity->getEntities();
}
}
<?xml version="1.0" ?>
<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">
<services>
<service id="RegistrationExtension\Storefront\Controller\RegistrationExtensionController" public="true"> </service>
<service id="RegistrationExtension\Subscriber\RegisterExtensionSubscriber">
<tag name="kernel.event_subscriber"/>
</service>
</services>
</container>
解决方法
如我的评论中所述,您应该利用依赖项注入来仅添加所需的服务,而不是整个容器。
在进行以下更改后,请确保清除并预热Symfony缓存。
自动接线服务
在Symfony 3.4+中,您可以使用autowire
,例如,使用记录器服务,它将自动将已知的FQCN服务注入__construct
。
vendor / symfony / monolog-bundle / Resources / config / monolog.xml
<?xml version="1.0" ?>
<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">
<services>
<service id="monolog.logger" parent="monolog.logger_prototype" public="false">
<argument index="0">app</argument>
<call method="useMicrosecondTimestamps">
<argument>%monolog.use_microseconds%</argument>
</call>
</service>
<service id="logger" alias="monolog.logger" />
<service id="Psr\Log\LoggerInterface" alias="logger" public="false" />
<!-- ... -->
</service>
</services>
</container>
config / services.xml
<?xml version="1.0" ?>
<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">
<services>
<!-- attempts to inject and tag services automatically -->
<defaults autowire="true" autoconfigure="true" public="false"/>
<service id="RegistrationExtension\Storefront\Controller\RegistrationExtensionController" public="true"> </service>
<service id="RegistrationExtension\Subscriber\RegisterExtensionSubscriber">
<tag name="kernel.event_subscriber"/>
</service>
</services>
</container>
src / RegistrationExtension / Subscriber / RegisterExtensionSubscriber.php
use Psr\Log\LoggerInterface;
class RegisterExtensionSubscriber implements EventSubscriberInterface
{
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
}
依赖注入
如果该服务由于使用字符串服务名而不是FQCN而不能使用autowire
进行注入,则可以在配置中手动声明该服务。
config / services.xml
<?xml version="1.0" ?>
<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">
<services>
<service id="RegistrationExtension\Storefront\Controller\RegistrationExtensionController" public="true"> </service>
<service id="RegistrationExtension\Subscriber\RegisterExtensionSubscriber">
<argument type="service" id="mail_template_type.repository" />
<argument type="service" id="mail_template.repository" />
<tag name="kernel.event_subscriber"/>
</service>
</services>
</container>
src / RegistrationExtension / Subscriber / RegisterExtensionSubscriber.php
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
//...
class RegisterExtensionSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private $mailTypeRepository;
/**
* @var EntityRepositoryInterface
*/
private $mailRepository;
public function __construct(
EntityRepositoryInterface $mailTypeRepository,EntityRepositoryInterface $mailRepository
) {
$this->mailTypeRepository = $mailTypeRepository;
$this->mailRepository = $mailRepository;
}
public function onCustomRegister(AccountLoginPageLoadedEvent $event)
{
$mailEntity = $this->mailTypeRepository->search(
(new Criteria())->addFilter(new EqualsFilter('mail_template_type.technicalName',"customer_register")),$event->getContext()
);
if ($mailType = $mailEntity->getEntities()->first()) {
$mailEntity = $this->mailRepository->search(
(new Criteria())->addFilter(new EqualsFilter('mail_template.mailTemplateTypeId',$mailType->getId())),$event->getContext()
);
$mail = $mailEntity->getEntities();
//...
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。