2011-02-09 20 views
5

Estoy buscando una manera de proporcionar enrutamiento de URL similar a uno en Django. Miré muchos recursos en línea & Me gustó cobweb pero el problema es que no quiero usar todo el framework. Solo quiero usar el código/lógica de reencaminamiento de URL. ¿Hay un buen recurso para solo la lógica de enrutamiento de URL tipo Django?Enrutamiento de URL tipo Django para PHP

Respuesta

0

Puede consultar CakePHP. No sé cuán fácil sería separar la lógica de enrutamiento de URL del resto del marco.

1

No creo que sea exactamente lo mismo, pero Zend Framework tiene una funcionalidad de enrutamiento de descenso que quizás desee ver. El Zend Framework es una especie de marco basado en componentes que no lo obliga a usar todo el conjunto. Pero creo que si usa la funcionalidad de enrutamiento, es posible que necesite usar también su mecanismo de control ya que el enrutador está construido en la parte superior.

+0

Hmm.ok. Esperaba evitar usar el controlador. – Chantz

7

Lo que está buscando es un microframework. Básicamente es solo la capa de enrutamiento de un marco. Hay varios de estos disponibles. Estos parecía interesante para mí:

el que realmente me voló la cabeza, aunque era Silex, que se basa en Symfony2 y requiere PHP 5.3.

+0

Gracias por la sugerencia. Verificaré todas las opciones. – Chantz

+0

Acabo de agregar una nota de que Silex es inestable, eso tenía que ser aclarado. – igorw

3

He consultado el enrutamiento de URL del marco micro PHP de Limonade publicado una respuesta utilizando la base de código limonade. Sin embargo, volví y miré el código de la telaraña y es bastante bonito y agradable. Así que acabo de tomar el enrutamiento de URL de Cobweb y refactoré eso en OOP PHP5.x para usar en mi propio código.

para la comparación consulte: - http://docs.djangoproject.com/en/dev/topics/http/urls/ vs http://www.limonade-php.net/README.htm

Las renuncias habituales están en su lugar

1) No he probado mucho!

2) Puede que no tenga todas las capacidades de enrutamiento de URL de Django

<?php 

/** 
* 
* @author rajeev jha (jha dot rajeev at gmail) 
* Django style URL routing. 
* Pattern matching logic of this code is copied from cobweb framework 
* @see http://code.google.com/p/cobweb/source/browse/trunk/dispatch/url_resolver.class.php 
* 
*/ 

class Gloo_Core_Router { 

    private $table ; 


    function __construct() { 
    //initialize routing table 
    $this->table = new Gloo_Core_RoutingTable(); 
    } 

    function getRoute($path,$domain=NULL){ 

    if(empty($path)) { 
     $message = sprintf("Please supply a valid path to match :: got [%s] ", $path); 
     trigger_error($message,E_USER_ERROR); 
    } 

    //all rules for this domain 
    $rules = $this->table->getRules($domain);  
    $route = NULL ; 

    if($path == '/') 
     $route = $this->matchHome($rules); 
    else 
     $route = $this->match($rules,$path); 

    return $route ; 

    } 

    private function matchHome($rules) { 
    $route = NULL ; 

    foreach($rules as $rule) { 
     if($rule["pattern"] == '/') { 
     $route = $this->createRoute($rule,array()); 
     } 
    } 

    return $route ; 

    } 

    private function match($rules,$path) { 
    $path = ltrim($path, '/'); 
    $matches = array(); 
    $route = NULL ; 

    foreach($rules as $rule) { 
     if(preg_match($this->patternize($rule["pattern"]),$path,$matches) != 0) { 
     //match happened 
     $matches = $this->sanitizeMatches($matches); 
     $route = $this->createRoute($rule,$matches); 
     } 
    } 

    return $route ; 

    } 

    private function createRoute($rule,$matches) { 

    $route = $rule ; 
    //add parameters 
    $route["params"] = $matches ; 
    return $route ; 
    } 

    private function sanitizeMatches($matches){ 
    //discard the first one 
    if (count($matches) >= 1) 
     $matches = array_splice($matches,1); 

    $unset_next = false; 

    //group name match will create a string key as well as int key 
    // like match["token"] = soemthing and match[1] = something 
    // remove int key when string key is present for same value 

    foreach ($matches as $key => $value) { 
     if (is_string($key)){ 
     $unset_next = true; 
     } else if (is_int($key) && $unset_next) { 
     unset($matches[$key]); 
     $unset_next = false; 
     } 
    } 

    return array_merge($matches); 

    } 

    private function patternize($pattern) { 
    //http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php 
    //treat pattern as UTF-8 
    return '{'.$pattern.'}u' ; 
    } 

} 

?> 


<?php 

/** 
* 
* @author rajeev jha (jha dot rajeev at gmail) 
* Django style URL routing. 
* URL routing table 
* 
*/ 


class Gloo_Core_RoutingTable { 

    private $rules ; 
    private $splrules ; 
    const ANY_DOMAIN = '__ANY__' ; 


    function __construct() { 
    $this->rules = array(); 
    $this->splrules = array(); 

    //@todo inject from outside  
    $this->createRule(self::ANY_DOMAIN, '/', 'Gloo_Controller_Home'); 
    //match alphanumeric + dashes 
    //a pcre word (\w) does not contain dashes 
    $this->createRule(self::ANY_DOMAIN, '^(?P<token>[-\w]+)$','Gloo_Controller_Post'); 
    $this->createRule(self::ANY_DOMAIN, '^page/(?P<pagenum>\d+)$','Gloo_Controller_Home'); 
    $this->createRule(self::ANY_DOMAIN, '^(?P<token>\w+)/page/(?P<pagenum>\d+)$','Gloo_Controller_Post'); 
    $this->createRule(self::ANY_DOMAIN, '^category/(?P<name>\w+)$','Gloo_Controller_Category'); 
    $this->createRule(self::ANY_DOMAIN, '^category/(?P<name>\w+)/page/(?P<pagenum>\d+)$','Gloo_Controller_Category'); 

    //special rules 
    $this->createRule('www.test1.com','^(?P<token>\w+)$','Gloo_Controller_File', array("template" => "post.php")); 

    } 

    function createRule($domain,$pattern,$action,$options=NULL) { 

    if(empty($domain)) { 
     trigger_error("No domain supplied for rule" ,E_USER_ERROR); 
    } 


     $rule = array(); 

    $rule["pattern"] = $pattern; 
    $rule["action"] = $action ; 

     //Add options 

    if(is_null($options)) 
     $rule["options"] = array(); 
    else 
     $rule["options"] = $options ; 

    $rule["domain"] = $domain ; 

    //add to generic or domain specific rules 
    if($domain == self::ANY_DOMAIN) 
     $this->rules[] = $rule ; 
    else 
     $this->splrules[$domain][] = $rule ; 

    } 

    function getRules($domain) { 
    if(empty($domain)) 
     return $this->rules ; 

    //valid domain - rules as well 
    // add to existing rules 

    if(array_key_exists($domain,$this->splrules)) { 
     $splrules = $this->splrules[$domain]; 
     $rules = array_merge($this->rules,$splrules); 
     return $rules ; 

    } else { 
     return $this->rules ; 
    } 

    } 

} 


?> 

Ahora, Usted puede agregar cualquier regla a Tabla de enrutamiento de inicialización. dependiendo del dominio + "ruta" que suministre al enrutador, obtendrá la cadena "controladora" junto con los parámetros del "grupo nombrado" y otros parámetros coincidentes. No incluyo la lógica de creación de instancias de clase para cadenas de "controlador" porque 1) que sería complicado 2) Si su intención es obtener un enrutamiento de URL de Django, esto es suficiente.

Referencias

  1. código Limonade está aquí: - https://github.com/sofadesign/limonade/blob/master/lib/limonade.php

  2. código Telaraña está aquí: - http://code.google.com/p/cobweb/source/browse/trunk/dispatch/url_resolver.class.php

  3. Mi código está aquí: - https://code.google.com/p/webgloo/source/browse/trunk/php/lib/Gloo/Core/Router.php
  4. versión antigua de mi código: - Lo que edité aquí - se basó en Limonade y sufrió daños cerebrales. Siéntase libre de mirar el enlace Limonade arriba. Lo estoy removiendo

Uso

$ enrutador = new Gloo_Core_Router();

$path = 'category/news/page/3' ; 
printf("Now matching path [%s]" , $path); 
$route = $router->getRoute($path); 
print_r($route); 

$path = '/category/Health/page' ; 
printf("Now matching path [%s]" , $path); 
$route = $router->getRoute($path); 
print_r($route); 

usted tiene que cambiar los nombres de las clases e incluyen dependencias pero bueno, usted es un programador; D

0

he desarrollado un marco similar con CodeIgniter y Django recursos, http://williamborba.github.io/willer/quick_start/

Todavía es beta , pero gradualmente estoy implementando y mejorando el archivo URL.php es muy similar a URLS.py django.

Otro punto a destacar son los modelos y el ORM muy parecido a Django, pero con algo similar al registro activo CodeIgniter.

Cuestiones relacionadas