我想在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中正确显示自定义属性来解决问题吗?
答案 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中,以进行缓存,...)