Symfony2:使用对象设置管线参数

Symfony2:使用对象设置管线参数,symfony,Symfony,我有一条带有2个参数的路线: BBBundle_blog_show: pattern: /{id}/{slug} defaults: { _controller: BloggerBlogBundle:Blog:show } requirements: _method: GET id: \d+ 这两个参数都是对象blog的属性 我想设置一个自定义映射器(route generator),以便编写以下内容: {{ path('BBBund

我有一条带有2个参数的路线:

BBBundle_blog_show:
    pattern:  /{id}/{slug}
    defaults: { _controller: BloggerBlogBundle:Blog:show }
    requirements:
        _method: GET
        id: \d+
这两个参数都是对象blog的属性

我想设置一个自定义映射器(route generator),以便编写以下内容:

 {{ path('BBBundle_blog_show', {'blog': blog}) }}
与此相反:

 {{ path('BBBundle_blog_show', {'id':blog.id, 'slug':blog.slug) }}

这就是我最终想到的:

我由自己的生成器基类实现,该基类查找“object”参数并尝试从该对象获取所需的参数


现在我可以写:{{path('BBBundle_blog_show',{'object':blog}}}),它将从对象获取所需的参数(id,slug)。

不久前,我决定因为无法将对象作为路由参数传递而感到恼火。我必须关注路线知识、模板中的确切参数值以及生成这些路线的其他内容

我已经为symfony构建了这个捆绑包,它允许您使用和扩展此功能(symfony 2.7及更高版本)。请看一看:。它也可以在PackageGist上作为iltar/http捆绑包提供

这个包最好的地方是,您不需要使用其他路由器对象或生成器。它只是打开捆绑包,如果默认设置不符合您的偏好,您可以根据需要调整配置。自述文件应该解释你需要知道的一切,但这里有一个片段:

旧式:

/**
 * @Route("/profile/{user}/", name="app.view-profile")
 */
public function viewProfileAction(AppUser $user);

// php
$router->generate('app.view-profile', ['user' => $user->getId()]);

// twig
{{ path('app.view-profile', { 'user': user.id }) }}
{{ path('app.view-profile', { 'user': user.getid }) }}
{{ path('app.view-profile', { 'user': user.getId() }) }}
{{ path('app.view-profile', { 'user': user[id] }) }}
新样式:

// php
$router->generate('app.view-profile', ['user' => $user]);

// twig
{{ path('app.view-profile', { 'user' : user }) }}

我很想看到这个(当然会清理一下我的代码),但据我所知这是不可能的。你能分享你的路由配置吗?你是说routing.yml吗?这与沙盒项目中的相同。我在这里扩展了这个答案:,您现在可以只传递对象而不是数组,即
路径('route',entity)
(应该是BC)。此外,在检查匹配的密钥后,路由器将通过
\uuu
分解密钥以检查跨关系,即
父级\u slug
将解析为
$object->getParent()->getSlug()
。请检查我的答案,以获得更易于维护的解决方案。
/**
 * @Route("/profile/{user}/", name="app.view-profile")
 */
public function viewProfileAction(AppUser $user);

// php
$router->generate('app.view-profile', ['user' => $user->getId()]);

// twig
{{ path('app.view-profile', { 'user': user.id }) }}
{{ path('app.view-profile', { 'user': user.getid }) }}
{{ path('app.view-profile', { 'user': user.getId() }) }}
{{ path('app.view-profile', { 'user': user[id] }) }}
// php
$router->generate('app.view-profile', ['user' => $user]);

// twig
{{ path('app.view-profile', { 'user' : user }) }}