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();
?>
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
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
đ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