Symfony CMF RoutingBundle - маршрутный документ PHPCR - несколько параметров

Пытался найти решение, но я всегда застревал в документах или при ответах включал другие связки. В документации динамического маршрутизатора вы можете найти подсказку:

"Конечно, вы также можете иметь несколько параметров, как с обычными маршрутами Symfony. Семантика и правила для шаблонов, значений по умолчанию и требований точно такие же, как в основных маршрутах".

Это оно.

...

/ Foo / {ID} / бар

Я пытался (кажется, нет) все, чтобы сделать это.

То же самое для всех попыток:

Я попытался применить переменную модель и дочерний маршрут.

use Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route as PhpcrRoute;

$dm = $this->get('cmf_routing.route_provider');

$route = new PhpcrRoute();
$route->setPosition( $dm->find( null, '/cms/routes' ), 'foo' );
$route->setVariablePattern('/{id}');
$dm->persist( $route );

$child = new PhpcrRoute();
$child->setPosition( $route, 'bar' );
$dm->persist( $child );

$dm->flush();

С или без значения по умолчанию и требования только '/ foo / bar' и '/ foo / *' возвращают совпадения, но '/ foo / 1 / bar' запрашивает у меня 'Не найден маршрут для' GET /foo/1/bar"".

...

Просто сейчас я почти закончил.

use Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route as PhpcrRoute;

$dm = $this->get('cmf_routing.route_provider');

$route = new PhpcrRoute();
$route->setPosition( $dm->find( null, '/cms/routes' ), 'example_route' );
$dm->persist( $route );

$route->setPrefix( '/cms/routes/example_route' );
$route->setPath( '/foo/{id}/bar' );

$dm->flush();

Если префикс "/ cms / маршруты" и имя "foo", все работает нормально. Но теперь, когда я зашел так далеко, назначение говорящего имени округлило бы это.

Спасибо за совет!

1 ответ

Решение

На самом деле, вы достаточно близки к решению!

При использовании PHPCR-ODM идентификатор документа маршрута - это его путь в хранилище. PHPCR хранит весь контент в дереве, поэтому каждый документ должен находиться в определенном месте в дереве. Затем мы используем префикс, чтобы получить URL для соответствия. Если префикс настроен как /cms/ маршруты и запрос для /foo, маршрутизатор ищет в /cms/rout /foo. Чтобы разрешить параметры, вы можете использовать setVariablePattern как ты правильно предположил. Для случая использования /foo/{id}/bar вам нужно сделать setVariablePattern('/{id}/bar'), Вы могли бы также иметь setVariablePattern('/{context}/{id}') (это то, что имел в виду приведенный вами абзац документа - я рассмотрю добавление там примера, поскольку на самом деле бесполезно говорить "вы можете сделать это", но не объяснять, как это сделать).

призвание setPath не рекомендуется, так как он менее явный, но, как вы заметили, он справится с работой. Смотрите phpdoc и реализацию Model\Route::setPattern:

/**
 * It is recommended to use setVariablePattern to just set the part after
 * the static part. If you use this method, it will ensure that the
 * static part is not changed and only change the variable part.
 *
 * When using PHPCR-ODM, make sure to persist the route before calling this
 * to have the id field initialized.
 */
public function setPath($pattern)
{
    $len = strlen($this->getStaticPrefix());

    if (strncmp($this->getStaticPrefix(), $pattern, $len)) {
        throw new \InvalidArgumentException('You can not set a pattern for the route that does not start with its current static prefix. First update the static prefix or directly use setVariablePattern.');
    }

    return $this->setVariablePattern(substr($pattern, $len));
}

О явных именах: Путь к хранилищу также является именем маршрута, в примере /cms/routes/foo, Но не стоит использовать имя маршрута динамического маршрута в вашем коде, так как эти маршруты должны быть доступны для редактирования (и удаления) администратором. Если у вас есть маршрут, который существует наверняка и находится по определенному пути, используйте настроенные маршруты Symfony (routing.yml файл). Если это динамические маршруты, взгляните на CMF Resource Bundle. Это позволяет определить роль для документа и способ поиска документов по роли. Если у вас есть маршрут с определенной ролью, на которую вы хотите связать свой контроллер / шаблон, это путь. Если у вас есть документ с контентом, связанный с документом маршрута, и этот документ с контентом доступен, ваш третий и лучший вариант - создать URL-адрес из документа с контентом. Динамический маршрутизатор CMF может сделать это, просто используйте объект содержимого, где вы обычно указываете имя маршрута.

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