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
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.
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.
Đ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.
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
Limonade đang ở đây: - https://github.com/sofadesign/limonade/blob/master/lib/limonade.php
đang Cobweb là đây: - http://code.google.com/p/cobweb/source/browse/trunk/dispatch/url_resolver.class.php
- Mã của tôi là ở đây: - https://code.google.com/p/webgloo/source/browse/trunk/php/lib/Gloo/Core/Router.php
- 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
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.
- 1. TinyURL giống như định tuyến với ASP.NET MVC?
- 2. Hệ thống mẫu giống như Django cho Java?
- 3. django-cms không định tuyến chính xác đến url tĩnh?
- 4. Định tuyến Url để viết thường là như thế nào?
- 5. Cách triển khai định tuyến URL trong PHP
- 6. facebook giống như: url href so với url chuẩn
- 7. Định tuyến URL trong Java
- 8. Giải pháp giống như nội tuyến cho Quản trị Django nơi Quản trị viên chứa ForeignKey sang mô hình khác
- 9. Rails định tuyến như github
- 10. Express JS tuyến đường URL ngược (kiểu Django)
- 11. php jquery giống như công cụ chọn
- 12. Định tuyến URL ASP.NET MVC không cung cấp cho tôi URL đẹp
- 13. Huy hiệu Woot giống như trong PHP
- 14. Định tuyến ngược/tạo URL trong Clojure?
- 15. Định tuyến trong Rails. Chấm trong URL
- 16. Symfony2 dịch URL và định tuyến
- 17. django mẫu url cho% 20
- 18. Giống như Hộp cho Nhóm
- 19. Làm thế nào để xác định xem người dùng Facebook Không giống như một URL?
- 20. Xác định url cơ sở trong bộ định tuyến Backbone.js
- 21. Tạo URL cho các tuyến đường trong Express
- 22. Laravel định tuyến như mã igniter
- 23. Quản trị viên web Sinatra (giống như Quản trị Django)
- 24. Có trình gỡ lỗi URL Google Plus giống như trình gỡ lỗi cho Facebook không?
- 25. Giống như Hashtable V8 cho C#?
- 26. hàng đợi tin nhắn cho iOS/iPad - giống như MSMQ?
- 27. Định tuyến: Cách ẩn tên hành động trong url?
- 28. Bất cứ ai cũng biết một cái gì đó giống như RSPec cho PHP?
- 29. Công cụ tìm kiếm giống như Google trong PHP/mySQL
- 30. Định tuyến URL ASP.NET MVC với nhiều giá trị tuyến đường
Hmm.ok. Tôi đã hy vọng tránh sử dụng bộ điều khiển. – Chantz