2012-02-25 124 views
2

Sf2.0,例如标准博客。symfony 2按型号路由

代码的routing.yml的:

DevBlogBundle_post_show: 
pattern: /posts/{id} 
defaults: { _controller: "DevBlogBundle:Post:show" } 
requirements: 
    _method: GET 
    id: \d+ 

标准办法,我通过使用生成我的帖子的网址:

path('DevBlogBundle_post_show',{'id':post.id}) 

我用这个CONSTRUTION在我所有的temlates /布局,其中包括职位列表。如果我想改变我的路线post_show(说...添加Slug参数/posts/{id}.{slug}),我将需要改变我所有的temlates。相反,我想我的Post模型,像生成路线:

public function getUrl(){ 
    return $this->generator->generate('DevBlogBundle_post_show',array (...params...));} 

问:我怎样才能得到这台发电机到我的模型后,我有什么“用......”,以及如何生成路线?

在我的模板,我想放置:

<a href="{{ post.getUrl() }}" ...>...</a> 

在此先感谢。

+0

首先,把getUrl放到你的模型中是一个坏主意,主要是因为模型应该是相当愚蠢的,不知道如何生成url。一种方法是创建自己的树枝扩展,它可以在特定类型的任何对象上调用(例如,发布并返回url),您可以像''{{post | url}}那样做''读取关于在这里延伸枝:http://www.kiwwito.com/article/extending-twig-in-symfony-2-add-custom-functions – Sgoettschkes 2012-02-25 18:53:42

+0

我知道如何创建树枝分机。也许,你是对的。 I只是尝试创建像RoR“to_param”这样的句子,我将创建一个树枝分支,我将使用标准的“路径”和“url” – ZloyPotroh 2012-02-25 19:09:18

+0

在这种情况下,您可能需要查看Sluggable包。你正在寻找:https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sluggable.md – Sgoettschkes 2012-02-25 20:32:59

回答

5

由于这个问题以及我之前评论中的想法,我一起入侵了一个概念的快速证明,以实现您在哪里要求的内容。我已经实现了一个可以传递实体和路由名称的小枝函数。该函数如下setps生成的网址:

  1. 按名称
  2. 获取指定的路线编译路线
  3. 获取路线变量
  4. 遍历变量,并尝试在呼叫根据干将实体建立一个由UrlGeneratorInterface需要生成路由URL中的参数数组
  5. 让symfony中的URL生成器生成的URL

然而,这意味着路线参数的命名与实体中的属性完全相同,恕我直言,无论如何这都是一个很好的做法。该代码需要放入一个树枝扩展中,该扩展将服务容器引用注入到容器属性中。

public function generateEntityUrl($entity,$routeName) 
{ 
    $router   = $this->container->get('router'); 
    $generator  = $router->getGenerator(); 
    $collection  = $router->getRouteCollection(); 
    $route   = $collection->get($routeName); 
    $compiledRoute = $route->compile(); 
    $variables  = $compiledRoute->getVariables(); 
    $parameters  = array(); 

    foreach($variables as $var) 
    { 
     $getter = 'get'.ucfirst($var); 
     $parameters[$var]=$entity->$getter(); 
    } 

    return $generator->generate($routeName,$parameters); 

} 

在树枝上,你可以调用函数{{post|entity_url('DevBlogBundle_post_show')}}

但我在问自己,为什么在symfony中还没有实现......或者为什么我还没有找到它。

+0

你可能想看看symfony cmf路由http://symfony.com/doc/master/cmf/getting_started/routing.html - 不完全一样,但也许可以在这里帮助。当然欢迎PR。 – dbu 2013-06-20 15:38:39

1

好的...到目前为止,仍然没有功能可以将实体参数传递给路由器。通过room13 回答是有意义的,但我认为更容易:

在枝杈模板或Haml的(强烈建议,节省您的时间,它会使你快乐:https://github.com/arnaud-lb/MtHamlBundle)等:

{{ path('route_name', entity.toParam()) }} 

而在实体定义如下功能:

public function toParam(){ 

    // maybe some logic.... 

    return array(
    'id' => $this->id, 
    'slug' => $this->getSlug(), 
    .....other needed params 
); 
} 

原因: 如果您的路由参数是新的选择出现了,只是将其添加在一个地方实体#toParam,而不是找到的,被使用过的路线在哪里,并覆盖一ll枝模板。

+0

我喜欢'toParam'的想法。 – eightyfive 2014-03-12 04:54:21