Как поместить объекты в пакет для Concrete5 v.8?

Вопрос по версии 8. Как поместить сущности в пакет для Doctrine? У меня это не сопоставление с БД (

1 ответ

Это взято из нового документа, который я написал о том, как сделать это в V8:

http://documentation.concrete5.org/developers/packages/custom-database-tables-in-packages/including-doctrine-orm-entities-in-your-package-version-8-and-above

Стандартное поведение

По умолчанию объекты в пакетах предоставляются следующим образом:

  • Использование драйвера аннотаций, который загружает информацию базы данных из аннотаций, предоставленных непосредственно в коде 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 и многое другое.

Настраиваемое поведение

Легко настроить поведение менеджера сущностей пакета. Что вы можете сделать с настраиваемой конфигурацией менеджера сущностей?

  1. Если у вас есть одна конкретная часть вашего пакета, содержащая сущности, и вы не хотите, чтобы база кода всего пакета сканировалась на предмет сущностей, предоставьте настраиваемого поставщика пакетов, который указывает только на точки в файловой системе, которые содержат ваши классы сущностей.
  2. Укажите дополнительные типы доктрин или расширения
  3. Предоставьте информацию о вашей сущности в альтернативных форматах, таких как XML или YAML (вместо аннотаций в классах PHP).

Чтобы настроить способ, которым ваш пакет настраивает объекты, которые он предоставляет, выполните одно из следующих действий.

  1. Заставьте контроллер вашего пакета реализовать Concrete\Core\Database\EntityManager\Provider\ProviderAggregateInterface, который будет отвечать за реализацию метода getEntityManagerProvider(), который возвращает объект Concrete\Core\Database\EntityManager\Provider\ProviderInterface интерфейс,
  2. Заставьте контроллер вашего пакета реализовать 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.

Другие вопросы по тегам