Symfony CMF RoutingBundle - PHPCR 路由文档 - 多参数

Symfony CMF RoutingBundle - PHPCR Route Document - Multiple Parameters

试图找到解决方案,但我总是卡在文档或答案中,包括其他包。在动态路由器的文档中你可以找到提示:

"Of course you can also have several parameters, as with normal Symfony routes. The semantics and rules for patterns, defaults and requirements are exactly the same as in core routes."

就是这样。

...

/foo/{id}/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' ), 'foo' );
$route->setVariablePattern('/{id}');
$dm->persist( $route );

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

$dm->flush();

有无默认值和要求仅'/foo/bar''/foo/*'return 匹配,但是 '/foo/1/bar' 提示我 'No route found for "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' 一切正常。但是现在我已经走到这一步了,分配一个会说话的名字会把它四舍五入。

多谢指教!

实际上,您已经非常接近解决方案了!

使用 PHPCR-ODM 时,路由文档 ID 是它在存储库中的路径。 PHPCR 将所有内容存储在树中,因此每个文档都需要位于树中的特定位置。然后我们使用前缀来获得一个 URL 来匹配。如果前缀配置为 /cms/routes 并且请求针对 /foo,则路由器会在 /cms/routes/foo 中查找。要允许参数,您可以正确假设使用 setVariablePattern 。对于 /foo/{id}/bar 的用例,您需要执行 setVariablePattern('/{id}/bar')。你也可以有 setVariablePattern('/{context}/{id}') (这就是你引用的文档段落的意思 - 我会考虑在那里添加一个例子,因为它确实没有帮助说 "you can do this" 但没有解释如何)。

不推荐调用 setPath,因为它不太明确 - 但正如您所注意到的,它可以完成工作。请参阅 Model\Route::setPattern:

的 phpdoc 和实现
/**
 * 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。它允许为文档定义 role 以及按角色查找文档的方法。如果你有一个具有特定角色的路由,你想从你的控制器/模板 link 到它,这就是要走的路。如果您有一个内容文档 link 使用路由文档编辑并且该内容文档可用,您的第三个也是最好的选择是从内容文档生成 URL。 CMF 动态路由器可以做到这一点,只需使用您通常指定路由名称的内容对象即可。