У меня есть сайт, который должен разрешить несколько структур URL. Например:
www.examplesite.com/people/add // <-- example company
www.otherexample.com/xyz/people/add // <-- "xyz" company (not location based)
www.otherexample.com/florida/abc/people/add //<-- "abc" company (location based)
Каждый URL должен быть в состоянии определить, какая компания основана на URL.
До сих пор я был в состоянии разобрать URL-адрес просто отлично, чтобы определить, какая это компания, но как мне добавить эти дополнительные /florida/abc/
части к маршрутам, чтобы позволить остальной части приложения работать?
Я пробовал несколько вещей, включая установку переменной в ‘/ florida / abc’ (или что бы то ни было) вверху файла маршрутов, затем добавлял это перед каждым маршрутом, но это не обрабатывает каждый контроллер / действие и кажется очень ударил или пропустить / глючит.
Я также использую admin
префикс, так, например, он также должен работать так:
www.otherexample.com/admin/florida/abc/people/add
Я предполагаю, что мне нужно использовать routes.php
файл, но я не могу определить, как это сделать.
Я использовал этот подход в веб-приложении farm.ba (не более поддерживается владельцем).
Что я сделал:
Это работает так же, как WordPress маршрутизация, позволяет вводить пользовательский слаг и т. Д.
РЕДАКТИРОВАТЬ:
Создайте собственный класс маршрута в App / Lib / Routing / Router / MultiRoute.php, например:
<?php
App::uses('CakeRoute', 'Routing/Route');
/**
* MultiRoute
*/
class MultiRoute extends CakeRoute
{
public function parse($url)
{
// debug($url); '/florida/abc/people/add'
// Add custom params
$params = array(
'location' => null,
'company' => null,
'controller' => 'peoples',
);
$params += parent::parse($url);
// debug($params);
/**
* array(
* 'location' => null,
* 'company' => null,
* 'controller' => 'peoples',
* 'named' => array(),
* 'pass' => array(
* (int) 0 => 'florida', // location
* (int) 1 => 'abc', //company
* (int) 2 => 'people', // controller
* (int) 3 => 'add' // action, default index
* ),
* 'action' => 'index',
* 'plugin' => null
* )
*
*/
// reverse passed params
$pass = array_reverse($params['pass']);
// debug($pass);
/**
* array(
* (int) 0 => 'add',
* (int) 1 => 'people',
* (int) 2 => 'abc',
* (int) 3 => 'florida'
* )
*/
if(isset($pass[3])) { $params['location'] = $pass[3]; }
if(isset($pass[2])) { $params['company'] = $pass[2]; }
// if you need load model and find by slug, etc...
return $params;
}
public function match($url)
{
// implement your code
$params = parent::match($url);
return $params;
}
}
в route.php
App::uses('MultiRoute', 'Lib/Routing/Route');
Router::connect('/admin/*',
array('admin' => true),// we set controller name in MultiRoute class
array('routeClass' => 'MultiRoute')
);
Router::connect('/*',
array(),// we set controller name in MultiRoute class
array('routeClass' => 'MultiRoute')
);
В вашем контроллере найдите результаты, используя дополнительные параметры запроса, например:
$this->request->location;
$this->request->company;
Я надеюсь, что это полезно.
Создание маршрута для каждого случая выглядит следующим образом:
Router::connect('/people/add', array('controller' => 'people', 'action' => 'add'));
Router::connect('/:company/people/add', array('controller' => 'people', 'action' => 'add'), array('pass' => array('company'), 'company' => '[a-z]+'));
Router::connect('/:location/:company/people/add', array('controller' => 'people', 'action' => 'add'), array('pass' => array('company', 'location'), 'company' => '[a-z]+', 'location' => '[a-z]+'));
Тогда контроллер может получить эти значения:
public function add($company = '', $location = '') {
var_dump($company, $location); exit;
}
Запомните регулярное выражение в маршрутах и внесите изменения, соответствующие вашим входящим данным.