Je l'ai fait avant, avec une classe de route personnalisée, un peu comme ceci:
<?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);
}
}
Vous devez utiliser quelque chose comme ça dans routing.yml:
test:
url: /company/:company_id//blog/:blog_id
class: sfDoctrineMultiRoot
param: { module: company, action: show }
Vous pouvez générer des urls via url_for et link_to comme ceci:
url_for('test', array('blog'=>BlogObject, 'company'=>'CompanyObject'));
ou
url_for('test', array('blog_id'=>1, 'company_id'=>2));
Et pour récupérer les objets dans votre action, vous pouvez appeler:
$this->getRoute()->getBlog();
ou
$this->getRoute()->getCompany();
Merci, mais où je dois mettre cette nouvelle classe d'itinéraire Et comment je dis? symfony pour l'utiliser? Merci. –
Peu importe où vous l'avez mis - le chargeur automatique de symfony le trouvera. Je vous recommande de créer un dossier dans le dossier lib de votre projet appelé "route" et de le placer là (fichier appelé sfDoctrineMultiRoot.class.php). Vous devrez peut-être vider votre cache après avoir ajouté le fichier. – benlumley
Ceci n'est ni générique ni extensible. Je supporte l'idée d'une route de doctrine multi-objets, mais elle devrait agir de manière similaire à sfDoctrineRoute, avec la possibilité de spécifier des modèles et des méthodes. –