2016-09-06 4 views
2

У меня есть сайт, которому необходимо разрешить несколько структур URL. Например:Различные уровни URL-адресов с CakePHP-маршрутами

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, но я не могу определить, в пределах что я могу это сделать.

ответ

0

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

Что я сделал:

  • Создать таблицу "узлы" с полями ID, слизняк, модель, foreign_key, тип ..
  • Создать собственный маршрут (1), (2) класс, который обрабатывает узел модель
  • После сохранения поста, хранения и кэша-слизняка в узле модели
  • После удаления записи, удалить кэш и УЗЕЛ записи

Это работает так же, как WordPress маршрутизация позволяет вводить пользовательский слизняк и т.д.

EDIT:

Создать собственный класс маршрута в App/Lib/Routing/маршрутизатор/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; 
    } 
} 

в routes.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

Любой шанс, что вы помните, что сделал пользовательский маршрут? Я видел Custom Routes как вариант, но я не уверен, как tobuse решить эту проблему. – Dave

+0

Привет @Dave, К сожалению, у меня нет кода вышеупомянутых приложений. Я дам вам идею в моем отредактированном ответе, – Salines

Смежные вопросы