Как создать пользовательский класс сущностей ECK (для каждого пакета) [закрыто]
С помощью ECK я создал транспортное средство типа сущности и добавил 2 связки, Легковые и грузовые автомобили
Цель состоит в том, чтобы иметь класс Car
, чтобы я мог использовать Car::create()
и аналогичные функции сущностей, а также реализовывать свои собственные функции.
Насколько я понял, это создание класса Vehicle
, и он работает, но я борюсь с пакетами.
1 answers
Я думаю, что невозможно делать то, что ты хочешь. Пакет не является подклассом сущности, как вы, кажется, предполагаете.
Классы всегда определяются в коде и всегда предоставляются модулем. ECK использует обходной путь, но на самом деле определяет только один тип сущности: EckEntity
, затем он выполняет некоторые трюки, чтобы позволить Drupal видеть это как разные типы сущностей.
Создание объектов для каждого пакета динамически (поскольку пользователь может добавлять/удалять пакеты) было бы сложным и кажется, это возможно только с помощью таких грязных трюков, как этот:
// With a property
$myclassname = "anewclassname";
$myproperty = "newproperty";
eval("class {$myclassname} { protected \${$myproperty}; }";
От: https://stackoverflow.com/a/15579465/1293725
Я почти уверен, что Drupal не поддерживает это (к счастью).
Пакеты хранятся как свойства сущности, часто (всегда?) Как свойство type
, посмотрите на этот пример:
// Create node object with attached file.
$node = Node::create([
'type' => 'article', // < - this is the bundle
'title' => 'Druplicon test',
'field_image' => [
'target_id' => $file->id(),
'alt' => 'Hello world',
'title' => 'Goodbye world'
],
]);
$node->save();
От: https://drupal.stackexchange.com/a/189095/9921
Итак, в вашем случае вам нужно будет сделать следующее:
$car = Vehicle::create([
'type' => 'car',
...
]);
Или определите новый класс для своих пакетов, но вам нужно будет либо использовать метод eval выше, чтобы создать класс для всех ваших пакетов, либо определить их в коде и потерять гибкость. Затем в этом классе расширьте класс транспортного средства и в конструкторе укажите type
или что-то в этом роде. Для удобства чтения вашего кода, я думаю, было бы лучше просто следовать соглашениям и не создавать классы для пакетов.