我之前做过,有一个自定义路由类,有点像这样:
<?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();