Различные уровни URL с маршрутами CakePHP

У меня есть сайт, который должен разрешить несколько структур 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 файл, но я не могу определить, как это сделать.

2

Решение

Я использовал этот подход в веб-приложении farm.ba (не более поддерживается владельцем).

Что я сделал:

  • Создайте таблицу «узлов» с полями id, slug, model, foreign_key, type, ..
  • Создать собственный маршрут (1), (2) класс, который обрабатывает модель Node
  • После сохранения записи, хранения и кэширования слагов в Node Model
  • После удаления записи удалите кеш и записи узла

Это работает так же, как 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;

Я надеюсь, что это полезно.

0

Другие решения

Создание маршрута для каждого случая выглядит следующим образом:

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;
}

Запомните регулярное выражение в маршрутах и ​​внесите изменения, соответствующие вашим входящим данным.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector