Intereting Posts

Маршрутизация CMS в MVC

Я создаю свою собственную структуру MVC в php как средство для изучения более продвинутого программирования. У меня есть фреймворк и работает, однако у меня есть проблема в отношении текущего метода маршрутизации. Я хочу, чтобы фреймворк поддерживал backend cms, чтобы дополнять веб-сайт переднего плана. Проблема в том, что моя структура маршрутизации работает так: mywebsite.com/controller/method/id Механизм маршрутизации сортирует информацию в массив, подобный этому

 segments 0 => controller, 1 => method, 2 => id 

Прямо сейчас, если я посещаю mywebsite.com/projects, он принимает меня к тому, что я создал как страницу администратора. Я не только хочу, чтобы это было доступно только с mywebsite.com/admin/projects, я хочу, чтобы mywebsite.com/projects привлекли меня к интерфейсу.

Поэтому, если я хочу посетить mywebsite.com/projects я бы хотел, чтобы он отобразил «передний» контроллер, нажав «проекты» в этот метод. Если я mywebsite.com/admin/projects я бы хотел, чтобы он загружал контроллер проектов.

Вот текущий класс маршрутизации в целом следующим образом.

 <?php class Request { //url domain.com/controller/method/other //holds url segments 0 => controller, 1 => method, 2 => other, etc public $segments; function __construct() { $this->parse_globals(); } function parse_globals(){ //$uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI'])); $uri = (empty($_GET['rt'])) ? '' : $_GET['rt']; $this->segments = array_filter(explode('/', $uri)); if (in_array("admin", $this->segments)) { array_shift($this->segments); } print_r($this->segments); //remove index php if( reset($this->segments) == 'index.php') { array_shift ($this->segments); } } function controller(){ return $this->segment(0); } function method(){ return $this->segment(1); } function param( $str ){ return isset($_REQUEST[$str]) ? $_REQUEST[$str] : false; } function segment( $no ){ return isset($this->segments[$no]) ? $this->segments[$no] : false; } } 

Вместо того, чтобы просто использовать explode() для разделения сегментов URL-адреса, вы можете использовать набор шаблонов регулярных выражений.

Например, этот следующий patter попытается совместить action firsts, и, если action существует, проверьте, установлен ли перед ним controller :

 '/(:?(:?\/(?P<controller>[^\/\.,;?\n]+))?\/(?P<action>[^\/\.,;?\n]+))?/' 

Большинство фреймворков PHP используют разные способы генерации таких шаблонов с упрощенными обозначениями. Таким образом, вы можете установить, какие части для каждого шаблона являются обязательными и какие необязательные. Также возможно предоставить запасные значения для дополнительных деталей.

Тем не менее …

Прежде чем начинать делать что-то настолько сложное, как cms с фреймворком, вы можете потратить некоторое дополнительное время на исследование ООП. Я бы рекомендовал, по крайней мере, посмотреть лекции от Мишко Хевери и Роберта К. Мартина. Просто потому, что вы думаете, что знаете, как писать класс, не означает, что вы понимаете объектно-ориентированное программирование.

Обновить

В этом ответе я привел несколько материалов. Вы можете найти их полезными,

Кроме того, здесь есть еще две лекции, о которых не было сказано выше:

  • Чистый код I: Аргументы
  • Чистый код III: функции

Я понимаю, что существует три случая маршрутизации:

Основной:

 /<controller>/<action>/<parameters> 

Специальная панель администратора (где «admin» будет своего рода отдельным модулем):

 /<module>/<controller>/<action>/<parameters> 

И, наконец, специальный случай для «/ проектов», который отображается на «/ front / projects».

В этом случае вам необходимо сделать свой класс маршрутизации более гибким, чтобы он мог обрабатывать любую схему маршрутизации. В рамках, таком как Kohana, это будет сделано с такими правилами, как:

 Route::set('adminModule', 'admin/projects') ->defaults(array( 'controller' => 'projects', 'action' => 'admin', )); Route::set('projectPage', 'projects') ->defaults(array( 'controller' => 'front', 'action' => 'projects', )); Route::set('default', '(<controller>(/<id>(/<action>)))') ->defaults(array( 'controller' => 'index', 'action' => 'index', )); по Route::set('adminModule', 'admin/projects') ->defaults(array( 'controller' => 'projects', 'action' => 'admin', )); Route::set('projectPage', 'projects') ->defaults(array( 'controller' => 'front', 'action' => 'projects', )); Route::set('default', '(<controller>(/<id>(/<action>)))') ->defaults(array( 'controller' => 'index', 'action' => 'index', )); по Route::set('adminModule', 'admin/projects') ->defaults(array( 'controller' => 'projects', 'action' => 'admin', )); Route::set('projectPage', 'projects') ->defaults(array( 'controller' => 'front', 'action' => 'projects', )); Route::set('default', '(<controller>(/<id>(/<action>)))') ->defaults(array( 'controller' => 'index', 'action' => 'index', )); по Route::set('adminModule', 'admin/projects') ->defaults(array( 'controller' => 'projects', 'action' => 'admin', )); Route::set('projectPage', 'projects') ->defaults(array( 'controller' => 'front', 'action' => 'projects', )); Route::set('default', '(<controller>(/<id>(/<action>)))') ->defaults(array( 'controller' => 'index', 'action' => 'index', )); 

Очевидно, это просто пример, но вы поняли эту идею. В принципе, вы хотите обеспечить разумную маршрутизацию по умолчанию (например, controller / action / id), но вы также должны позволить пользователям настраивать другие маршруты.

В настоящее время я разрабатываю php-маршрутизатор, который нацелен на чрезвычайно высокую производительность . вы, вероятно, захотите взглянуть.

https://github.com/c9s/Pux

Мы также предоставляем компилятор шаблонов, который делает то же, что и ваш. но вы можете написать более простой путь вместо сложных шаблонов.

например, вы можете написать что-то вроде этого:

  /product/:id/:name [ id => '\d+', name => '\w+' ] 

FYI:

Pux на 48,5 раз быстрее, чем маршрутизатор Symfony при отправке статических маршрутов, в 31 раз быстрее в диспетчеризации регулярных выражений. (с установленным расширением pux)

Pux пытается не использовать время вычислений для динамического построения всех маршрутов (например, Symfony / Routing). Вместо этого Pux компилирует ваши маршруты в простой массив PHP для кэширования, скомпилированные маршруты могут быть загружены из кеша очень быстро.

С поддержкой Pux PHP Extension вы можете загружать и отправлять маршруты в 1,5-2 раза быстрее, чем чистый PHP Pux.