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
Puede consultar CakePHP. No sé cuán fácil sería separar la lógica de enrutamiento de URL del resto del marco.
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.
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.
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
código Limonade está aquí: - https://github.com/sofadesign/limonade/blob/master/lib/limonade.php
código Telaraña está aquí: - http://code.google.com/p/cobweb/source/browse/trunk/dispatch/url_resolver.class.php
- Mi código está aquí: - https://code.google.com/p/webgloo/source/browse/trunk/php/lib/Gloo/Core/Router.php
- 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
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.
- 1. Url enrutamiento regex PHP
- 2. URL de enrutamiento en PHP
- 3. Backbone.js Enrutamiento de URL
- 4. Django: ¿Cómo creo un enrutamiento url genérico a las vistas?
- 5. web.sitemap con Dynamic URL (URL Enrutamiento)
- 6. Cómo implementar el enrutamiento de URL en PHP
- 7. Enrutamiento de URL en Java
- 8. Apaches mod_rewrite VS. Enrutamiento PHP?
- 9. Sistema de plantillas tipo Django para Java?
- 10. asp.net HttpHandler personalizado y enrutamiento de URL
- 11. ¿Flask admite expresiones regulares en su enrutamiento de URL?
- 12. PHP url para gama
- 13. Python Selector (biblioteca de enrutamiento de URL), experiencia/opiniones?
- 14. Django url debugger
- 15. Django y apio: problemas de enrutamiento
- 16. ASP.NET MVC enrutamiento/SEO Friendly URL
- 17. Enrutamiento MVC sin controlador en la url
- 18. Enrutamiento vs Url Rewrite (IIS7) Rendimiento
- 19. Enrutamiento url a minúsculas cómo hacerlo?
- 20. .NET MVC enrutamiento w/codificación URL Problemas
- 21. Django: Mejor práctica para URL conf, plantilla de plantilla url
- 22. ¿Es seguro depender de una barra inclinada en una URL para el enrutamiento?
- 23. ¿Se puede utilizar el enrutamiento ASP.NET para crear URL "limpias" para los manejadores .ashx (IHttpHander)?
- 24. $ _GET y reescritura de URL para PHP
- 25. Problemas con las URL de enrutamiento usando CGI y Bottle.py
- 26. ASP .Net MVC enrutamiento: Url únicamente con ID de cadena
- 27. Enrutamiento: ¿Cómo ocultar el nombre de la acción en url?
- 28. Reemplazar el listado de directorios con el enrutamiento MVC URL
- 29. Problema de enrutamiento url AJAX en IIS con directorio virtual
- 30. ASP.NET 4.0 URL de enrutamiento HTTP Error 404.0 - No encontrado
Hmm.ok. Esperaba evitar usar el controlador. – Chantz