【问题标题】:EasyAdmin - How to show custom Entity property properly which use EntityRepositoryEasyAdmin - 如何正确显示使用 EntityRepository 的自定义实体属性
【发布时间】:2019-08-12 03:06:08
【问题描述】:

我想在 EasyAdmin 上显示一个自定义属性,这是一个示例:

class Book
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    public $id;
    /**
     * @ORM\Column(type="string")
     */
    public $name;
    /**
     * @ORM\Column(type="float")
     */
    public $price;
    public function getBenefit(): float
    {
        // Here the method to retrieve the benefits
    }
}

在本例中,自定义参数是benefit,它不是我们实体的参数,如果我们这样配置 EasyAdmin,它就可以工作!

easy_admin:
    entities:
        Book:
            class: App\Entity\Book
            list:
                fields:
                    - { property: 'title', label: 'Title' }
                    - { property: 'benefit', label: 'Benefits' }

问题是,如果函数有点复杂并且需要例如 EntityRepository,则无法尊重 Controller > Repository > Entities

有没有人有解决方法,也许是通过使用 AdminController 在 EasyAdmin 中正确显示自定义属性?

【问题讨论】:

    标签: symfony symfony4 easyadmin


    【解决方案1】:

    您不应该将检索收益的逻辑放在 Book 实体中,尤其是当它涉及像 entityManager 这样的外部依赖项时。

    您可能可以使用 Doctrine 事件来实现这一点。在从数据库加载 Book 实体后检索收益。在数据库中保存Book 实体之前或之后保存好处。

    你可以在这里找到更多信息https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html

    class Book
    {
        ...
        public $benefits;
    }
    
    // src/EventListener/RetrieveBenefitListener.php
    namespace App\EventListener;
    
    use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
    use App\Entity\Book;
    
    class RetrieveBenefitListener
    {
        public function postLoad(LifecycleEventArgs $args)
        {
            $entity = $args->getObject();
    
            // only act on some "Book" entity
            if (!$entity instanceof Book) {
                return;
            }
    
            // Your logic to retrieve the benefits
            $entity->benefits = methodToGetTheBenefits();
        }
    }
    
    // src/EventListener/SaveBenefitListener.php
    namespace App\EventListener;
    
    use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
    use App\Entity\Book;
    
    class SaveBenefitListener
    {
        public function postUpdate(LifecycleEventArgs $args)
        {
            $entity = $args->getObject();
    
            // only act on some "Book" entity
            if (!$entity instanceof Book) {
                return;
            }
    
            // Your logic to save the benefits
            methodToSaveTheBenefits($entity->benefits);
        }
    }
    
    // services.yml
    services:
        App\EventListener\RetrieveBenefitListener:
            tags:
                - { name: doctrine.event_listener, event: postLoad }
        App\EventListener\SaveBenefitListener:
            tags:
                - { name: doctrine.event_listener, event: postUpdate }
    

    这只是一个例子,我没有测试过代码。如果您创建新的Book 对象,您可能必须为postPersist 事件添加逻辑。

    根据检索收益的逻辑(另一个数据库调用?从外部 API 加载?),您可能希望以不同的方式解决问题(缓存、通过 cron 作业将它们加载到您的数据库中,...)

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2019-06-27
      • 1970-01-01
      • 2021-06-08
      相关资源
      最近更新 更多