Như bạn có thể mong đợi, có rất nhiều cách để làm điều đó.
Ví dụ, trong Slim Framework, một ví dụ về động cơ định tuyến có thể là folllowing (dựa trên mô hình ${OBJECT}->${REQUEST METHOD}(${PATTERM}, ${CALLBACK})
):
$app->get("/Home", function() {
print('Welcome to the home page');
}
$app->get('/Profile/:memberName', function($memberName) {
print('I\'m viewing ' . $memberName . '\'s profile.');
}
$app->post('/ContactUs', function() {
print('This action will be fired only if a POST request will occure');
}
Vì vậy, các trường hợp khởi tạo ($app
) được một phương pháp cho mỗi phương thức yêu cầu (ví dụ như get, post, put, delete, vv) và lấy một route làm tham số đầu tiên và gọi lại như là tham số thứ hai.
Tuyến đường có thể nhận mã thông báo - thay đổi theo thời gian chạy dựa trên một số dữ liệu (chẳng hạn như tên thành viên, id bài viết, tên vị trí tổ chức hoặc bất kỳ thứ gì - bạn biết, giống như mọi bộ điều khiển định tuyến).
Cá nhân, tôi thực hiện theo cách này nhưng tôi không nghĩ rằng nó sẽ đủ linh hoạt cho một khung công tác nâng cao.
Kể từ khi tôi đang làm việc với ZF và Yii, tôi có một ví dụ về một router tôi đã tạo ra như một phần của một khuôn khổ cho một công ty tôi đang làm việc cho:
Động cơ tuyến đường dựa trên regex (tương tự như @ gradbot) nhưng có cuộc trò chuyện hai chiều, vì vậy nếu một khách hàng của bạn không thể chạy mod_rewrite (trong Apache) hoặc thêm quy tắc viết lại trên máy chủ của họ, họ vẫn có thể sử dụng truyền thống URL có chuỗi truy vấn.
Các tập tin chứa một mảng, mỗi người trong số đó, từng hạng mục tương tự như ví dụ sau:
$_FURLTEMPLATES['login'] = array(
'i' => array(// Input - how the router parse an incomming path into query string params
'pattern' => '@Members/Login/[email protected]',
'matches' => array('Application' => 'Members', 'Module' => 'Login'),
),
'o' => array(// Output - how the router parse a query string into a route
'@Application=Members(&|&)Module=Login/[email protected]' => 'Members/Login/'
)
);
Bạn cũng có thể sử dụng kết hợp phức tạp hơn, chẳng hạn như:
$_FURLTEMPLATES['article'] = array(
'i' => array(
'pattern' => '@CMS/Articles/([\d]+)/[email protected]',
'matches' => array('Application' => "CMS",
'Module' => 'Articles',
'Sector' => 'showArticle',
'ArticleID' => '$1'),
),
'o' => array(
'@Application=CMS(&|&)Module=Articles(&|&)Sector=showArticle(&|&)ArticleID=([\d]+)@' => 'CMS/Articles/$4'
)
);
Điểm mấu chốt , như tôi nghĩ, là khả năng là vô tận, nó chỉ phụ thuộc vào mức độ phức tạp mà bạn muốn khuôn khổ của bạn và những gì bạn muốn làm với nó.
Nếu đó là, ví dụ, chỉ nhằm mục đích trở thành một dịch vụ web hoặc trình bao bọc trang web đơn giản - chỉ cần đi với phong cách viết của khung công cụ mỏng - mã rất dễ dàng và đẹp mắt.
Tuy nhiên, nếu bạn muốn phát triển các trang web phức tạp bằng cách sử dụng nó, tôi nghĩ rằng regex là giải pháp.
Chúc may mắn! :)
Ví dụ thứ hai là rất nhiều những gì tôi thực sự nghĩ đến việc làm ... (kiểu RoR) - Tôi sẽ xem qua mã của bạn. – Mez
Nó rất giống với Django Python. – kta