试图找到一个解决方案,但我总是卡在一个文档或答案包括其他包。在动态路由器的文档中,您可以找到提示:
“当然,您也可以使用几个参数,就像普通的Symfony路由一样。模式,默认值和要求的语义和规则与核心路由完全相同。”
多数民众赞成。
...
/富/ {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 / routes'且名称为'foo',一切正常。但是现在我已经达到了这个目的,指定一个说话名称就可以了解它。
感谢您的建议!
答案 0 :(得分:1)
实际上,你非常接近解决方案!
使用PHPCR-ODM时,路径文档id是其在存储库中的路径。 PHPCR将所有内容存储在树中,因此每个文档都需要位于树中的特定位置。然后我们使用前缀来获取匹配的URL。如果前缀配置为/ cms / routes并且请求是/ foo,则路由器查找/ cms / routes / foo。要允许参数,您可以正确使用setVariablePattern
。对于/ foo / {id} / bar的用例,您需要执行setVariablePattern('/{id}/bar')
。你也可以setVariablePattern('/{context}/{id}')
(这就是你引用的doc段的意思 - 我会考虑在那里添加一个例子,因为它确实没有帮助说“你可以做到这一点”但不解释如何)。
不建议调用setPath
,因为它不太明确 - 但正如您所注意到的,它将完成工作。请参阅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动态路由器可以做到这一点,只需使用通常指定路由名称的内容对象。