В настоящее время я изучаю Symfony CMF и PHPCR для проекта, который я недавно начал. В настоящее время я пытаюсь понять, как создать Route
и сохранить его в базе данных. Насколько я понимаю, я должен использовать Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route
и сохранить элемент в базе данных. Это работает нормально, но автоматически генерирует путь маршрута, а это не то, что я хочу. Что мне нужно сделать, это создать собственный маршрут, который связан с конкретным контроллером. Вот мой код:
$em = $this->get('doctrine_phpcr.odm.document_manager');
$parent = $em->find(null, '/cms/routes');
$route = new \Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route();
$route->setParentDocument($parent);
$route->setName('my_route_name');
$route->setDefault('_controller', 'AppBaseBundle:Frontend/Users:index');
$em->persist($route);
$em->flush();
Если я выполню этот код, сгенерированный маршрут будет /cms/routes/my_route_name
, Из того, что я вижу, вы могли бы использовать $route->setPath('/testing');
, но это создает следующее исключение:
Не могу определить префикс. Либо это новый неискаженный документ, либо прослушиватель, который вызывает setPrefix, настроен неправильно.
У кого-нибудь есть идеи, как это решить?
В PHPCR каждый документ имеет path
где это магазин. Если вы знакомы с доктриной ORM, путь играет роль идентификатора. Разница с ORM заключается в том, что все документы (независимо от их типа) находятся в одном и том же дереве. Это здорово, потому что ваш маршрут может ссылаться на что угодно, он не ограничен конкретными типами документов. Но нам нужно создать некоторую структуру с путями. Вот почему у нас есть prefix
концепция. Все маршруты размещаются под префиксом (/cms/routes
по умолчанию). Эта часть пути документа удаляется для пути URL. Таким образом, путь к репозиторию / cms / route / testing является URL-адресом domain.com/testing.
О вашем примере кода: Обычно вы хотите сконфигурировать контроллер либо по классу документа содержимого, либо по атрибуту «type» маршрута, чтобы избежать сохранения имени контроллера в вашей базе данных для последующего рефакторинга. Многое из этого объяснено в [главе о маршрутизации документации CMF] [1], но префикс используется только там, а не объясняется явно. Нам нужно улучшить документацию там.
[1] http://symfony.com/doc/master/cmf/book/routing.htmlМне удалось найти способ преодолеть эту проблему. Потому что в моем проекте у меня также есть RouteAutoBundle
Я создал класс, который расширяет \Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route
, Внутри этого класса я добавил:
/**
* @PHPCR\Document(referenceable=true)
*/
class MenuRoute extends Route
{
protected $url;
/**
* Get $this->url
*
* @return mixed
*/
public function getUrl() {
return $this->url;
}
/**
* Set $this->url
*
* @param mixed $url
*/
public function setUrl($url) {
$this->url = $url;
}
}
После этого я добавил это в cmf_routing_auto.yml
:
App\MenuBundle\Document\MenuRoute:
uri_schema: /{getUrl}
token_providers:
getUrl: [content_method, { method: getUrl }]
Так что теперь можно просто создать экземпляр MenuRoute
(так же, как при использовании Route
) и вызвать метод setUrl($your_url)
передавая нужный URL.
Если кто-нибудь найдет лучший способ, я открыт для предложений.