2014-11-26 3 views
0

Надеюсь, я смогу задать этот вопрос без раздражения или дать кому-то головную боль. Я новичок в Symfony и пытаюсь оборачивать вокруг себя все.Symfony2 Объекты с расширенными классами хранилища

Вот что я хочу сделать: В связке называется CalendarBundle У меня есть Event Entity где Repository класс выглядит следующим образом:

class EventRepository extends EntityRepository 
{ 
    /** 
    * @param $start 
    * @param $end 
    * @return array $events_array 
    */ 
    public function queryByRange($start = "", $end = "") 
    { 
     // set start and end to this month if empty 
     $start = ($start == "") 
      ? date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), 1, date('Y'))) 
      : $start; 
     $end = ($end == "") 
      ? date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('t'), date('Y'))) 
      : $end; 

     $query = $this->createQueryBuilder('e') 
      ->where('e.start > :start') 
      ->andWhere('e.end < :end') 
      ->setParameter('start', $start) 
      ->setParameter('end', $end) 
      ->orderBy('e.start', 'ASC'); 

     return $query; 
    } 

    /** 
    * @param string $start 
    * @param string $end 
    * @return array 
    */ 
    public function findByRange($start = "", $end = "") 
    { 
     // set start and end to this month if empty 
     $start = ($start == "") 
      ? date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), 1, date('Y'))) 
      : $start; 
     $end = ($end == "") 
      ? date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('t'), date('Y'))) 
      : $end; 

     $events = $this->queryByRange($start, $end)->getQuery()->getResult(); 

     $events_array = array(); 
     $prev_date = ''; 

     foreach($events as $event) { 
      $start = $event->getStart()->format('Ymj'); 

      if ($prev_date == $start) { 
       $events_array[$prev_date][] = $this->eventToArray($event); 
      } else { 
       $events_array[$start][] = $this->eventToArray($event); 
      } 

      $prev_date = $start; 
     } 

     return $events_array; 
    } 

    /** 
    * @param Event $event 
    * @return array 
    */ 
    private function eventToArray(Event $event) 
    { 
     return array(
      'item' => array(
      'id' => $event->getId(), 
      'name' => $event->getName(), 
      'description' => $event->getDescription(), 
      'type' => $event->getType(), 
      'status' => $event->getStatus(), 
      'start' => $event->getStart()->format('Ymd H:i:s'), 
      'end' => $event->getEnd()->format('Ymd H:i:s'), 
     ), 
     ); 
    } 
} 

То, что я пытаюсь выполнить, чтобы расширить эту базу событие Сущность с несколькими более конкретными событиями, добавляющими разные метаданные событий для каждого из них. Я полагаю, что функция queryByRange должна быть переписана для получения метаданных, а также функция eventToArray.

Позже я показываю события, используя разные шаблоны ветви, используя тип элемента «Событие», чтобы принять решение о используемых шаблонах.

Теперь то, что дает мне головную боль. Потому что я не знаю, что события, которые могут существовать, я хочу использовать этот класс EventRepository при получении всех видов событий в контроллере, как это:

$repository = $this->getDoctrine()->getRepository('AcmeCalendarBundle:Event'); 
$events = $repository->findByRange($start, $end); 

и правильный расширенный класс используется автомагический для запроса и возврата Мероприятия.

Я нашел, что this question where extending Bundles был правильным способом для этого. Но я не думаю, что это решает мой вопрос.

ответ

1

Вот пример того, что я думаю, что вы хотели для того чтобы достигнуть:

/** 
* @ORM\Entity(repositoryClass="My\OwnBundle\Entity\Repository\EventRepository") 
* @ORM\Table(name="event") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"sport_event" = "SportEvent", "music_event" = "MusicEvent"}) 
*/ 
class Event 
{ 
    /** 
    * @var integer 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(name="name", type="string", length=50) 
    */ 
    protected $name; 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 
} 

/** @ORM\Entity */ 
class SportEvent extends Event 
{ 
    /** 
    * @var string 
    * @ORM\Column(name="discipline", type="string", length=100) 
    */ 
    protected $discipline; 

    public function setDiscipline($discipline) 
    { 
     $this->discipline = $discipline; 
    } 

    public function getDiscipline() 
    { 
     return $this->discipline; 
    } 
} 

/** @ORM\Entity */ 
class MusicEvent extends Event 
{ 
    /** 
    * @var string 
    * @ORM\Column(name="band", type="string", length=100) 
    */ 
    protected $band; 

    public function setBand($band) 
    { 
     $this->band = $band; 
    } 

    public function getBand() 
    { 
     return $this->$band; 
    } 
} 

И ваше хранилище событий может быть просто:

class EventRepository extends EntityRepository 
{ 

} 

я не включил начальные и конечные поля на но если у вас есть они, то вы можете сделать:

$repository->findBy(['start' => $start, 'end' => $end]) 

Предполагая, что $ start и $ end соответствуют ct \ DateTime, результатом будет список объектов с совпадением указанного диапазона дат, но каждый отдельный объект будет иметь соответствующий класс (например. MusicEvent, SportEvent).

Подробнее читайте здесь: http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html#single-table-inheritance

+0

Удивительный! Я проведу способ метафайла событий в разных таблицах, но если это невозможно, будет выполняться одна таблица. Спасибо! – pusle

+0

Возможно, просто прочитайте документы по ссылке выше –

+0

Захватывающие возможности! Я не знал об этом :) нашел пример наследования таблицы классов здесь, что я буду тестировать позже: https://gist.github.com/Problematic/983982 – pusle

Смежные вопросы