Rewrite Url bằng Zend Router (Zend_Controller_Router_Route_Regex)

Zend Router là một lớp giúp chúng ta có thể rewrite đường dẫn của các ứng dụng  Zend Framework mà không phải biết quá nhiều về htaccess. Trong phần này ZendVN gửi đến bạn một ví dụ đơn giản qua cách sử dụng class Zend_Controller_Router_Route_Regex

URL ban đầu:

http ://abc.com/tintuc/chitiet/id/1/title/lap-trinh-web-chuyen-nghiep 

Tương đương với:

Array
(
        [id] => 1
        [title] => lap-trinhh-web-chuyen-nghiep
        [module] => default
        [controller] => tintuc
        [action] => chitiet
)

URL sau khi rewrite:

http://abc.com/tintuc/chitiet/1-lap-trinhh-web-chuyen-nghiep.html

Bước 1: download cấu hình ứng dụng một module tại

http://www.zend.vn/download/zend-framework/zftutorial.rar

Bước 2: Tạo TintucController và chitietAction() trong tập /application/controllers/TintucController.php có nội dung như sau:

<?php
class TintucController extends Zend_Controller_Action{
   
   public function chitietAction(){

      echo '<pre>';
      print_r($this->_request->getParams());
      echo '</pre>';
      
      $this->_helper->viewRenderer->setNoRender();
   }

}

Bước 3: Tạo tập tin cấu hình routers.ini trong thư mục /application/configs/ với nội dung

[thietlap]
routes.tintuc.type       = "Zend_Controller_Router_Route_Regex"
routes.tintuc.route             = "tintuc/chitiet/(d+)-(.*).html"
routes.tintuc.defaults.module       = "default"
routes.tintuc.defaults.controller    = "tintuc"
routes.tintuc.defaults.action       = "chitiet"
routes.tintuc.map.1             = "id"
routes.tintuc.map.2             = "title"

Bước 4: Load router vào front controller. Mở tập tin Bootstrap.php trong thư mục /application thêm vào nội dung:

 protected function _initFrontController(){
           $front = Zend_Controller_Front::getInstance();       
           $front->addControllerDirectory(APPLICATION_PATH . "/controllers");
           
           $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/routers.ini', 'thietlap');
          $router = new Zend_Controller_Router_Rewrite();
          
          $router = $router->addConfig($config, 'routes');
          
          $front->setRouter($router);
                          
           return $front;
        }

Bước 5: Chạy thử 2 đường dẫn

URL 1: http ://abc.com/tintuc/chitiet/id/1/title/lap-trinh-web-chuyen-nghiep
URL 2:  http://abc.com/tintuc/chitiet/1-lap-trinhh-web-chuyen-nghiep.html

 

avata

bởi Nguyễn Thị Kiều Tâm

Ngày 23/12/2011 vào lúc 15:51:33
cool
avata

bởi nhantam

Ngày 16/02/2012 vào lúc 14:54:54
Tut rất hay, thanks for your share
avata

bởi Đặng Xuân Trường

Ngày 04/03/2012 vào lúc 22:53:11
http://abc.com/tintuc/chitiet/1-lap-trinhh-web-chuyen-nghiep.html
Anh ơi giờ em muốn bỏ số 1 có được không anh
sửa thành
http://abc.com/tintuc/chitiet/lap-trinhh-web-chuyen-nghiep.html
Anh chỉ dùng em
avata

bởi Titanic

Ngày 04/03/2012 vào lúc 23:23:42
nếu bỏ số 1 , thì bạn không get được id.
avata

bởi thanhlong1705

Ngày 05/03/2012 vào lúc 13:47:10
Vận được nhưng khi lấy cách này bạn phải dựa vào name để xác định được phần tử đó thay vì dùng id.
avata

bởi honhatthuc

Ngày 08/03/2012 vào lúc 08:38:53
Mình đã thử cài đặt , nhưng làm hoài ko đc ?
thanhlong1705 . Bạn co thể gửi mình bài hoàn chỉnh cái Tur ở trên đc ko . Đc thì mình cảm ơn nhiều . mail của mình là : hnthuc1990@gmai.com
avata

bởi Thức

Ngày 08/03/2012 vào lúc 09:47:43
Mình đã làm đc rồi .
Bạn cho mình hỏi làm sao để thiết lập trên toàn bộ các Controller của mình thay vì chỉ trong 1 TintucController .
còn 2 dòng này mình chưa hiểu lắm :
routes.tintuc.map.1 = "id"
routes.tintuc.map.2 = "title"

THeo minh hiểu là 2 cái này nó là tên biến của tham số trên Url phải ko ?
avata

bởi thanhlong1705

Ngày 08/03/2012 vào lúc 14:16:02
Mỗi Controller, module có router khác nhau nên không thể gọp chung lại trong 1 lần cấu hình được, khi chúng ta muốn rewrite url bao nhiêu cái thì cấu hình bấy nhiêu lần.

map.1, map.2 là lấy các tham số từ url truyền xuống bạn ak.
avata

bởi Thức

Ngày 08/03/2012 vào lúc 15:02:03
URL 1: http ://abc.com/tintuc/chitiet/id/1/title/lap-trinh-web-chuyen-nghiep

URL 2: http://abc.com/tintuc/chitiet/1-lap-trinhh-web-chuyen-nghiep.html

Ở Url 1 : thì mình echo $this->_request->getParam('id') thì mình sẽ lấy dc giá trị trên Url của id là 1 và title cũng vậy cái này thì ko có gì phải nói cả .
Còn ở Url 2 : thì mình ko thấy cái tham số đâu để lấy . Nếu viết :
URL 2: http://abc.com/tintuc/chitiet
thì kết quả tương đương vậy thì có khác nhau gì đâu ?
avata

bởi thanhlong1705

Ngày 08/03/2012 vào lúc 15:22:20
URL 2: http://abc.com/tintuc/chitiet
thì kết quả tương đương vậy thì có khác nhau gì đâu ?

Vấn đề này là do bạn đã set id,title vào map,1 và map.2 rồi đó nên kết quả ko thay đổi là vậy
avata

bởi ho

Ngày 08/03/2012 vào lúc 15:54:56
thanhlong1705 cho mình nick yahoo di . Nick yahoo cua minh là : hn_thuc
avata

bởi Kas

Ngày 14/04/2012 vào lúc 00:13:11
Tut rất hay, cảm ơn đã chia sẻ.
Bạn cho mình hỏi chút, giờ mình muốn thay đổi một chút như thế này :
[thietlap]
routes.tintuc.type = "Zend_Controller_Router_Route_Regex"
routes.tintuc.route = "tintuc/chitiet/(d+)-(.*).html"
routes.tintuc.defaults.module = "default"
routes.tintuc.defaults.controller = "news"
routes.tintuc.defaults.action = "detail"
routes.tintuc.map.1 = "id"
routes.tintuc.map.2 = "title"

Nhưng khi mình thay đổi như vậy thì nó ko chạy. Vậy mình phải làm sao để set được controller news và action detail với đường dẫn như trên.

Thanks!
avata

bởi Phạm Văn Bình

Ngày 07/05/2012 vào lúc 14:33:40
Có thể ẩn cả tên action trên url đi được không bạn?
avata

bởi Mr.L

Ngày 07/05/2012 vào lúc 17:44:16
Có thể ẩn cả module,controller,action luôn bạn ak, tùy vào cấu hình của bạn thôi
avata

bởi Phạm Văn Bình

Ngày 08/05/2012 vào lúc 14:17:03
Có thể hướng dẫn cụ thể không bạn. Mình cũng có gặp 1 vấn đề nữa là mình dùng hàm $this->url() để tạo liên kết. Ví dụ khi mình viết $this->url(array('action'=>'chitet','controller'=>'tintuc','module'=>'default','id'=>$id,'tieude'=>$tieude)) thì liên kết sẽ hiện kiểu 1 (tức là tintuc/chitiet/id/1/tieude/tieu_de_bai_viet/). Mình muốn hiện kiểu 2 thì phải làm thế nào?