12/08/2018, 15:55

When & How to split your Laravel controllers

Introduction Khi làm việc với các Web-application Framework nói chung và Laravel nói riêng, chắc hẳn bạn đã từng gặp những God Controllers với hàng chục phương thức (tính cả các action chính và các phương thức trợ giúp - helper methods) và kéo dài tới vài trăm dòng lệnh. Dù bạn là người ...

Laravel

Introduction

Khi làm việc với các Web-application Framework nói chung và Laravel nói riêng, chắc hẳn bạn đã từng gặp những God Controllers với hàng chục phương thức (tính cả các action chính và các phương thức trợ giúp - helper methods) và kéo dài tới vài trăm dòng lệnh. Dù bạn là người viết những controllers đó từ những dòng đầu tiên, cũng rất khó để bạn có thể nắm được những gì chúng đang thực hiện sau vài tháng quay lại. Đối với Laravel thì có khá nhiều cách để làm giảm kích thước của controller như service classes, events, repositories, query objects, policies, middlewares,... Tùy thuộc vào độ phức tạp của project mà chúng ta có thể lựa chọn phương pháp phù hợp.

Tuy nhiên trong bài viết này mình sẽ không bàn về những phương pháp trên (trên Viblo đã có rất nhiều bài viết chi tiết về các vấn đề đó). Thay vào đó mình sẽ nói về việc tách các God Controllers thành những controller nhỏ và dễ quản lý hơn. Những dấu hiệu nào cho ta biết chúng ta nên tách các controllers và tách như thế nào cho hợp lý. Có thể vấn đề này khá đơn giản tuy nhiên nếu áp dụng đúng cách thì sẽ mang lại khá nhiều hiệu quả khi dự án ngày một phức tạp hơn.

Trước tiên hãy làm một phép tính đơn giản, bạn hãy mở các file route (routes/web.php, routes/api.php) ra và đếm số lượng các action, số lượng controller và tính toán con số sau:

A/C=Average number of actions per controller=Total number of actionsTotal number of controllersA/C = Average space number space of space actions space per space controller = dfrac{Total space number space of space actions}{Total space number space of space controllers} A/C=Average number of actions per controller=Total number of controllersTotal number of actions

Updated: Bạn có thể sử dụng package này để lấy những số liệu thống kê về codebase hiện tại thay vì làm thủ công: https://github.com/stefanzweifel/laravel-stats

Giả sử con số bạn nhận được lớn hơn 10, điều đó có nghĩa là số lượng controller của bạn quá ít và chúng khá phức tạp. Ngược lại nếu con số này quá nhỏ có nghĩa bạn đang thực hiện những việc không cần thiết và khiến cho codebase quá rời rạc. Mình thấy nếu con số nhận được trong khoảng [4,5][4, 5][4,5] thì bạn đang làm tốt trong việc phân phối logic giữa các controllers. Tất nhiên, con số này không phải là thước đo chuẩn mực, nó chỉ là một con số tham khảo và cho bạn biết rằng bạn có nên thực hiện việc refactor trên các controler hay không mà thôi.

Trong các phần sau của bài viết, mình sẽ trình bày một số trường hợp mà bạn nên thực hiện việc tách controller và những lưu ý khi sử dụng các phương pháp đó. Để thuận tiện, chúng ta sẽ tưởng tượng như mình đang xây dựng một ứng dụng nho nhỏ cho phép hiển thị danh sách các Podcasts (mình rất thích nghe các Podcast về công nghệ             </div>
            
            <div class=

0