2010-09-27 3 views
2

У меня есть этот routing.yml:Symfony проходят две модели маршрута

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

Мне нужно этот адрес: /компания/24/MyCompany/блог/запись/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? Является ли это возможным?

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

ответ

2

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

<?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_for('test', array('blog'=>BlogObject, 'company'=>'CompanyObject')); 

или

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

И извлекать объекты в действии вы можете позвонить:

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

или

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

Спасибо, но где мне нужно поставить этот новый класс маршрута А как я рассказываю? Symfony использовать его? Благодарю. –

+0

На самом деле неважно, куда вы его положили - автозагрузчик Symfony найдет его. Я бы рекомендовал создать папку в папке lib вашего проекта под названием «route» и поместить ее туда (файл sfDoctrineMultiRoot.class.php). Возможно, вам придется очистить кеш после добавления файла. – benlumley

+1

Это не общий и не расширяемый. Я поддерживаю идею маршрута доктрины с несколькими объектами, но он должен действовать аналогично sfDoctrineRoute, с возможностью указывать модели и методы. –

Смежные вопросы