【问题标题】:Symfony pass two models to routeSymfony 将两个模型传递给路由
【发布时间】:2011-04-17 17:21:21
【问题描述】:

我有这个 routing.yml:

post:
  class:   sfDoctrineRouteCollection
  options: { model: BlogPost }

我需要这个网址: /company/24/mycompany/blog/post/13.

如何传递给我的路线 2 模型以生成以下路线:

//Test route example
post_show:
  url: /company/:id/:title_slug/blog/post/:post_id
  param:   { module: company, action: show }
  class:   sfDoctrineRoute
  options: { model: MyCompany }

如何在这里描述第二个模型,以获取 URL 的属性?有可能吗?

非常感谢。

【问题讨论】:

    标签: routing symfony1


    【解决方案1】:

    我之前做过,有一个自定义路由类,有点像这样:

    <?php
    
    class sfDoctrineMultiRoot extends sfRequestRoute {
    
      public function matchesUrl($url, $context = array()) {
    
        if (false === $parameters = parent::matchesUrl($url, $context)) {
          return false;
        }
        $company = Doctrine_Core::getTable('Company')
                ->find($parameters['company_id']);
    
        if (!$company) {
          return false;
        }
    
        $blog = Doctrine_Core::getTable('Blog')
                ->find($parameters['blog_id']);
    
        if (!$blog) {
          return false;
        }
    
        $this->company = $company;
        $this->blog = $blog;
    
        return $parameters;
      }
    
      public function getCompany() {
        return $this->company;
      }
    
      public function getBlog() {
        return $this->blog;
      }
    
    
      public function generate($params, $context = array(), $absolute = false)
      {
    
        foreach ($params as $key=>$param) {
          if (method_exists($param, 'getRawValue')) {
            $params[$key] = $param->getRawValue();
          }
        }
    
        if (isset($params['company']) && $params['company'] instanceof Company) {
          $params['company_id'] = $params['company']->getId();
        }
        unset($params['company']);
    
        if (isset($params['blog']) && $params['blog'] instanceof Blog) {
          $params['blog_id'] = $params['blog']->getId();
          unset($params['blog']);
        }
        unset($params['blog']);
    
        return parent::generate($params, $context, $absolute);
      }
    
    }
    

    你必须在 routing.yml 中使用这样的东西:

    test:
      url: /company/:company_id//blog/:blog_id
      class: sfDoctrineMultiRoot
      param:   { module: company, action: show }
    

    您可以像这样通过 url_for 和 link_to 生成 url:

    url_for('test', array('blog'=>BlogObject, 'company'=>'CompanyObject'));
    

    url_for('test', array('blog_id'=>1, 'company_id'=>2));
    

    要检索您的操作中的对象,您可以调用:

    $this->getRoute()->getBlog();
    

    $this->getRoute()->getCompany();
    

    【讨论】:

    • 谢谢,但是我需要把这个新的路由类放在哪里?我如何告诉 symfony 使用它?谢谢。
    • 把它放在哪里并不重要——symfony 的自动加载器会找到它。我建议在项目的 lib 文件夹中创建一个名为“route”的文件夹并将其放入其中(名为 sfDoctrineMultiRoot.class.php 的文件)。添加文件后,您可能需要清除缓存。
    • 这既不是通用的也不是可扩展的。我支持多对象学说路线的想法,但它的作用应该类似于 sfDoctrineRoute,具有指定模型和方法的能力。
    • 虽然我同意上面的 jeremy - 我碰巧已经有代码,所以发布它是有帮助的。它可以被整理成通用等,也许有一天我会,但有时它只需要足够工作即可。我写这篇文章的那一天就是这些日子之一。此外,我相信它比 jeremy 的解决方案更好,到目前为止,它是“从头开始”。 /咆哮。
    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 2022-01-17
    • 2015-01-10
    • 2016-09-08
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多