Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: разобрать правило для роутера
 
 автор: DEM   (18.02.2013 в 20:14)   письмо автору
 
 

Делаю свой роутер и хочу сделать как в ZEND`e. То есть что бы он разбирал УРЛ вида
"login/auth/:login" (который для пользователя будет выглядеть, к примеру, login/auth/DEM)
И что бы он вместо :login воспринимал как КАКОЕ-ТО значение и помещал его в массив, что бы потом к нему можно было обратиться

  Ответить  
 
 автор: psychomc   (18.02.2013 в 20:46)   письмо автору
 
   для: DEM   (18.02.2013 в 20:14)
 

И что, никаких идей? Придумайте интерфейс и программируйте на его основе. Подсказка, нужно парсить request_uri. Начните с обрезки лишних слешей, разберите парты в массив по слешу и напишите функцию, которая будет определять статический это парт или динамический. И нужна гибкая архитектура, чтобы были разные типы маршрутов

Надеюсь что делать с htaccess понятно

  Ответить  
 
 автор: DEM   (18.02.2013 в 23:20)   письмо автору
 
   для: psychomc   (18.02.2013 в 20:46)
 

Это уже всё есть. Он всё парсит и прочее-прочее, но я не знаю как лучше сделать, что бы такие ключи, как ":login" считались переменной. Потому что писать (\d+) как-то некрасиво :)

Сейчас у меня стоит preg_match, но то, как я думаю можно сделать, выглядит по другому (просто через explode разбиваем строку с условием и введёную строку и сравнивает их)

  Ответить  
 
 автор: psychomc   (18.02.2013 в 23:55)   письмо автору
 
   для: 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% проектов

  Ответить  
 
 автор: DEM   (19.02.2013 в 00:04)   письмо автору
 
   для: psychomc   (18.02.2013 в 23:55)
 

Хм... Спасибо, буду делать :)

  Ответить  
 
 автор: psychomc   (19.02.2013 в 00:10)   письмо автору
 
   для: DEM   (19.02.2013 в 00:04)
 

покажите потом что получится, сам делал то же самое год назад.

  Ответить  
 
 автор: DEM   (20.02.2013 в 08:28)   письмо автору
 
   для: 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;

    }


}

  Ответить  
 
 автор: psychomc   (20.02.2013 в 14:18)   письмо автору
 
   для: 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 (думаю понятно в чем его фишка будет).
возможно я где-то что-то упустил, но надеюсь основная идея ясна.

  Ответить  
 
 автор: DEM   (20.02.2013 в 18:59)   письмо автору
 
   для: 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` идёт проверка на существование такого файла и если его нет - подключать индексные...

  Ответить  
 
 автор: psychomc   (20.02.2013 в 19:22)   письмо автору
 
   для: DEM   (20.02.2013 в 18:59)
 

на мой взгляд это мешанина. но естественно пользоваться этим классом Вам

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования