EasyAdmin-如何正确显示使用EntityRepository的自定义实体属性

时间:2019-03-21 09:36:53

标签: symfony symfony4 easyadmin

我想在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中正确显示自定义属性来解决问题吗?

1 个答案:

答案 0 :(得分: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 }

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

根据获取收益的逻辑(另一个数据库调用?是否从外部API加载?),您可能希望以不同的方式处理该问题(通过cron作业将其加载到DB中,以进行缓存,...)