2011-02-09 68 views
5

Tôi đang tìm cách cung cấp định tuyến URL tương tự như một trong Django. Tôi đã xem rất nhiều tài nguyên trực tuyến & Tôi thích cobweb nhưng vấn đề là tôi không muốn sử dụng toàn bộ khung công tác mà tôi chỉ muốn sử dụng logic/mã định tuyến lại URL. Có một nguồn lực tốt cho chỉ logic định tuyến giống như Django?Định tuyến URL giống như Django cho PHP

Trả lời

0

Bạn có thể xem CakePHP. Tôi không biết làm thế nào để kéo logic định tuyến URL ra khỏi phần còn lại của khung công tác.

1

Tôi không nghĩ là chính xác như nhau, nhưng khung công tác Zend có chức năng định tuyến khá gốc mà bạn có thể muốn xem xét. Khung công tác Zend là một khung công tác dựa trên thành phần không ép buộc bạn sử dụng toàn bộ vấn đề. Nhưng tôi nghĩ nếu bạn sử dụng chức năng định tuyến, bạn có thể cũng cần phải sử dụng cơ chế điều khiển của họ vì router được xây dựng trên đầu trang.

+0

Hmm.ok. Tôi đã hy vọng tránh sử dụng bộ điều khiển. – Chantz

7

Điều bạn đang tìm kiếm là một vi phim. Về cơ bản nó chỉ là lớp định tuyến của một khung công tác. Có một số trong số này có sẵn. Những nhìn thú vị với tôi:

Một trong đó thực sự thổi tâm trí của tôi mặc dù đã Silex, mà là dựa trên Symfony2 và đòi hỏi PHP 5.3.

+0

Cảm ơn bạn đã đề xuất. Tôi sẽ kiểm tra tất cả các tùy chọn. – Chantz

+0

Tôi chỉ cần thêm một lưu ý rằng Silex là không ổn định, mà phải được làm rõ. – igorw

3

Tôi đã xem xét định tuyến URL của khung công tác Limonade micro PHP đã đăng câu trả lời bằng cách sử dụng codebase limonade. Tuy nhiên tôi đã quay lại và nhìn vào mã mạng nhện và nó khá đẹp và đẹp. Vì vậy, tôi chỉ lấy URL của Cobweb định tuyến và tái cấu trúc trong OOP PHP5.x để sử dụng trong mã của riêng tôi.

để so sánh xem: - http://docs.djangoproject.com/en/dev/topics/http/urls/ vs http://www.limonade-php.net/README.htm

Từ chối trách nhiệm thông thường được đưa ra

1) Tôi đã không kiểm tra nhiều!

2) Nó có thể không phải tất cả các khả năng định tuyến URL của 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 ; 
    } 

    } 

} 


?> 

Bây giờ, bạn có thể thêm bất kỳ quy tắc để định tuyến bảng khởi tạo. tùy thuộc vào miền + "đường dẫn" nào bạn cung cấp cho bộ định tuyến, bạn sẽ lấy lại chuỗi "bộ điều khiển" cùng với thông số "nhóm được đặt tên" và các thông số phù hợp khác. Tôi không bao gồm logic instantiation lớp cho chuỗi "controller" vì 1) sẽ phức tạp 2) Nếu ý định của bạn là chỉ cần có một định tuyến URL giống như Django thì điều này là đủ tốt.

Tài liệu tham khảo

  1. Limonade đang ở đây: - https://github.com/sofadesign/limonade/blob/master/lib/limonade.php

  2. đang Cobweb là đây: - http://code.google.com/p/cobweb/source/browse/trunk/dispatch/url_resolver.class.php

  3. Mã của tôi là ở đây: - https://code.google.com/p/webgloo/source/browse/trunk/php/lib/Gloo/Core/Router.php
  4. Phiên bản cũ của tôi code: - những gì tôi chỉnh sửa ở đây - được dựa trên limonade và nó đã khá hư hỏng não. Hãy nhìn vào liên kết Limonade ở trên. Tôi đang loại bỏ nó.

Cách sử dụng

$ Router = 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); 

Bạn phải thay đổi tên lớp và bao gồm phụ thuộc nhưng hey, bạn là một lập trình viên; D

0

tôi đã phát triển một khuôn khổ tương tự với CodeIgniter và django nguồn lực, http://williamborba.github.io/willer/quick_start/

Nó vẫn là beta , nhưng tôi dần dần triển khai và cải thiện tệp tin URL.php rất giống với URLS.py django.

Điểm nổi bật khác là các mô hình và ORM giống như django, nhưng với một cái gì đó tương tự như bản ghi hoạt động codeigniter.

Các vấn đề liên quan