Мне кажется, я знаю, что ты пытаешься сделать. Поправь меня, если я ошибаюсь:
Я создал менеджер проектов для себя, в котором я хотел, чтобы URL были более логичными, поэтому вместо использования чего-то вроде
http://domain.com/project/milestones/add/MyProjectName Я мог бы использовать
http://domain.com/project/MyProjectName/milestones/add
Я добавил пользовательский маршрут в конец (! Важный) моих маршрутов, чтобы он перехватывал все, что не является маршрутом, и рассматривал его как «переменный маршрут».
Router::connect('/project/:project/:controller/:action/*', array(), array('project' => '[a-zA-Z0-9\-]+'));
Какой бы путь вы ни выбрали, это означает, что вы уже (или никогда) не можете иметь контроллер с таким именем, поэтому я считаю хорошей практикой использовать единственное слово вместо множественного числа. (У меня есть Projects Controller, поэтому я использую «project», чтобы избежать конфликта с ним.)
Теперь, чтобы получить доступ к параметру: project в любом месте моего приложения, я использую эту функцию в моем AppController:
function __currentProject(){
// Finding the current Project's Info
if(isset($this->params['project'])){
App::import('Model', 'Project');
$projectNames = new Project;
$projectNames->contain();
$projectInfo = $projectNames->find('first', array('conditions' => array('Project.slug' => $this->params['project'])));
$project_id = $projectInfo['Project']['id'];
$this->set('project_name_for_layout', $projectInfo['Project']['name']);
return $project_id;
}
}
И я использую его в других моих контроллерах:
function overview(){
$this->layout = 'project';
// Getting currentProject id from App Controller
$project_id = parent::__currentProject();
// Finding out what time it is and performing queries based on time.
$nowStamp = time();
$nowDate = date('Y-m-d H:i:s' , $nowStamp);
$twoWeeksFromNow = $nowDate + 1209600;
$lateMilestones = $this->Project->Milestone->find('all', array('conditions'=>array('Milestone.project_id' => $project_id, 'Milestone.complete'=> 0, 'Milestone.duedate <'=> $nowDate)));
$this->set(compact('lateMilestones'));
$currentProject = $this->Project->find('all', array('conditions'=>array('Project.slug' => $this->params['project'])));
$this->set(compact('currentProject'));
}
Для вашего проекта вы можете попробовать использовать маршрут, подобный этому, в конце вашего файла rout.php:
Router::connect('/:groupname/:controller/:action/*', array(), array('groupname' => '[a-zA-Z0-9\-]+'));
// Обратите внимание, что я удалил "/ project" с самого начала. Если вы сначала поставите: groupname, как я делал в последнем примере, у вас будет только одна опция для этих пользовательских URL-маршрутов.
Затем измените другой код в соответствии с вашими потребностями.