Tìm hiểu Mô hình MVC với PHP (Phần 2)

Chào mừng bạn đến phần 2 của bài viết Tìm hiểu Mô hình MVC với PHP.. Nếu bạn đi thẳng vào bài viết này mà chưa đọc qua bài Tìm hiểu mô hình MVC với PHP (Phần 1), thì mình khuyến nghị bạn nên quay trở lại và đọc kỹ lại để đảm bảo rằng bạn hiểu kỹ về những điều cơ bản của mô hình MVC trước khi chúng ta tiếp tục với bài này.


OK!


Bây giờ thì hãy tiếp tục nào.


Tìm hiểu Mô hình MVC với PHP (Phần 2)

Tìm hiểu Mô hình MVC với PHP (Phần 2)


1. Routing và URLs trong mô hình MVC



Mặc dù về mặt lý thuyết, MVC nên hoạt động hoàn hảo trong tất cả các hình thức, nhưng kết hợp lập trình theo mô hình MVC trên web bằng PHP có thể hơi khó khăn.


Vấn đề đầu tiên là với định tuyến URL (Routing URL). Định tuyến URL là một khía cạnh không được xem xét khi MVC được sinh ra và do đó, khi Internet phát triển và phát triển cùng với sự mở rộng của công nghệ, chúng ta có thêm những vấn đề.


Vậy chúng ta có những lựa chọn nào để giải quyết vấn đề định tuyến URL?


Một giải pháp là cố gắng ưu tiên mọi URL mà trang web hoặc ứng dụng web của bạn cần, lưu trữ chúng trong bộ lưu trữ cố định cùng với thông tin về Model, View và Contrller nào sẽ tải cho mỗi trang hoặc phần.


Sau đó, hệ thống sẽ nhận được URL do người dùng yêu cầu và tải các thành phần cụ thể được chỉ định cho trang đó và làm việc.


Đây là một giải pháp hoàn toàn khả thi nếu bạn đang tạo một trang web giới thiệu bản thân hoặc một trang web tĩnh, điều này không dành cho các URL động. Ví dụ:


<?php
$page = $_GET['page'];
if (!empty($page)) {

    $data = array(
        'about' => array('model' => 'AboutModel', 'view' => 'AboutView', 'controller' => 'AboutController'),
        'portfolio' => array('model' => 'PortfolioModel', 'view' => 'PortfolioView', 'controller' => 'PortfolioController')
    );

    foreach($data as $key => $components){
        if ($page == $key) {
            $model = $components['model'];
            $view = $components['view'];
            $controller = $components['controller'];
            break;
        }
    }

    if (isset($model)) {
        $m = new $model();
        $c = new $controller($model);
        $v = new $view($model);
        echo $v->output();
    }
}

Các URL của chúng ta sẽ trông như thế này:


example.com/index.php?page=about


Hoặc như thế này:


example.com/index.php?page=portfolio

Ví dụ hệ thống MVC tải Model, View, Controller cụ thể cho trang được yêu cầu. Nếu tham số URL là "about", thì trang About sẽ được hiển thị. Nếu tham số là "portfolio", thì trang Portfolio sẽ được thay thế.


Đây là một ví dụ cơ bản về định tuyến tĩnh (Static Routing), nó rất đơn giản để thiết lập (đi kèm với một số nhược điểm).


Một trong những nhược điểm rõ ràng nhất là thực tế là khả năng mở rộng trở nên khó khăn hơn rất nhiều, vì độ trải rộng của trang web của bạn bị giới hạn trong mảng page được lập trình cứng.


Một tùy chọn khác là mở ra sự phân công của các lớp Model, View và Controller của bạn và để URL xác định các tham số này.


Trong ví dụ định tuyến tĩnh, chúng ta chỉ cần lấy định danh class từ một mảng, lần lượt đóng vai trò là dữ liệu định tuyến đến từ bộ lưu trữ cố định của chúng ta.


Thay thế mảng bằng các phần tử định tuyến tĩnh của chúng ta thành định tuyến động.


Mặc dù thực tế chúng ta đã rút một key cho mỗi liên kết trong mảng bằng một biến URL, các mối quan hệ với các class tương ứng đã được xác định trước.


Chúng ta không thể trộn lẫn và kết hợp giữa các value trong mỗi key với định tuyến tĩnh. Nhưng tại sao chúng ta lại muốn làm điều này?


Để bắt đầu tốt, chúng ta sẽ không thể lập trình cứng từng phần trong hệ thống của mình. Chúng ta có thể tạo các phần hoặc trang chỉ bằng cách tạo mối quan hệ Model, View, Controller.


Ví dụ:


<?php
$model = $_GET['model'];
$view = $_GET['view'];
$controller = $_GET['controller'];
$action = $_GET['action'];

if (!(empty($model) || empty($view) || empty($controller) || empty($action))) {
    $m = new $model();
    $c = new $controller($m, $action);
    $v = new $view($m);
    echo $v->output();
}

URL mới của chúng ta bây giờ sẽ trông giống như sau:


example.com/index.php?controller=controllername↦model=modelname&view=viewname&action=actionname


Biến URL action cho hệ thống biết chức năng nào trong Controller sẽ thực thi. Điều quan trọng cần nhớ là khi chức năng này truyền dữ liệu cho Model, nó sẽ chuyển một phần dữ liệu cho Model sẽ lần lượt cho biết View và View Action nào sẽ tải.


Đây có thể là biến URL action, nhưng nó cũng thể tách rời hoặc dữ liệu được Controller thu thập. Hãy nhớ không bao giờ cho phép Controller tải hoặc truyền trực tiếp dữ liệu vào View. Nó chỉ cần tương tác với Model và đầu vào của User.


Cả hai phương thức đều có ưu và nhược điểm, với định tuyến tĩnh ổn định hơn, thực hiện nhanh hơn và cho phép các lập trình viên kiểm soát hệ thống nhiều hơn và với định tuyến động cho phép chúng ta tạo ra một hệ thống hiệu quả hơn, nơi có tiềm năng lớn về khả năng mở rộng và tính di động.


Tuy nhiên, định tuyến động có thể đặt nhiều trách nhiệm lên Controller hơn định tuyến tĩnh, có thể được xem là thay đổi mô hình MVC truyền thống.


Tuy nhiên, nếu định tuyến động được triển khai chính xác và hiệu quả, nó sẽ tốt hơn nhiều so với định tuyến tĩnh.


Thêm Front Controller sẽ cho phép hệ thống của bạn tải động các phần, tùy thuộc vào những gì bạn muốn nó tải.


Mình thực sự khuyên bạn nên tìm hiểu thêm về cách sử dụng Front Controlers với các thành phần MVC.


2. Nguyên tắc DRY và Template



Một trong những lý do chính của mình khi sử dụng mô hình MVC là nhằm mục đích làm cho hệ thống tổng thể của bạn được tổ chức tốt nhất có thể.


Cách rõ ràng nhất để làm điều này là giảm khả năng có code trùng lặp. Bất kỳ một lập trình viên nào cũng đồng ý rằng điều tồi tệ nhất là việc tìm thấy code trùng lặp trong chương trình của họ.


Việc giữ cho code của bạn được sắp xếp hợp lý và sử dụng các thành phần có thể tái sử dụng càng nhiều càng tốt được gọi là nguyên tắc DRY ​​- Don't Repeat Yourself


Mục đích của DRY là giúp các lập trình viên có thể làm cho hệ thống của họ trở nên linh hoạt và tối ưu hóa nhất có thể.


Nguyên tắc DRY ngụ ý rằng, nếu bạn cần viết cùng một đoạn mã ở nhiều nơi, thay vì lặp lại mã ở những nơi này, hãy tạo ra một phương thức riêng và sử dụng nó bất cứ khi nào cần thiết.


Điều này cho phép hệ thống trở nên tối ưu hơn và giúp cải thiện runtime tổng thể.


Việc triển khai đúng DRY sẽ ngụ ý rằng việc thay đổi một yếu tố của hệ thống không thay đổi các yếu tố không liên quan, điều này làm cho DRY trở thành một nguyên tắc quan trọng khi lập trình với Mô hình MVC.


Template.



Từ mẫu "Template", có thể đặt ra một số câu hỏi cho những người đã thấy các Web Framework MVC trước đây, vì hầu hết mọi người gộp phần Template trong View.


Như chúng ta đã thảo luận trước đây, điều này là không chính xác nếu bạn muốn gắn bó với mô hình MVC truyền thống. Lý tưởng nhất là bạn sẽ có View xử lý sau khi nhận dữ liệu từ Model.


Do đó, chỉ có ý nghĩa đối với thành phần View của bạn để chọn một template và truyền dữ liệu từ View vào template đó.


Bằng cách đó, nó đã sẵn sàng để được hiển thị.


Cho dù bạn chọn sử dụng phương pháp nào, điều cần nhớ là dữ liệu của bạn PHẢI ở trạng thái sẵn sàng mà bạn chỉ cần in dữ liệu trong template.


Nếu bạn đang thực hiện xử lý dữ liệu hoặc chọn lọc dữ liệu trong template thì thiết lập của bạn sai và rất có thể, thiết lập MVC là không chính xác.


Dưới đây, một ví dụ nhanh về View của bạn đang tải một template và đẩy dữ liệu tới nó:


<?php
class Model
{
    public $tstring;

    public function __construct(){
        $this->tstring = "The string has been loaded through the template.";
        $this->template = "tpl/template.php";
    }
}

<?php
class View
{
    private $model;

    public function __construct($model) {
        $this->controller = $controller;
        $this->model = $model;
    }

    public function output(){
        $data = "<p>" . $this->model->tstring ."</p>";
        require_once($this->model->template);
    }
}

<!DOCTYPE html>
<html>
 <head>
  <meta charset="charset=utf-8">
  <title>The Template name</title>
 </head>
 <body>
  <h1><?php echo $data; ?></h1>
 </body>
</html>
Ngoài ra, template đang được chuyển qua Model, về nguyên tắc có thể cho phép gán mẫu động tùy thuộc vào việc mỗi View cụ thể được thực hiện.


Phương thức tạo template này cho phép các hệ thống MVC được mở rộng một cách hiệu quả, đồng thời cho chúng ta tùy chọn để phân chia quá trình lập trình Back end khỏi lập trình Front end => Đây là một mục tiêu ban đầu của mô hình MVC.



Bạn đã hiểu về mô hình MVC chưa?



Mô hình MVC thực sự là một cuộc cách mạng khi lần đầu tiên được sử dụng cho lập trình desktop. Nó đã và vẫn là một chủ đề được tranh luận rất nhiều giữa các lập trình viên.


Cuộc tranh luận càng trở nên gay gắt hơn khi bạn lập trình web với PHPsử dụng mô hình MVC. Nhưng đây cũng là một dấu hiệu tốt cho thấy ngày càng có nhiều lập trình viên đang tập trung vào việc cải thiện các quy tắc lập trình PHP.


>> Tham khảo ngay Khóa học lập trình PHP với Mô hình MVChttps://niithanoi.edu.vn/lap-trinh-web-php.html


MVC là một mô hình khuyến khích phân tách giữa các phần xử lý khác nhau và cơ hội phân tách giữa Front end và Backend.


Mình mong muốn bất cứ ai đã làm việc với MVC trước đây, đặc biệt là lập trình PHP, hãy chú ý áp dụng mô hình MVC, nó đã là tiêu chuẩn của bất kỳ website nào.


Biết lập trình theo mô hình MVC cũng là một yêu cầu cần thiết khi đi ứng tuyển các vị trí lập trình PHP. Chúc bạn thành công!
Tìm hiểu Mô hình MVC với PHP (Phần 2) Tìm hiểu Mô hình MVC với PHP (Phần 2) Reviewed by Developer Land on tháng 12 13, 2019 Rating: 5

Không có nhận xét nào:

Được tạo bởi Blogger.