根据数据库数据

时间:2017-10-06 12:36:28

标签: symfony architecture entity

这个问题可能与架构和应用程序设计有关,而不仅仅是开发本身。在这里:

我有一个用日期和会话(AM或PM)定义的实体,我需要一个get / set属性来知道 isReservedAllDay(),这意味着,这个实体有一个保留的互补实体在同一天,但不同的会议。

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

class HallReservation
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var \Date
     *
     * @ORM\Column(name="date", type="date")
     */
    private $date;

    /**
     * @var string: "AM" | "PM"
     *
     * @ORM\Column(name="session", type="string")
     */
    private $session;

isReservedAllDay() getReservedAllDay()实际上是通过访问数据库来设置的,当然,这应该超出实体范围并在控制器或服务中完成

我的第一个解决方案是执行此操作,在控制器中查询设置 de属性,然后能够在树枝,表格或任何地方获取此属性值,而无需从架构的角度来看,这可能是持久的甚至是映射这个属性,从构造的角度来看这可能是一个合适的解决方案!但是从开发的角度来看这不是很好,因为它迫使我每次得到一个实例时设置属性

function setReservedAllDay($reserved)
{
    $this->reservedAllDay = $reserved;
    return $this;
}

function getReservedAllDay()
{
    return $this->reservedAllDay;
}

你能批评这种方法还是建议一个更好的方法?

谢谢

1 个答案:

答案 0 :(得分:1)

例如,通过教义监听器设置值。 只是复制/键入这个,所以它可能不会完全工作,但你应该得到这个想法。 也许这种方法可以满足您的需求。

编辑:与ccKep一样,提到的entityManager已经可以通过LifecycleEventArgs函数中的postLoad直接使用。只有当您需要依赖于entityManager的其他服务并且无法直接注入时,才需要添加自定义事件。 我将这里的代码保持不变,这可能对其他人有用(他们需要的不仅仅是entityManager)。

教义听众:

class HallReservationLoadListener
{
    /** @var  EventDispatcherInterface */
    protected $eventDispatcher;

    public function __construct(EventDispatcherInterface $eventDispatcher)
    {
        $this->eventDispatcher = $eventDispatcher;
    }

    /**
     *
     * @param LifecycleEventArgs $args
     */
    public function postLoad(LifecycleEventArgs $args)
    {
        $item = $args->getEntity();
        if($item instanceof HallReservation) {
            $event = new HallReservationLoadedEvent($item);
            $this->eventDispatcher->dispatch(HallReservationLoadedEvent::NAME, $event);
        }

    }
}

自定义事件:

class HallReservationLoadedEvent extends Event
{
    const NAME = 'hallreservation.loaded';

    protected $hallreservation;

    public function __construct(HallReservation $hallreservation)
    {
        $this->hallreservation = $hallreservation;
    }

    public function getHallreservation()
    {
        return $this->hallreservation;
    }
}

自定义事件的监听器:

class HallReservationReservedListener
{
    protected $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function setReservedProperty(HallReservationLoadedEvent $event)
    {
        $hallreservation = $event->getHallreservation();
        //do your stuff
    }
}

服务定义:

app.listener.hallreservationload:
        class: AppBundle\Listener\HallReservationLoadListener
        arguments: ['@event_dispatcher']
        tags:
            - { name: doctrine.event_listener, event: postLoad }
    app.listener.hallreservationload.reservedproperty:
        class: AppBundle\Listener\HallReservationReservedListener
        arguments: ['@doctrine.orm.entity_manager']
        tags:
            - { name: kernel.event_listener, event: 'hallreservation.loaded', method: 'setReservedProperty'}