2011-08-11 22 views
6

Tôi mới tham gia MVC vì vậy đây là lần thử đầu tiên của tôi và tôi chắc chắn các bạn có thể cải thiện điều này, cảm ơn mọi lời khuyên hoặc trợ giúp!Đây có phải là cách hay để kết hợp URI với lớp/phương pháp trong PHP cho MVC

Dưới đây là những gì tôi đã đưa ra cho một hệ thống router/dispatcher cho khuôn khổ cá nhân của tôi Tôi đang làm việc trên, nó là nỗ lực đầu tiên của tôi trong việc sử dụng mô hình MVC.

Khối mã đầu tiên chỉ là tệp .htaccess định tuyến tất cả yêu cầu thông qua tệp index.php của tôi.

Khối thứ hai của mã là mảng "Tuyến đường" của tôi sẽ cho đối tượng Router biết, lớp và phương thức nào cần gọi cũng như bất kỳ số ID hoặc phân trang nào nếu chúng tồn tại.

Khối thứ ba của mã là lớp bộ định tuyến.

khối thứ tư chỉ đang chạy lớp

Vì vậy, các lớp router có sử dụng regex để phù hợp với URI với một con đường trong bản đồ lộ trình, về mặt lý thuyết, điều này chỉ có vẻ như hiệu suất kém khi có một danh sách các Hơn 50 tuyến đường mà regex phải chạy, tôi có nên thực hiện điều này một cách khác nhau không? Lý do chính tôi sử dụng regex là so khớp số trang và số ID khi chúng tồn tại trong tuyến đường. Ngoài ra xin vui lòng không chỉ cho tôi biết để sử dụng một khuôn khổ, tôi làm điều này để tìm hiểu nó tốt hơn, tôi học tốt hơn theo cách này và chỉ thích không sử dụng một khuôn khổ hiện có tại thời điểm này, tôi đã nghiên cứu tất cả và một số ít phổ biến hơn cho những ý tưởng đã có.

1) Vì vậy, câu hỏi chính, làm bất cứ điều gì chỉ nhìn không đúng?

2) Có cách nào tốt hơn để phát hiện những gì có trong URI hơn là sử dụng regex trên một mảng như tôi đang làm, hãy xem xét nó trên một trang lưu lượng truy cập cao?

3) Vì mọi thứ được định tuyến thông qua tệp index.php với điều này, tôi sẽ xử lý các yêu cầu AJAX như thế nào?

Xin lỗi nếu điều này gây nhầm lẫn, tôi hơi bối rối một chút!


tập tin .htaccess

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?uri=$1 [NC,L,QSA] 

Map mảng()

/** 
* Map URI to class/method and ID and Page numbers 
* Must be an array 
*/ 
$uri_route_map = array( 
    //forums 
    'forums/' => array(
     'controller' => 'forums', 
     'method' => 'index', 
     'id_number' => '', 
     'page_number' => ''), 

    'forums/viewforum/(?<id_number>\d+)' => array(
     'controller' => 'forums', 
     'method' => 'viewforum', 
     'id_number' => isset($id_number), 
     'page_number' => ''), 

    'forums/viewthread/(?<id_number>\d+)' => array(
     'controller' => 'forums', 
     'method' => 'viewthread', 
     'id_number' => isset($id_number), 
     'page_number' => ''), 

    'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => array(
     'controller' => 'forums', 
     'method' => 'viewthread', 
     'id_number' => isset($id_number), 
     'page_number' => isset($page_number)), 

    // user routes 
    // account routes 
    // blog routes 
    // mail routes 
    // various other routes 
); 

Router lớp mà đọc và phù hợp với mảng đồ trên

/** 
* Run URI against our Map array to get class/method/id-page numbers 
*/ 
class Router 
{ 
    private $_controller = ''; 
    private $_method = ''; 
    public $page_number = ''; 
    public $id_number = ''; 

    public function __construct($uri, array $uri_route_map) 
    { 
     foreach ($uri_route_map as $rUri => $rRoute) 
     { 
      if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) 
      { 
       //if page number and ID number in uri then set it locally 
       $this->page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null); 
       $this->id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null); 
       $this->_controller = $rRoute['controller']; 
       $this->_method = $rRoute['method']; 

       // just for debug and testing while working on it/will be removed from final code 
       echo '<hr> $page_number = ' . $this->page_number . '<br><br>'; 
       echo '<hr> $id_number = ' . $this->id_number . '<br><br>'; 
       echo '<hr> $controller = ' . $this->_controller . '<br><br>'; 
       echo '<hr> $method = ' . $this->_method . '<br><br>'; 
       break; 
      }else{ 
       $this->page_number = ''; 
       $this->id_number = ''; 
       $this->_controller = '404'; 
       $this->_method = '404'; 
      } 
     } 
    } 

    public function getController() 
    { 
     return $this->_controller; 
    } 

    public function getMethod() 
    { 
     return $this->_method; 
    } 

    public function getPageNumber() 
    { 
     return $this->page_number; 
    } 

    public function getIDNumber() 
    { 
     return $this->id_number; 
    } 

    /** 
    * Call our class and method from values in the URI 
    */ 
    public function dispatch() 
    { 
     if (file_exists('controller' . $this->_controller . '.php')) 
     { 
      include ('controller' . $this->_controller . '.php'); 
      $controllerName = 'Controller' . $this->_controller; 
      $controller = new $controllerName($this->getIDNumber(),$this->getPageNumber()); 
      $method = $this->_method; 
      if (method_exists($this->_controller, $this->_method)) 
      { 
       return $controller->$method(); 
      } else { 
       // method does not exist 
      } 
     } else { 
      // Controller does not exist 
     } 
    } 

} 

Run nó

/** 
* Testing the class 
*/ 
$uri = isset($_GET['uri']) ? $_GET['uri'] : null; 
$router = new Router($uri, $uri_route_map); 
$router->dispatch(); 

?> 

Trả lời

4

1) Hãy nhìn tôi. Mã trông hơi lộn xộn một chút.

2) Có cách nào tốt hơn. Bạn đang thực hiện regex bởi vì bạn muốn khớp các phần của URL mà bạn không biết. Tại sao không làm $parts = explode("/", $uri) sau đó xem liệu bạn có thể tìm thấy trang bạn đang tìm kiếm không? Bạn sẽ cần phải xác định có bao nhiêu thông số bạn đang mong đợi cho mỗi trang hoặc bạn sẽ không biết có chọn forums với thông số array("viewform", 123) hoặc forums/viewforum với thông số array(123) hay không.

explode cảm thấy tải tốt hơn so với regex. Nó cũng cho biết thêm lợi ích của việc xử lý lỗi được cải thiện. Điều gì sẽ xảy ra nếu đối số được chuyển đến viewforum không phải là một số? Chắc chắn bạn có thể làm tốt hơn "404";)

3) Tạo trình xử lý ajax riêng biệt. Tuy nhiên, Ajax bị ẩn khỏi chế độ xem nên bạn không cần phải bận tâm đến việc cung cấp các URL ngữ nghĩa.

Ví dụ:

function find_route($parts) { 
    foreach ($uri_route_map as $route => $route_data) { 
     $route_check = implode("/", array_slice($parts, 0, count($parts) - $route_data['num_arguments'])); 
     if ($route_check === $route) { 
      return $route_data; 
     } 
    } 
    throw new Exception("404?"); 
} 

$uri = "forum/viewforum/522"; 

$parts = explode("/", $uri); 
$route = find_route($parts); 
$arguments = array_slice($parts, count($parts) - $route['num_arguments']); 

$controller = $rRoute['controller']; 
$method = $rRoute['method']; 
$controller_instance = new $controller(); 
call_user_func_array(array($controller_instance, $method), $arguments); 

(chưa được kiểm tra)

Plugins

Do $ uri_route_map bạn có thể không phải là 'động' đăng ký thêm plugin hoặc các trang hoặc 'đường'. Tôi sẽ thêm một hàm để thêm nhiều tuyến động hơn vào Router. Ngoài ra, bạn có thể xem xét một số lược đồ tự động khám phá, ví dụ, sẽ kiểm tra thư mục plugins/ cho các thư mục có tệp gọi là "manifest.php", khi được gọi, sẽ tùy ý thêm nhiều tuyến vào Bộ định tuyến.

+0

Cảm ơn bạn đã nhập nỗ lực trước đó của mình, thực sự đã sử dụng phương thức phát nhưng sau đó tôi nhận ra rằng tôi cần kiểm tra số trang nếu chúng tồn tại và số id nếu chúng tồn tại. Tôi không chắc chắn làm thế nào tôi sẽ sử dụng phát nổ và vẫn có thể kiểm tra số trang và số id – JasonDavis

+0

Tôi đã thêm một ví dụ. Điều này được các đối số như một danh sách, bạn có thể chọn để đặt tên cho chúng nếu bạn muốn nhưng tôi không nghĩ rằng bạn cần. – Halcyon

+0

điều này có vẻ thú vị, tôi đang cố gắng lấy ví dụ để làm việc, bạn có thể giúp gỡ lỗi nó để tôi có thể xem nó hoạt động như thế nào, $ uri_route_map không được đọc bởi hàm để bắt đầu, cảm ơn sự giúp đỡ này ở xa – JasonDavis

4

1), 2) Tôi không nghĩ rằng đó là ý tưởng tốt để đặt id_number và page_number trong Router, bởi vì trong tương lai bạn có thể gặp phải nhiều tham số khác cho url. Tốt hơn chỉ cần sử dụng điều khiển và phương pháp và xác định trong bộ điều khiển phải làm gì với các thông số khác hoặc tạo lớp khác Yêu cầu giao dịch với thông tin yêu cầu.

3) Đối với url sử dụng ajax như ajax/module/action. Và tạo bộ điều khiển ajax làm công cụ bảo mật cơ bản ajax, như kiểm tra XSRF và sau đó quyết định bộ điều khiển nào cần chạy và hành động để gọi.

2

1) & 2) Tôi sẽ không nói, điều đó không đúng nhưng tại sao không sử dụng các tuyến mặc định? Hầu hết thời gian một con đường như

controller/action/param1/param2

là tốt enought cho đa số trang của bạn.

Bạn có thể có thể làm điều gì đó như thế để xác định các tuyến đường mặc định:

$this->controller = 'index'; 
$this->action = 'index'; 

private function getDefaultRoutes() 
{ 
    $url = $_SERVER['REQUEST_URI']; 
    $tabUrl = explode('/',$url); 


    if(!empty($tabUrl)) 
    { 
     $this->controller = array_shift($tabUrl); 
     $this->action = array_shift($tabUrl); 
     $this->params = $tabUrl; 
    } 
} 

Và sau đó nếu bạn cần các tuyến đường cụ thể hơn, bạn có thể xác định chúng trong một mảng hoặc bất cứ điều gì bạn muốn. Trong bộ định tuyến của bạn, bạn chỉ cần kiểm tra xem URI hiện tại có khớp với một tuyến đường cụ thể hoặc các tuyến mặc định hay không. Bằng cách đó, bạn sẽ giảm số tuyến đường để phù hợp và tăng tốc độ của bộ định tuyến.

3) Bộ định tuyến của bạn có thể được lập chỉ mục bởi chỉ mục của bạn, không có chỉ mục không có gốc, vì vậy rất tiếc bạn có thể không tránh sử dụng nó. Đó là lý do tại sao việc tránh hành động tốn kém trong chỉ mục của bạn rất quan trọng. Thông thường, không bắt đầu kết nối cơ sở dữ liệu của bạn trong chỉ mục nếu tất cả các trang của bạn không cần đến nó.

Cũng xin đừng chỉ nói với tôi để sử dụng một khuôn khổ

Đừng quên để tải về một số khuôn khổ nổi tiếng và tìm kiếm mã của họ. Đó là cách tốt hơn để học. Bằng cách đó, bạn có thể sẽ tìm thấy rất nhiều thực hành và câu trả lời tốt.

1

1) Có hoạt động không? Nếu có, thì có. Kể từ khi mã trên chỉ chứa mảng, regex và xác nhận cho rằng, tôi không nghĩ rằng theres một vấn đề (s) với mã của bạn. Miễn là nó hoạt động. Nhưng nếu bạn hỏi, 'mã đó có thể mở rộng không?' thì câu trả lời sẽ khác nhau, và tất cả đều phụ thuộc vào mục đích MVC Framework của bạn (ví dụ, đó là khuôn khổ cho việc sử dụng chung, ví dụ: blog, hoặc thuộc tính của nó cho nhà cung cấp API REST. ...)

2) Có. Kohana, Zend, CI và các framework PHP phổ biến khác (và được tối ưu hóa cao) sử dụng (array + regex trên router).

3) Tôi nghĩ bạn chỉ có thể đặt cờ đó trong khối/phần tuyến đường và làm cho cờ đó có sẵn dưới dạng biến toàn cục. Vì vậy, trong bộ điều khiển, bạn có thể quyết định phản hồi nào gửi cho loại yêu cầu khác nhau (ajax/non-ajax) bằng cách kiểm tra cờ đó (ví dụ bạn có thể cung cấp $this->is_ajax làm phương thức toàn cầu có sẵn trong phạm vi Bộ điều khiển).

2

1) Vì vậy, câu hỏi chính, làm bất cứ điều gì chỉ nhìn không đúng?

Cá nhân, tôi thấy điều này trở nên phức tạp hơn khi trang web của bạn phát triển. Một khung MVC, như tôi đã dạy, nên khá nhiều "Đặt nó và quên nó" - bạn đang tách trình xử lý yêu cầu (bộ điều khiển) khỏi truy vấn cơ sở dữ liệu và kết thúc kinh doanh (mô hình) và từ các phần tử hiển thị (xem).

[NB: Bạn có thể cần các khía cạnh cốt lõi khác. Khung tiêu chuẩn của tôi bao gồm một số phần tử cốt lõi mang phiên thông qua các phần khác nhau, cũng như xử lý các khía cạnh cơ bản của công việc trang web - Ví dụ, trong khi các mô hình chịu trách nhiệm thực hiện các cuộc gọi cơ sở dữ liệu đúng theo chỉ dẫn của bộ điều khiển, chức năng trong một tập tin sql.class.php cung cấp cho tôi một tập hợp các phương pháp chuẩn hóa để thực hiện các cuộc gọi đó và phân phối hoặc lưu vào bộ nhớ cache kết quả nếu cần.]

Phương thức gửi của bạn đi đúng hướng với điều này - bạn đang trích xuất từ ​​URI tên của bộ điều khiển (Diễn đàn, Hồ sơ, v.v.). Bạn có cần một bản đồ uri không? Tôi cảm thấy bạn đang tạo ra một tình huống không cần thiết trong đó bạn phải cập nhật bản đồ này mỗi lần, thay vì chỉ đơn giản là tạo một bộ điều khiển mới khi bạn cần chức năng mới và đăng ký nó với cơ sở dữ liệu. Tôi không nói anh sai lầm, tôi không cảm thấy mình đã làm theo cách đó.

2) Có cách nào tốt hơn để phát hiện những gì có trong URI hơn là sử dụng regex trên một mảng như tôi đang làm, hãy xem xét nó trên một trang lưu lượng truy cập cao?

Kiểm soát kết quả (không có ý định chơi chữ, vì đó là bộ điều khiển thực hiện công việc tại đây). Xem xét cách tiếp cận này và xem cách thức hoạt động cho bạn:

Tệp index.php của bạn (còn gọi là "Bộ điều khiển chính") lấy URI và phát tán các giá trị dọc theo "/" thành bit. bit [0] là ID bộ điều khiển - điều này nói "Tôi muốn sử dụng bộ điều khiển có tên bit [0] => giá trị".Này được thực hiện như sau:

require_once(dirname(__FILE__)."/controllers/".$bit[0]."controller.php"); 

Cá nhân, là một chút của một quái gọn gàng khi nói đến cấu trúc thư mục, tôi sử dụng chút [0] để biểu thị các thư mục trong đó controller.php nằm, như tôi có thể có bộ điều khiển phụ.

Đó là tệp bộ điều khiển mà tôi sử dụng để phân tích các bit khác. Đối với điều này, tôi sẽ sử dụng một ví dụ:

Giả sử bit [0] mang giá trị "diễn đàn". Tôi có thể vượt qua, nếu nó được thiết lập, bit [1] để một tuyên bố chuyển đổi. Theo mặc định, tôi luôn muốn liệt kê, nhưng tôi có thể chỉ định nó trực tiếp đến "danh sách", "xem" hoặc "đăng" theo bit [1]. Điều này sẽ cho tôi biết trong lớp điều khiển mà phương thức gọi. Phương pháp sau đó sẽ cho tôi biết để gọi mô hình "diễn đàn" được liên kết nếu tôi cần thực hiện truy vấn và lưu trữ danh sách diễn đàn, chẳng hạn. Các bit "không liên quan" có thể thực hiện một trong hai điều: chúng có thể được chuyển thành các đối số đơn giản cho phương thức như dữ liệu yêu cầu từ mô hình, hoặc bit [1] có thể đủ phức tạp để đảm bảo một bộ điều khiển phụ và các bit tiếp theo sẽ được chuyển tới bộ điều khiển đó để xác định hành động thích hợp, như đã được thực hiện với bộ điều khiển diễn đàn.

Regex, chậm, cần tránh khi có thể. Vì chúng tôi có thể có URI là /forums/view/102305, chúng tôi có thể giả định rằng bộ điều khiển forums sẽ chuyển qua 102305 đến phương pháp được liên kết với đối số view (phương pháp là một cái gì đó như private function displayPost($id) trong đó $id102305). Không cần regex vì chúng ta có thể đơn giản phát nổ các giá trị dọc theo một dấu phân cách dự đoán chung.

3) Vì mọi thứ được định tuyến thông qua tệp index.php với điều này, tôi sẽ xử lý các yêu cầu AJAX như thế nào?

Không quá khó khăn. Nếu bộ điều khiển được đặt thành, nói, AJAX, bạn có thể xây dựng lại URL và truy cập trực tiếp nó. Bạn có thể viết các loại trừ trong tệp .htaccess (RewriteRule ^(AJAX)($|/) - [L]). Hoặc (không lý tưởng, nhưng giải pháp lén lút) là thêm ../ vào AJAX URI của bạn để đẩy URI trở về gốc - nó không còn cố gắng truy cập index.php để quy tắc viết lại không áp dụng.

Sửa

Giả sử rằng chúng ta đang sử dụng một URI của /forums/id-1234/page-4 mỗi ví dụ của bạn. Một lần nữa, chúng ta hãy giả sử như tôi đã đề cập ở trên rằng forums dùng để chỉ bộ điều khiển được sử dụng và mọi đối số phân tách khác (những gì tôi muốn gọi là "khoan xuống") /. Vì vậy, trong tập tin điều khiển diễn đàn của chúng tôi (chúng ta hãy gọi nó forumcontroller.php, chúng tôi có thể có một cái gì đó như thế này (cực kỳ đơn giản) constructor:

// $registry is a class containing fundamental methods, and is meant to exemplify all 
// classes tied to the main controller "index.php". Keep in mind, I'm assuming we've 
// found the right controller by exploding the URI, and passed the remainder as bits 
// to the constructor. 
public function __construct(registry $registry) { 
    $this->registry = $registry; //tying this controller to main controller. 
    // For ease and clarity, we're assuming there's no case in which you wouldn't have 
    // bits set. Error checking is easy. 
    $bits = $this->registry->getURLBits; 
    switch($bits[0]) { 
    case 'view': $this->showForumEntry($bits[1], (isset($bits[2]) ? $bits[2] : ''); break; 
    case 'edit': $this->editForumEntry($bits[1]); break; 
    case 'post': $this->postForumEntry(); break; 
    default: $this->listForumEntries(); break; 
    } 
} 

private function showForumEntry($thread, $offset) { 
    // Because you wanted to prepend id to the id element, we can use this for 
    // cheekiness in the query if our DB is well designed. 
    $data = explode('-', $thread); 
    // Select all from forums where id = 1234 
    $sql = "SELECT * FROM forums WHERE $data[0] = $data[1]"; 
    if($offset != '') { 
    $page = explode('-', $offset); 
    $offset = $page[1] * 25; // Or whatever your max per page is. Make it dynamic. 
    $max = $offset+25; 
    $sql .= " LIMIT $offset, $max"; 
    } 
    // You see where I'm going with this... 
} 

Vấn đề là bạn đang kiểm soát những gì đang được thông qua và làm thế nào nó được Kiểm soát các URI và bạn có thể đơn giản hóa quá trình xử lý của chúng.

Chỉnh sửa 2 Đọc qua một lần nữa, có một vài khái niệm mà tôi nghĩ rằng sẽ giúp bạn và rằng bạn nên làm quen với:

Xem "Nhà máy" mẫu ở đây ($ registry của tôi là, lúc đó là tim, một tập hợp các nhà máy): http://php.net/manual/en/language.oop5.patterns.php

một sự cố tốt của MVC đồ họa: http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/images/mvc3.jpg

Thông tin thêm về các phương pháp Factory: http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/

Một lưu ý khác, và đây là quan sát cá nhân sau khi đã làm việc với Joomla, Drupal, Wordpress và các giải pháp CMS và BBS khác nhau dành cho doanh nghiệp - Chỉ thiết kế với bạn. Khi bạn bắt đầu cố gắng trở thành "điều gì đó dành cho mọi người", bạn sẽ gặp phải rất nhiều bloat không cần thiết đang tải mỗi trang và sử dụng 1 lần trong số 100. MVC là mẫu thiết kế và sử dụng nó làm mẫu sẽ cho bạn biết để loại bỏ sự dư thừa ở mọi khía cạnh, bao gồm cả URI. Đang xử lý /controller/arg1-Identifier/arg2-offset là không cần thiết và bạn có thể dễ dàng lấy đi bằng /controller/id/offset (ví dụ: /forums/1234/4). Nếu bạn muốn làm cho nó thân thiện với SEO, hãy thêm tiêu đề chủ đề chứ không phải thẻ xác định ID (ví dụ: /forums/1234-This-Is-A-Topic/4).

Bây giờ, chúng ta hãy chỉ ra rõ ràng về chỉnh sửa của tôi ở trên - Đây là bộ điều khiển dành riêng cho phần tử diễn đàn. Mỗi phần tử trên trang web của bạn (tức là diễn đàn, thư viện, tiểu sử, v.v.) phải có bộ điều khiển riêng. Tại sao? Bởi vì mỗi người làm những việc hoàn toàn khác nhau trên các trang của nó. Vì vậy, tận dụng điều đó - bạn không cần phải sử dụng bản đồ URI miễn là bạn hiểu rằng bạn đang hướng đến bộ điều khiển và bộ điều khiển ủy quyền trách nhiệm cho mô hình và bất kỳ bộ điều khiển phụ nào có thể cần.

Tôi thực sự hy vọng điều đó sẽ hữu ích.

+0

"Không cần regex vì chúng ta có thể đơn giản phát nổ các giá trị cùng với dấu phân cách dự đoán chung". Tôi hiểu ý của bạn bằng cách đưa nó vào bit, vấn đề của tôi là cho số id và số trang, tôi muốn thực sự có nó trong URI như diễn đàn/xem/id-12345/page-4 và diễn đàn/view/id-12345 vv, vậy bạn có gợi ý nào về việc kết hợp những trường hợp này không? Tôi biết mã hiện tại của tôi có thể được cập nhật để chỉ chạy regex nếu nói bit ['2'] hoặc bit ['3'] tồn tại và điều đó sẽ cắt giảm một số regex đang chạy nhưng có thể có cách nhanh hơn – JasonDavis

+0

cũng bản đồ uri là thứ mà tôi sẽ giữ trong vùng cài đặt/cấu hình để nó không nằm trong mã chính và tôi có thể phát hiện 404 trang và easiar như vậy, tôi nghĩ, bây giờ chỉ là một ý tưởng cho dù là – JasonDavis

+0

bạn luôn biết số lượng đối số được chuyển. Với một diễn đàn, bạn đang nói với nó bộ điều khiển, lệnh, ID trong một định dạng đã biết, và tùy chọn trang. Tôi sẽ thêm một sửa đổi ở trên để giải thích suy nghĩ của tôi, và làm thế nào tôi sẽ tiếp cận kịch bản đó. – stslavik

1

Nếu tôi có thể thêm vài điểm:

  • Di id_numberpage_number từ router - chỉ cần vượt qua tất cả mọi thứ được đối sánh với một bộ điều khiển, sau khi tất cả, đó là một công việc điều khiển để xử lý dữ liệu đó, không của router là

  • Đừng vượt qua $uri cho một nhà xây dựng, chuyển nó đến một số dispatch() thay thế.

  • Tại sao những người này isset() -s trong $uri_route_map? Rõ ràng là chúng sẽ là false, vì $uri_route_map được xác định trước khi đối tượng được hiển thị trước Router().

  • sẽ khuyên bạn nên thêm logic hơn để phù hợp với thói quen - trong trường hợp hiện tại của bạn sitename/forums sẽ không phù hợp với bất cứ điều gì dẫn đến 404 (không dấu slash)

  • Bạn cũng có thể xác định các thông số mặc định trong $uri_route_map của bạn, và sau đó array_merge họ với các thông số phù hợp. Vì vậy, ví dụ: khi không có số trang nào được chỉ định page_number sẽ bằng 1

  • Nếu bạn lo lắng về hiệu suất trên trang web lưu lượng truy cập cao, bạn có thể lưu vào bộ nhớ cache các tuyến đường. Sau khi tất cả, forums/viewforum/100 sẽ luôn trỏ đến cùng một bộ điều khiển/phương pháp.

Và tại sao bạn lo lắng về việc gửi yêu cầu AJAX tới tệp index.php của mình? Có vấn đề gì với điều đó?

+0

Nếu bạn đang sử dụng AJAX trên trang với các cập nhật gần đây, và nó sử dụng URI cho bản cập nhật, nó sẽ bị chặn bởi mod_rewrite. Bạn có thể giải quyết vấn đề này bằng cách sử dụng một số cách, kể cả sử dụng '$ _GET ['ajax']' thay vì '$ _GET ['uri']' – stslavik

Các vấn đề liên quan