Мне нужно добавить некоторые дополнительные поля в кучу сущностей / классов, и я хотел бы получить эти поля, включенные в каждый объект / класс. Я мог бы написать все поля в каждом классе, и он будет работать, но я ищу способ централизовать определения полей и связанных с ними методов, чтобы сделать его более удобным для обслуживания и позволить мне распространять модификацию, просто редактируя один файл. Я получил его работу с использованием наследования, но в этом случае будет родительский класс / таблица, который будет отслеживать дочерние классы / таблицы либо с помощью * @ InheritanceType ("SINGLE_TABLE") *, либо @InheritanceType ("JOINED") и это может существенно повлиять на производительность, так как количество записей будет увеличиваться. У меня нет никакого преимущества в использовании наследования здесь.
Простой пример для выяснения проблемы:
Код для полей, которые я хочу включить в некоторый класс
filename: myfields.php
/** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(name="created_at",type="datetime") */ protected $createdAt; /** * @ORM\Column(name="modified_at", type="datetime") */ protected $modifiedAt; public function getId() { return $this->id; } public function setCreatedAt($createdAt) { $this->createdAt = $createdAt; return $this; } public function getCreatedAt() { return $this->createdAt; } public function setModifiedAt($modifiedAt) { $this->modifiedAt = $modifiedAt; return $this; } public function getModifiedAt() { return $this->modifiedAt; }
filename: Car.php
@ORM\Entity() @ORM\Table(name="car") class Car { /** * @ORM\Column(name="model", type="string") */ protected model; /** * @ORM\Column(name="price", type="decimal") */ protected price; // related setter and getters methods //Include myfields.php }
filename: Animal.php
@ORM\Entity() @ORM\Table(name="animal") class Animal { /** * @ORM\Column(name="species", type="string") */ protected species; // related setter and getters methods //Include myfields.php }
Я не хочу делать что-то вроде класса Animal extends MyFields, но я бы хотел просто импортировать и хранить общие данные в каждой таблице сущностей. Если мне нужно будет добавить какое-то дополнительное поле или просто изменить какой-либо метод, я изменю только «myfields.php», и он будет распространен на все Entities, которые его включают.
Конечно, в symfony мне нужно запустить: php app / console doctrine: schema: update –force, и структура будет изменена для всех классов, которые ее включают.
Вы можете решить эту проблему, используя черты (когда вы используете PHP 5.4+). Это позволит использовать повторное использование ваших свойств и аксессуаров, также называемое множественным наследованием. Вы можете просто определить все свои общие поля в Trait и импортировать Trait в свой потребительский класс.
Trait CommonFieldsTrait { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(name="created_at",type="datetime") */ protected $createdAt; /** * @ORM\Column(name="modified_at", type="datetime") */ protected $modifiedAt; public function getId() { return $this->id; } ... } @ORM\Entity() @ORM\Table(name="animal") class Animal { use CommonFieldsTrait; /** * @ORM\Column(name="species", type="string") */ protected species; // related setter and getters methods }