Zend Framework - Định tuyến
Bản đồ định tuyến Request URIđến phương pháp của bộ điều khiển cụ thể. Trong chương này, chúng ta sẽ xem cách triển khai các tuyến trong Zend Framework.
Nói chung, bất kỳ URI nào cũng có ba phần:
- Phân đoạn tên máy chủ,
- Phân đoạn đường dẫn và
- Phân đoạn truy vấn.
Ví dụ: trong URI / URL - http://www.example.com/index?q=data, www.example.com là Phân đoạn tên máy chủ, index là Phân đoạn Đường dẫn và q=datalà Phân đoạn truy vấn. Nói chung, định tuyến kiểm traPage segmentchống lại một tập hợp các ràng buộc. Nếu bất kỳ ràng buộc nào phù hợp, thì nó trả về một tập hợp các giá trị. Một trong những giá trị chính là bộ điều khiển.
Định tuyến cũng kiểm tra phân đoạn máy chủ lưu trữ, phân đoạn truy vấn, yêu cầu phương thức HTTP, yêu cầu tiêu đề HTTP, v.v., trong một tình huống nhất định.
Route & RouteStack
Route là đối tượng chính trong định tuyến. Zend Framework có giao diện đặc biệt cho đối tượng định tuyến,RouteInterface. Tất cả đối tượng định tuyến cần triển khai RouteInterface. Danh sách đầy đủ của RouteInterface như sau:
namespace Zend\Mvc\Router;
use Zend\Stdlib\RequestInterface as Request;
interface RouteInterface {
public static function factory(array $options = []); public function match(Request $request);
public function assemble(array $params = [], array $options = []);
}
Phương pháp chính là match. Phương thức đối sánh này kiểm tra yêu cầu đã cho so với ràng buộc được xác định trong đó. Nếu tìm thấy bất kỳ kết quả phù hợp nào, nó sẽ trả vềRouteMatchvật. Đối tượng RouteMatch này cung cấp các chi tiết của yêu cầu đã so khớp dưới dạng các tham số. Các tham số này có thể được trích xuất từRouteObject sử dụng getParams phương pháp.
Danh sách đầy đủ của RouteObject như sau:
namespace Zend\Mvc\Router;
class RouteMatch {
public function __construct(array $params); public function setMatchedRouteName($name);
public function getMatchedRouteName();
public function setParam($name, $value);
public function getParams();
public function getParam($name, $default = null);
}
Nói chung, một ứng dụng MVC điển hình có nhiều tuyến đường. Mỗi tuyến đường này sẽ được xử lý theo thứ tự LIFO và một tuyến đường duy nhất sẽ được khớp và trả về. Nếu không có tuyến nào được khớp / trả về, thì ứng dụng sẽ trả về lỗi “Không tìm thấy trang”. Zend Framework cung cấp một giao diện để xử lý các tuyến đường,RouteStackInterface. RouteStackInterface này có tùy chọn thêm / bớt các tuyến đường.
Danh sách đầy đủ của RouteStackInterface như sau:
namespace Zend\Mvc\Router;
interface RouteStackInterface extends RouteInterface {
public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes);
public function removeRoute($name); public function setRoutes(array $routes);
}
Zend framework cung cấp hai cách triển khai RouteStack giao diện và chúng như sau:
- SimpleRouteStack
- TreeRouteStack
Loại tuyến đường
Khung công tác Zend cung cấp rất nhiều đối tượng định tuyến được tạo sẵn cho tất cả các tình huống trong không gian tên "Zend \ Mvc \ Router \ Http". Chỉ cần chọn và sử dụng đối tượng định tuyến thích hợp cho tình huống nhất định là đủ.
Các tuyến đường có sẵn như sau:
Hostname - Được sử dụng để khớp với phần máy chủ của URI.
Literal - Được sử dụng để đối sánh URI chính xác.
Method - Được sử dụng để khớp với phương thức HTTP của yêu cầu gửi đến.
Part - Được sử dụng để khớp một phần của đoạn đường dẫn URI bằng cách sử dụng logic tùy chỉnh.
Regex - Được sử dụng để khớp phân đoạn đường dẫn URI bởi Regex Pattern.
Schema - Được sử dụng để khớp với Lược đồ URI như http, https, v.v.
Segment - Được sử dụng để khớp đường dẫn URI bằng cách chia nó thành nhiều đoạn.
Hãy để chúng tôi xem cách viết Route theo nghĩa đen và đoạn được sử dụng phổ biến nhất. Các tuyến thường được chỉ định trong tệp cấu hình của mỗi mô-đun -module.config.php.
Tuyến đường theo nghĩa đen
Thông thường, các tuyến được truy vấn theo thứ tự LIFO. Lộ trình Literal là để thực hiện đối sánh chính xác đường dẫn URI.
Nó được định nghĩa như hình dưới đây -
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
Tuyến đường trên phù hợp với /path trong url yêu cầu và trả về index như là action và IndexController với tư cách là người điều khiển.
Tuyến đường phân đoạn
Một tuyến đường được phân đoạn được sử dụng cho bất cứ khi nào url của bạn được cho là chứa các tham số biến đổi.
Nó được mô tả như dưới đây:
$route = Segment::factory(array(
'route' => '/:controller[/:action]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
),
'defaults' => array(
'controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
Ở đây, Phân đoạn được biểu thị bằng dấu hai chấm và theo sau là các ký tự chữ và số. Nếu bạn giữ một đoạn là tùy chọn thì nó được bao bởi dấu ngoặc. Mỗi phân đoạn có thể có các ràng buộc liên quan đến nó. Mỗi ràng buộc là một biểu thức chính quy.
Định cấu hình tuyến đường trong mô-đun hướng dẫn
Hãy để chúng tôi thêm một tuyến đường phân đoạn trong mô-đun Hướng dẫn của chúng tôi. Cập nhật tệp cấu hình mô-đun hướng dẫn -module.config.php có sẵn tại myapp/module/Tutorial/config.
<?php
namespace Tutorial;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\TutorialController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'tutorial' => [
'type' => Segment::class,
'options' => [
'route' => '/tutorial[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\TutorialController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
],
];
Chúng tôi đã thêm thành công định tuyến cho Tutorialmô-đun. Chúng tôi chỉ chậm một bước trong việc hoàn thành mô-đun Hướng dẫn của chúng tôi. Chúng tôi cần thêmView cho mô-đun của chúng ta, mà chúng ta sẽ tìm hiểu trong chương tiếp theo.