Как создать маршрут с пользовательским путем в Symfony RoutingBundle (PHPCR)?

В настоящее время я изучаю 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, настроен неправильно.

У кого-нибудь есть идеи, как это решить?

0

Решение

В 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

1

Другие решения

Мне удалось найти способ преодолеть эту проблему. Потому что в моем проекте у меня также есть 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.

Если кто-нибудь найдет лучший способ, я открыт для предложений.

0

По вопросам рекламы [email protected]