【问题标题】:symfony 2 routing by modelsymfony 2 按型号路由
【发布时间】:2012-03-15 20:28:22
【问题描述】:

Sf2.0,以标准博客为例。

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})

我在我的所有模板/布局中都使用了这种结构,其中包括帖子列表。如果我想更改 post_show 的路线(比如...添加 Slug 参数 /posts/{id}.{slug}),我将需要更改所有模板。相反,我想通过我的 Post 模型生成路线,例如:

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

问题:如何将这个生成器添加到我的 Post 模型中,我必须“使用...”什么以及如何生成路线?

在我想要放置的模板中:

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

提前致谢。

【问题讨论】:

  • 首先将getUrl放到你的模型中是个坏主意,主要是因为模型应该是相当愚蠢的,不知道如何生成url。一种方法是创建自己的 twig 扩展,它可以在特定类型的任何对象上调用(例如帖子并返回 url。你会做类似{{ post|url }} 的事情在这里阅读关于扩展 twig:kiwwito.com/article/…
  • 我知道如何创建树枝分机。也许,你是对的。我只是尝试创建像 RoR“to_param”这样的东西。我将创建一个 twig ext,我将使用标准的“path”和“url”来代替。
  • 在这种情况下,您可能需要查看 Sluggable 捆绑包。也许这就是你要找的东西:github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/…
  • 我认为这是一个重要的问题。如果我的想法是正确的,在 sf1 中可以将整个对象传递给路由助手并让 symfony 提取参数。因此,最好执行path('DevBlogBundle_post_show',{'post':post})path('DevBlogBundle_post_show',post) 之类的操作并让助手提取必要的属性。但似乎不可能……有什么想法吗?

标签: php symfony routing


【解决方案1】:

好的...到目前为止,仍然没有将实体参数传递给路由器的功能。 room13 的回答是有道理的,但我认为让它更容易:

在 Twig Templates 或 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
  );
}

原因: 如果您的路由参数是新选项出现,只需将其添加到 Entity#toParam 中的一个位置,而不是查找路由使用的位置,并覆盖所有树枝模板。

【讨论】:

  • 我喜欢toParam 的想法。
【解决方案2】:

对这个问题和我之前评论中的想法感到兴奋,我拼凑了一个快速的概念证明,以实现您所要求的。我已经实现了一个可以传递实体和路由名称的树枝函数。该函数执行以下设置来生成 url:

  1. 获取名称指定的路由
  2. 编译路由
  3. 获取路由变量
  4. 循环变量并尝试在实体上调用相应的 getter 以构建 UrlGeneratorInterface 生成路由 url 所需的参数数组
  5. 让symfony的url生成器生成url

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

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);

}

然后您可以在 twig 中使用 {{post|entity_url('DevBlogBundle_post_show')}} 调用该函数。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多