|
|
|
| Делаю свой роутер и хочу сделать как в ZEND`e. То есть что бы он разбирал УРЛ вида
"login/auth/:login" (который для пользователя будет выглядеть, к примеру, login/auth/DEM)
И что бы он вместо :login воспринимал как КАКОЕ-ТО значение и помещал его в массив, что бы потом к нему можно было обратиться | |
|
|
|
|
|
|
|
для: DEM
(18.02.2013 в 20:14)
| | И что, никаких идей? Придумайте интерфейс и программируйте на его основе. Подсказка, нужно парсить request_uri. Начните с обрезки лишних слешей, разберите парты в массив по слешу и напишите функцию, которая будет определять статический это парт или динамический. И нужна гибкая архитектура, чтобы были разные типы маршрутов
Надеюсь что делать с htaccess понятно | |
|
|
|
|
|
|
|
для: psychomc
(18.02.2013 в 20:46)
| | Это уже всё есть. Он всё парсит и прочее-прочее, но я не знаю как лучше сделать, что бы такие ключи, как ":login" считались переменной. Потому что писать (\d+) как-то некрасиво :)
Сейчас у меня стоит preg_match, но то, как я думаю можно сделать, выглядит по другому (просто через explode разбиваем строку с условием и введёную строку и сравнивает их) | |
|
|
|
|
|
|
|
для: DEM
(18.02.2013 в 23:20)
| | вам нужно всего лишь узнать номер парта и ключ (в данном случае 3 login) из маршрута. далее просто берете значения 3 парта из uri и сливаете в массив параметров.
вот же интерфейс
<?php
$route = new Zend_Controller_Router_Route(
'author/:username',
array(
'controller' => 'profile',
'action' => 'userinfo'
),
array('username' => '[a-z]+')
);
$router->addRoute('user', $route);
|
route_regex более гибкий, но и этого вполне достаточно для 99% проектов | |
|
|
|
|
|
|
|
для: psychomc
(18.02.2013 в 23:55)
| | Хм... Спасибо, буду делать :) | |
|
|
|
|
|
|
|
для: DEM
(19.02.2013 в 00:04)
| | покажите потом что получится, сам делал то же самое год назад. | |
|
|
|
|
|
|
|
для: psychomc
(19.02.2013 в 00:10)
| | Получился вот такой вот класс... Есть конечно свои косяки в нём, делал только в свободное время (то что спрашивал сделал этой ночью), но вроде как работает :) Буду рад любому совету
<?php
class Router
{
private $_rout;
private $_controller = "CIndex";
private $_action = "aIndex";
private $_routing = false;
private $_parametrs = array();
private $_pattern = array();
private $_urls = array();
private $_varInUrl = array();
public function __construct($rout){
$this->_rout = trim($rout, "/");
}
public function routing(){
$exp = explode("/", $this->_rout);
$exp[0] = str_replace(".", "", $exp[0]);
$exp[1] = str_replace(".", "", $exp[1]);
$prov = false;
$count_url = count($this->_urls);
for($i=0;$i<$count_url;$i++){
$url = $this->_urls[$i];
if(is_array($this->_varInUrl[$i])){
$url = str_replace(array_keys($this->_varInUrl[$i]), $this->_varInUrl[$i], $url);
}
if(preg_match($url, $this->_rout)){
$prov = true;
$this->_controller = "C".ucfirst($this->_pattern[$i]['controller']);
$this->_action = "a".ucfirst($this->_pattern[$i]['action']);
$this->_parametrs = $this->_pattern[$i];
$url_pattern_exp = explode("/", substr($this->_urls[$i], 1, (strlen(($this->_urls[$i]))-3)));
$rout_exp = explode("/", $this->_rout);
for($j=0;$j<count(($url_pattern_exp));$j++){
if($url_pattern_exp[$j] !== $rout_exp[$j]){
$this->_parametrs[substr($url_pattern_exp[$j], 1)] = $rout_exp[$j];
}
}
break;
}
}
if($prov === false){
if(!empty($exp[0])){
$this->_controller = "C".ucfirst($exp[0]);
}
if(!empty($exp[1])){
$this->_action = "a".ucfirst($exp[1]);
}
for($i=2;$i<count($exp);$i++){
$this->_parametrs[] = $exp[$i];
}
}
$this->_routing = true;
}
public function inc(){
if($this->_routing === false){
$this->routing();
}
if(!empty($this->_controller)){
if(class_exists($this->_controller))
$class = new $this->_controller($this);
else
$class = new CIndex($this);
}
else {
$class = new CIndex($this);
}
$class->init();
$method = $this->_action;
if(!empty($this->_action)){
if(method_exists($class, $method))
$class->$method();
else
$class->aIndex();
}
return $class;
}
public function addRoute($url, $pattern = array(), $var = array()){
$this->_urls[] = "|".$url."|i";
$this->_pattern[] = $pattern;
$this->_varInUrl[] = $var;
}
}
|
| |
|
|
|
|
|
|
|
для: DEM
(20.02.2013 в 08:28)
| | в логику работы функций особо лезть не хочется, хотя на первый взгляд как будто перемудрили. но с архитектурой есть проблемы. расширять класс будет неудобно и некрасиво, если повятся какие-нибудь хитрые, или наоборот, очень простые маршруты, которые будет не возможно или не нужно обрабатывать таким методом. просится еще как минимум 2 класса.
<?php
/*
* Базовый класс маршрута
*/
class route
{
/*
* Здесь какая-то общая предварительная обратка для всех маршрутов
*/
/*
* Это думаю понятно
*/
abstract public function match();
}
/*
* Динамический маршрут
*/
class route_dynamic extends route
{
public function match() {
// реализация для динамического маршрута
// примерно то же самое что в методе routing
}
}
// теперь метод addRoute будет выглядеть примерно вот так
public function addRoute(route $route) {
// ...
}
|
такая архитектура намного более гибкая. можете попробовать ее реализовать и например на ее основе написать класс route_static (думаю понятно в чем его фишка будет).
возможно я где-то что-то упустил, но надеюсь основная идея ясна. | |
|
|
|
|
|
|
|
для: psychomc
(20.02.2013 в 14:18)
| | В методе `routing` в самом конце есть код:
if($prov === false){
if(!empty($exp[0])){
$this->_controller = "C".ucfirst($exp[0]);
}
if(!empty($exp[1])){
$this->_action = "a".ucfirst($exp[1]);
}
for($i=2;$i<count($exp);$i++){
$this->_parametrs[] = $exp[$i];
}
}
|
То есть если будет какой-то пусть, которого нет в правилах, то он просто первую переменную занесёт, как контроллер, вторую - как метод, а остальные в параметры. Ну а если они будут пустые, то в методе `inc` идёт проверка на существование такого файла и если его нет - подключать индексные... | |
|
|
|
|
|
|
|
для: DEM
(20.02.2013 в 18:59)
| | на мой взгляд это мешанина. но естественно пользоваться этим классом Вам | |
|
|
|