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

时间:2015-09-29 22:51:56

标签: url-routing symfony-cmf doctrine-phpcr

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

  

“当然,您也可以使用几个参数,就像普通的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',一切正常。但是现在我已经达到了这个目的,指定一个说话名称就可以了解它。

感谢您的建议!

1 个答案:

答案 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:

的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。它允许为文档定义角色以及按角色查找文档的方法。如果您要从控制器/模板链接到具有特定角色的路由,则可以采用此方法。如果您有一个与路径文档链接的内容文档并且该内容文档可用,则您的第三个也是最佳选择是从内容文档生成URL。 CMF动态路由器可以做到这一点,只需使用通常指定路由名称的内容对象。