Symfony передать две модели на маршрут - PullRequest
2 голосов
/ 27 сентября 2010

У меня есть этот routing.yml:

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

Мне нужен этот URL: /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?Возможно ли это?

Большое спасибо.

1 Ответ

2 голосов
/ 27 сентября 2010

Я делал это раньше, с собственным классом маршрута, примерно так:

<?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 через url_for и link_to следующим образом:

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

или

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

А чтобы получить объекты в вашем действии, вы можете позвонить:

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

или

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