Как поместить объекты в пакет для Concrete5 v.8?
Вопрос по версии 8. Как поместить сущности в пакет для Doctrine? У меня это не сопоставление с БД (
1 ответ
Это взято из нового документа, который я написал о том, как сделать это в V8:
Стандартное поведение
По умолчанию объекты в пакетах предоставляются следующим образом:
- Использование драйвера аннотаций, который загружает информацию базы данных из аннотаций, предоставленных непосредственно в коде PHP.
- Если в пакете включено устаревшее пространство имен \Src, что является случаем, если пакет не использует никаких пользовательских автозагрузчиков и поддерживает конкретную версию 5 до версии 8, тогда весь каталог packages/package_handle/src/ сканируется на наличие сущностей и их аннотации.
- Если устаревшее пространство имен \Src не включено, то местоположения классов, указанные в $pkg->getPackageAutoloaderRegistries(), и любые файлы, найденные в packages/your_package/src/Concrete/Entity, сканируются на наличие сущностей.
Такое поведение можно найти в Concrete\Core\Database\EntityManager\Provider\DefaultPackageProvider
, который является классом поставщика менеджера сущностей по умолчанию, используемым, если другой не предоставлен.
Функциональность драйвера аннотации
Большая часть документации, найденной в более ранней документации пакета Doctrine ORM, все еще точна, с одним большим изменением:
Если ваш пакет содержит классы сущностей, которые используют аннотации, и пакет требует версию 8 или выше, вы должны включить @ORM в свои аннотации. Итак, вместо этого:
<?php
namespace Concrete\Package\Statistics\Src\Entity;
/**
* @Entity
* @Table(name="StatisticsUserAgents")
*/
class UserAgent
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @Column(type="string")
*/
protected $value;
/**
* @Column(type="string")
*/
protected $hash;
}
Вы должны импортировать пространство имен ORM и добавить все аннотации к ORM:
<?php
namespace Concrete\Package\Statistics\Src\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="StatisticsUserAgents")
*/
class UserAgent
{
/**
* @ORM\Id @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $value;
/**
* @ORM\Column(type="string")
*/
protected $hash;
}
Почему мы это сделали? Не просто, чтобы сделать вашу жизнь сложнее. Как только пространство имен @ORM включено, оно делает так, чтобы ваша Доктрина могла сделать намного больше. Например, любые пакеты, работающие в версии 8, смогут поддерживать расширения Doctrine и многое другое.
Настраиваемое поведение
Легко настроить поведение менеджера сущностей пакета. Что вы можете сделать с настраиваемой конфигурацией менеджера сущностей?
- Если у вас есть одна конкретная часть вашего пакета, содержащая сущности, и вы не хотите, чтобы база кода всего пакета сканировалась на предмет сущностей, предоставьте настраиваемого поставщика пакетов, который указывает только на точки в файловой системе, которые содержат ваши классы сущностей.
- Укажите дополнительные типы доктрин или расширения
- Предоставьте информацию о вашей сущности в альтернативных форматах, таких как XML или YAML (вместо аннотаций в классах PHP).
Чтобы настроить способ, которым ваш пакет настраивает объекты, которые он предоставляет, выполните одно из следующих действий.
- Заставьте контроллер вашего пакета реализовать
Concrete\Core\Database\EntityManager\Provider\ProviderAggregateInterface
, который будет отвечать за реализацию метода getEntityManagerProvider(), который возвращает объектConcrete\Core\Database\EntityManager\Provider\ProviderInterface
интерфейс, - Заставьте контроллер вашего пакета реализовать
Concrete\Core\Database\EntityManager\Provider\ProviderInterface
метод, который возвращает массивConcrete\Core\Database\EntityManager\Driver\DriverInterface
объекты.
В обоих случаях вы в конечном итоге предоставите хотя бы один Concrete\Core\Database\EntityManager\Driver\DriverInterface
объект.
пример
Вот простой пример. Допустим, у вас есть пакет, содержащий объекты в следующих местах:
- Concrete \ Package \ YourPackage \ Entity (который автоматически загружается concrete5 из пакетов / src / your_package / Concrete / Entity)
PortlandLabs \ Testing \ Entity, который вы настроили в качестве пользовательского расположения класса с помощью $ pkgAutoloaderRegistries:
protected $ pkgAutoloaderRegistries = array ('src / Testing' => '\ PortlandLabs \ Testing',);
Вместо того, чтобы сканировать все файлы, найденные в packages/your_package/src/ (который является стандартным поведением по умолчанию), вы просто хотите загрузить классы, используя стандартный драйвер аннотации из этих двух мест. Сначала измените контроллер пакета так, чтобы он реализовывал ProviderAggregateInterface, и импортируйте интерфейс, а также класс StandardPackageProvider:
use Concrete\Core\Database\EntityManager\Provider\ProviderAggregateInterface;
use Concrete\Core\Database\EntityManager\Provider\StandardPackageProvider;
class Controller extends Package implements ProviderAggregateInterface
Затем реализуйте класс провайдера:
public function getEntityManagerProvider()
{
$provider = new StandardPackageProvider($this->app, $this, [
'src/Concrete/Entity' => 'Concrete\Package\YourPackage\Entity',
'src/Testing/Entity' => 'PortlandLabs\Testing\Entity'
]);
return $provider;
}
Это оно! Стандартный поставщик пакетов - это простая библиотека, которую может использовать большинство классов, которые хотят использовать аннотированные объекты, но загружают их из пользовательских мест.
Другие форматы файлов
Существуют другие классы для предоставления определений сущностей в разных форматах. Проверять, выписываться Concrete\Core\Database\EntityManager\Provider\YamlProvider
а также Concrete\Core\Database\EntityManager\Provider\XmlProvider
если вы хотите предоставить свои объекты пакета в форматах YAML или XML.