Я нашел и успешно использовал документацию о том, как переопределить существующую модель в Sylius, но я не смог создать совершенно новую, использующую SyliusResourceBundle. Я предполагаю, что это легко, если вы уже знаете Symfony2? Я все еще учился, вот и вот что у меня есть … чего мне не хватает?
Я использую полную полную установку Sylius как свою базу, поэтому я начал здесь http://sylius.org/blog/simpler-crud-for-symfony2 У меня есть моя собственная установка «Astound Bundle» и несколько надменных и контрольных контроллеров того, что. Я добавил это в свою конфигурацию:
sylius_resource: resources: astound.location: driver: doctrine/orm templates: AstoundWebBundle:Location classes: model: Astound\Bundle\LocationBundle\Model\Location
Затем я сделал:
<?php namespace Astound\Bundle\LocationBundle\Model; class Location implements LocationInterface { /** * @var mixed */ protected $id; /** * @var string */ protected $name; public function getId() { return $this->id; } /** * {@inheritdoc} */ public function getName() { return $this->name; } /** * {@inheritdoc} */ public function setName($name) { $this->name = $name; } }
Вместе с:
<?php namespace Astound\Bundle\LocationBundle\Model; interface LocationInterface { /** * Get Id. * * @return string */ public function getId(); /** * Get name. * * @return string */ public function getName(); /** * Set name. * * @param string $name */ public function setName($name); }
Основываясь на изучении существующих моделей в Sylius и просмотре документации Doctrine, я сделал это также:
<?xml version="1.0" encoding="UTF-8"?> <!-- Astound/Bundle/LocationBundle/Resources/config/doctrine/model/Location.orm.xml --> <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd"> <mapped-superclass name="Location" table="Locations"> <id name="id" type="integer"> <generator strategy="AUTO" /> </id> <field name="name" type="string" /> </mapped-superclass> </doctrine-mapping>
При этом я ожидал, что смогу запустить доктрину app / console: schema: update –dump-sql и увидеть мою новую таблицу под названием «Locations» в моей базе данных, но вместо этого я получаю:
Ничего не обновляется – ваша база данных уже синхронизирована с текущими метаданными объекта.
Я заметил в контейнере app / console: debug, что у меня есть следующие службы:
astound.controller.location
контейнер Sylius \ Bundle \ ResourceBundle \ Controller \ ResourceControllerastound.manager.location
n / a псевдоним для doctrine.orm.default_entity_managerastound.repository.location
контейнер Sylius \ Bundle \ ResourceBundle \ Doctrine \ ORM \ EntityRepository
Поэтому я попытался добавить маршрут к indexAction на контроллере. Добавлен в мой основной файл конфигурации маршрутизации:
astound_location_index: pattern: /location methods: [GET] defaults: _controller: astound.controller.location:indexAction
поastound_location_index: pattern: /location methods: [GET] defaults: _controller: astound.controller.location:indexAction
Однако, когда я пытаюсь перейти на маршрут * app_dev.php / Administration / location * в своем браузере, я получаю:
Класс «Astound \ Bundle \ LocationBundle \ Model \ Location» не был найден в цепочке имен с цепочкой
И, выполняя еще несколько поисков во время написания этого, я нашел http://brentertainment.com/other/docs/book/doctrine/orm.html, это звучит так, как php-классы в папке Entities должны волшебным образом отображаться в доктрине приложения / консоли: сопоставление: информация или «цепочка с именами цепочек» ?, но у Sylius нет ни одной папки Entity в любом месте, поэтому должна быть какая-то скрытая магия … Я предполагаю, что она находится в файле базового пакета? Я попытался изо всех сил скопировать то, что другие Связки в Sylius, я сделал это:
<?php namespace Astound\Bundle\LocationBundle; use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass; use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\ResolveDoctrineTargetEntitiesPass; use Sylius\Bundle\ResourceBundle\SyliusResourceBundle; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; /** * Astound LocationBundle */ class AstoundLocationBundle extends Bundle { /** * Return array with currently supported drivers. * * @return array */ public static function getSupportedDrivers() { return array( SyliusResourceBundle::DRIVER_DOCTRINE_ORM ); } /** * {@inheritdoc} */ public function build(ContainerBuilder $container) { $interfaces = array( 'Astound\Bundle\LocationBundle\Model\LocationInterface' => 'astound.model.location.class', ); $container->addCompilerPass(new ResolveDoctrineTargetEntitiesPass('astound_location', $interfaces)); $mappings = array( realpath(__DIR__ . '/Resources/config/doctrine/model') => 'Astound\Bundle\LocationBundle\Model', ); $container->addCompilerPass(DoctrineOrmMappingsPass::createXmlMappingDriver($mappings, array('doctrine.orm.entity_manager'), 'astound_location.driver.doctrine/orm')); } }
Но это дает мне следующее:
ParameterNotFoundException: вы запросили несуществующий параметр «astound_location.driver».
Я попытался добавить это в свой конфиг:
astound_location: driver: doctrine/orm
Но затем я получаю эту ошибку:
FileLoaderLoadException: невозможно импортировать ресурс «… / app / config / astound.yml» из «… / app / config / config.yml». (Нет расширения, которое может загрузить конфигурацию для «astound_location» (в … / app / config / astound.yml). Посмотрел пространство имен «astound_location»
Спасибо всем, кто прочитал этот роман! Ответ должен быть простым ?! Чего не хватает?
Я просто наткнулся на такую же потребность, т. Е. Создать новую модель / сущность, расширяя Sylius. Моя первая попытка состояла в том, чтобы добавить мою новую модель в конфигурацию sylius_resource. Это привело к тому же сообщению «Nothing to update» при запуске doctrine: schema: update.
После некоторого копания я обнаружил, что моя новая модель, которую я определил как «сопоставленный суперкласс», в отличие от других моделей Sylius, не была «волшебным образом» преобразована в «сущность», поэтому доктрина не видит необходимости создавать таблицу базы данных для этого.
Поэтому я думаю, что быстрым решением было бы просто изменить отображение доктрины из «сопоставленного суперкласса» в «сущность». Например, в вашем примере:
изменить: модель: Astound \ Bundle \ LocationBundle \ Model \ Местоположение
модель: Astound \ Bundle \ LocationBundle \ Entity \ Местоположение
и изменить: mapapped-superclass name = "Location" table = "Locations" to
entity name = "Location" table = "Locations"
Но если вы предпочитаете сохранять свою модель сопоставленным суперклассом (и пусть sylius решит, должен ли он быть преобразован в объект, так что вы можете сохранить гибкость, чтобы легко расширить его позже), вам нужно более внимательно изучить, как sylius объявляет их связки.
После «Расширенной конфигурации» SyliusResourceBundle сделал трюк для меня.