Để lấy Url của các Route trong ứng dụng ZF tìm hiểu hai công cụ:
Url plugin
: được gọi từ ControllerUrl helper
: được gọi từ View
Các sử dụng (cú pháp) Url plugin và Url helper là giống nhau
Cú pháp lấy URL của Route
Cú pháp lấy Url từ controller:
$url = $this->plugin('url')->fromRoute('route-name', $params = [], $options = [], $reuseMatchedParams = false); //hoặc $url = $this->url()->fromRoute('route-name', $params = [], $options = [], $reuseMatchedParams = false);
Cú pháp lấy Url từ View
$url = $this->url('route-name', $params = [], $options = [], $reuseMatchedParams = false);
Giải thích các tham số trong Url plugin và helper
route-name
Là tên của Route bạn định nghĩa trong các Module của ứng dụng. Ví dụ 'product' như ví dụ ở dưới.
$params
Dữ liệu dạng mảng (nếu có), đây chính là mảng tham số chính xác với định nghĩa của Route.
Ví dụ config của module bạn định nghĩa Route như sau:
'product' => array( 'type' => 'Segment', 'options' => array( 'route' => '/product/:action/:id/', 'defaults' => array( 'controller' => 'mycontroller', 'action' => 'detail', ) ), ),
Ta thấy Route có thể có 2 tham số là action và id, vậy params cho Url có thể là:
array('action'=>'delete','id'=>1000)
$options
Option là một mảng (có thể không có - null) chứa các thiết lập thêm. Nó có thể có các tham số định nghĩa trong mảng:
Địa chỉ URL tương đối, tuyệt đối
array('force_canonical' => true,)
Mặc định Url plugin - helper trả về Url tương đối (/url), bằng cách có thêm force_canonical là true vào thì nó trả về địa chỉ tuyệt đối (gồm cả host - dạng http://mydomain.com/url)
Thêm fragment: (/url#fragment)
array('fragment' => 'comments',)
Thêm query vào Url
Ví dụ: /url?page=10&perpage=200
array( 'query' => array( 'page' => 10, 'perpage'=>200 ), )
$reuseMatchedParams
Nếu tham số này là True thì Url sẽ phân tích Url hiện đang truy vấn (url mà controler được gọi) và lấy các tham số của URL điền vào các tham số còn thiếu của Plugin, Helper
Ví dụ bạn đang truy cập /news/details/777
<a href="<?php echo $this->url('news', array('action' => 'edit'), null, true); ?>">Edit Me</a>
Thì nó trả về:
<a href="/news/edit/777">Edit Me</a>
(nó tự lấy 777 là tham số ID vì cùng Route)