Symfony - 有没有办法将实体设置为全局?

Posted

技术标签:

【中文标题】Symfony - 有没有办法将实体设置为全局?【英文标题】:Symfony - is there a way to set a entity global? 【发布时间】:2021-01-04 07:09:39 【问题描述】:

我有一个实体,我在登录页面上扩展,但在下一页上扩展不存在(实体在两个页面上都存在)。有没有办法让我的扩展在下一页上可用?

<?php
namespace RegistrationExtension\Subscriber;

use ...

class RegisterExtensionSubscriber implements EventSubscriberInterface
    private $company;

    /**
     * @var EntityRepositoryInterface
     */
    private $mailTypeRepository;

    /**
     * @var EntityRepositoryInterface
     */
    private $mailRepository;
    /**
     * @var EntityRepositoryInterface
     */
    private $customerRepo;

    public function __construct(
        EntityRepositoryInterface $customerRepo,
        EntityRepositoryInterface $mailTypeRepository,
        EntityRepositoryInterface $mailRepository
    ) 
        $this->customerRepo = $customerRepo;
         $this->mailTypeRepository = $mailTypeRepository;
         $this->mailRepository = $mailRepository;
    
    public static function getSubscribedEvents(): array
        return [
            AccountLoginPageLoadedEvent::class => 'extendCustomer',
            AccountOverviewPageLoadedEvent::class => 'onCustomRegister'
        ];
    

当登录页面完成加载时触发此函数。

    public function extendCustomer(AccountLoginPageLoadedEvent $event)
       // if (isset($_POST['submit'])) 
            if(isset($_GET["email"]))
                $company = $_GET["email"];
            else
                $company = null;
            
            $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()
                );
            
                $mailEntity->getEntities()->first()->addExtension('file_does_exist', new ArrayEntity(['company' => "blub"]));
                dump($mailEntity->getEntities()->first());
            
       // 
    

此函数在用户登录并且页面完成加载后触发。

    public function onCustomRegister(AccountOverviewPageLoadedEvent $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()
            );
            dump($mailEntity);
          //  $mail = $mailEntity->getEntities()->first()->addExtension('file_does_exist', new ArrayEntity(['company' => $company]));
        
        $customerEntity = $this->customerRepo->search(
            (new Criteria())->addFilter(new EqualsFilter('customer.customerNumber', $event->getSalesChannelContext()->getCustomer()->getCustomerNumber())),
            $event->getContext()
        );         
    

会不会是AccountOverviewPageLoadedEvent事件加载了beo?

【问题讨论】:

如果您有一个实体,每个登录会话只加载和扩展一次 - 为什么不使用会话来保留该实体? 您好,谢谢您的回复。其实就是登记表。因此,在完成注册过程之前,客户不存在。我的主要目标是客户在填写注册表时可以上传文件。在这种情况下,此文件不是扩展名。之后,我想让它在邮件实体上可用,以便每封邮件发送信息。 【参考方案1】:

正如您在开发时已经发现的那样,扩展不会持久化。 您想要的是EntityExtension。这样您就可以扩展客户实体。但是,由于只能通过 EntityExtension 添加关联和外键字段,因此您需要一个自己的实体。

假设你是 create a entity: CustomerRegistrationFile 然后,您可以扩展 CustomerDefinition 并将您的 CustomerRegistrationFile 添加为关联。通过这种方式,您可以直接在实体中保存数据,并可以将其加载到您需要的任何地方,例如在您的邮件模板中。

旁注:关联不会自动加载。除了 OneToOneAssociations 可以从一端自动加载。不是两端,以防止循环引用。

【讨论】:

啊,好吧,我需要一个新实体来使数据持久化,而不是扩展现有实体? :D 您需要区分扩展和实体扩展。 shopware 中的每个实体都可以像您一样通过扩展来丰富,那些不是持久的。如果您在添加自己的实体的位置创建 EntityExtension,则会创建结构更改。这些变化可以并且将会持续下去。

以上是关于Symfony - 有没有办法将实体设置为全局?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在没有 symfony 的项目中重用我的 symfony 实体

如何在 Symfony 2 中为数据库视图设置实体(原则)

Symfony4:实体将repositoryClass设置为“App Entity CommentRepository”,但这不是有效的类

Symfony2/Doctrine:如何从实体类中持久化一个实体?

有没有办法将 require_once() 的范围显式设置为全局?

Symfony 4使用实体的全局标准