Routing Symfony将两个模型传递给route

Routing Symfony将两个模型传递给route,routing,symfony1,Routing,Symfony1,我有这个路由。yml: post: class: sfDoctrineRouteCollection options: { model: BlogPost } test: url: /company/:company_id//blog/:blog_id class: sfDoctrineMultiRoot param: { module: company, action: show } 我需要这个网址: /公司/24/mycompany/blog/post/13

我有这个路由。yml:

post:
  class:   sfDoctrineRouteCollection
  options: { model: BlogPost }
test:
  url: /company/:company_id//blog/:blog_id
  class: sfDoctrineMultiRoot
  param:   { module: company, action: show }
我需要这个网址: /公司/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的属性?可能吗


非常感谢。

我以前用自定义route类做过,有点像这样:

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

}
url_for('test', array('blog'=>BlogObject, 'company'=>'CompanyObject'));
您可以通过url_为生成url,并将其链接到如下位置:

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

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

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

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


谢谢,但是我需要把这个新的路线类放在哪里?我如何告诉symfony使用它?谢谢。不管你把它放在哪里——symfony的自动加载器会找到它的。我建议在项目的lib文件夹中创建一个名为“route”的文件夹,并将其放入其中(名为sfDoctrineMultiRoot.class.php的文件)。添加文件后,您可能需要清除缓存。这既不是通用的,也不是可扩展的。我支持多目标条令路线的想法,但它应该类似于sfDoctrineRoute,具有指定模型和方法的能力。虽然我同意上面的jeremy的观点,但我碰巧已经有了代码,所以发布它是有帮助的。它可以被整理成通用的等等,也许有一天我会的,但有时它只是需要足够的工作。我写这篇文章的那天就是这样的一天。此外,我相信这比杰里米的解决方案要好,到目前为止,杰里米的解决方案是“从头开始”/咆哮。