Vậy Mô hình MVC là gì? M là Model: cấu trúc dữ liệu theo cách tin cậy và chuẩn bị dữ liệu theo lệnh của controller V là View: Hiển thị dữ liệu cho người dùng theo cách dễ hiểu dựa trên hành động của người dùng. C là Controller: Nhận lệnh từ người dùng, gửi lệnh đến cho Model để cập nhập dữ liệu, truyền lệnh đến View để cập nhập giao diện hiển thị. Chàng lập trình viên đi giao lưu với bạn bè vào tối thứ sáu, ra góc trà đá vỉa hè gọi đồ. Trà đá tối mùa hè nóng nực đông hơn bình thường, chàng len lỏi luồn qua đám đông cho đến khi thấy chị chủ, rồi hét to: “Một nước mía em ơi”. Chàng là “người dùng”, và đồ uống chàng gọi là “yêu cầu người dùng”. Với chàng, nước mía là đồ uống ưa thích, mát lạnh và ngọt ngào cho buổi tối nóng nực. Chị chủ gật đầu cười trìu mến.Não của chị chủ đóng vai trò “Controller”. Ngay khi từ “nước mía” ập đến bằng tiếng Việt, chị hiểu và bắt đầu công việc. Pha nước mía bản chất cũng giống pha nước chanh, nước sấu nhưng nguyên liệu thì hoàn toàn khác biệt nhau. Chị chủ quán chỉ có thể sử dụng công cụ và nguyên liệu của quán chị. Những công cụ của chị chủ trà đá đóng vai trò “Model”.
LỜI NĨI ĐẦU Trong năm gần đây, cơng nghệ thơng tin dần khẳng định vai trò quan trọng phần tất yếu nghiệp phát triển kinh tế - xã hội đất nước Đối với doanh nghiệp, công nghệ thông tin yếu tố góp phần quan trọng việc đổi phương thức quản lý, sản xuất kinh doanh Với ngành cơng nghệ thơng tin phát triển theo đó, có nhiều ngơn ngữ lập trình ngơn ngữ lập trình hỗ trợ việc xây dựng ứng dựng web điển hình Laravel Laravel framework PHP phát triển Taylor Otwell vào năm 2011 Là mã nguồn mở hoàn toàn miễn phí, laravel sinh nhằm mục đích hỗ trợ ứng dụng web sử dụng mơ hình MVC (Model, Controller, View) Laravel giải pháp thay cho CodeIgniter, cung cấp nhiều tính vượt trội composer, xác thực, phân quyền Vì framework nên Laravel thừa hưởng ưu điểm mạnh từ framework trước CodeIgniter, Yii, .và dần trở thành thay cho framework cũ kỹ Cake hay Yii, ASP.NET MVC, Ruby on Rails… Trong Laravel tích hợp composer làm cơng cụ quản lý, sử dụng blade template giúp việc quản lý template thật đơn giản, việc thao tác với Cơ Sở Dữ Liệu thật dễ dàng với Query Buider ORM Website đa ngơn ngữ ln điều lập trình viên quan tâm sử dụng framework, Laravel chuyện trở nên dễ dàng Laravel cung cấp cho người dùng cách thức đơn giản để ứng dụng đa ngôn ngữ Hà Nội, ngày 21 tháng năm 2018 Tác giả MUC LUC CHƯƠNG 1.1 ROUTING Cơ Routing 1.1.1 File ruote mặc định 1.1.2 Các phương thức route sẵn có 1.2 Tham số Route 1.2.1 Tham số bắt buộc 1.2.2 Tham số tùy chọn 1.2.3 Các ràng buộc biểu thức quy 1.2.3.1 Ràng buộc tồn cục (global constraints) 1.2.4 Named Route 1.2.4.1 Nhóm route route đặt tên 1.2.4.2 Sinh URI cho route đặt tên 1.3 Nhóm route 1.3.1 Middleware 1.3.2 Namespaces 1.3.3 Sub-Domain Routing 1.3.4 Tiền tố route (route prefix) 1.4 Ngăn chặn CSRF 1.4.1 Giới thiệu 1.4.2 Loại bỏ URI từ CSRF protection 1.4.3 X-CSRF-TOKEN 1.5 X-XSRF-TOKEN 1.6 Route Model Binding 1.6.1 Ràng buộc ngầm định (Implicit Binding) 1.6.1.1 Tùy biến tên khóa .8 1.6.2 Ràng buộc tường minh (Explicit Binding) 1.6.2.1 Ràng buộc tham số vào model 1.6.2.2 Tùy biến Resolution Logic 1.6.2.3 Tùy biến hành động “Not Found” 10 1.7 Form Method Spoofing 10 1.8 Truy cập vào route CHƯƠNG MIDDLEWARE 11 2.1 Giới thiệu 2.2 Định nghĩa Middleware 11 2.2.1 2.3 11 Before/After Middleware 12 Đăng ký Middleware 13 2.3.1 Global Middleware 13 2.3.2 Gán Middleware cho routes 2.3.3 Nhóm Middleware 14 13 2.4 Tham số Middleware 2.5 Terminable Middleware 16 CHƯƠNG 10 15 ROUTING CONTROLLERS 3.1 Giới thiệu 3.2 Controllers 17 17 17 3.2.1.1 Controllers & Namespaces .17 3.2.1.2 Đặt tên cho controller routes 18 3.3 Controller Middleware 18 3.4 RESTful Resource Controllers 19 3.4.1.1 Các hành động xử lý resource controller 19 3.4.1.2 Partial Resource Routes 20 3.4.1.3 Đặt tên Resource Routes 20 3.4.1.4 Đặt tên Resource Route Parameters 20 3.4.1.5 Bổ sung Resource Controllers 21 3.5 Dependency Injection & Controllers 21 3.5.1.1 Constructor Injection 21 3.5.1.2 Method Injection .22 3.6 Route Caching CHƯƠNG 4.1 23 REQUESTS 25 Truy cập vào requests 4.1.1 25 Thông tin request 26 4.1.1.1 Lấy request URI 26 4.1.1.2 Lấy phương thức request 27 4.1.2 4.2 PSR-7 Request 27 Lấy thông tin Input 27 4.2.1 Lấy giá trị input 27 4.2.2 Lấy giá trị JSON input 4.2.3 Xác định hữu giá trị 4.2.4 Lấy toàn liệu input 4.2.5 Lấy phần liệu input 28 4.2.6 Thuộc tính động 4.2.7 Input cũ 28 28 28 28 28 4.2.7.1 Flash input vào session 29 4.2.7.2 Flash input vào session điều hướng 29 4.2.7.3 Lấy liệu cũ 29 4.2.8 Cookies 29 4.2.8.1 Lấy cookies từ request 29 4.2.8.2 Đính kèm cookie vào response 30 4.2.9 Files 30 4.2.9.1 Lấy file upload .30 4.2.9.2 Kiểm tra upload thành công 30 4.2.9.3 Di chuyển file upload 30 4.2.9.4 Các phương thức khác với file 31 CHƯƠNG 5.1 RESPONSES Response 32 32 5.1.1 Các đối tượng response 32 5.1.2 Đính kèm headers vào response 32 5.1.3 Đính kèm cookies vào response 33 5.1.4 Cookies mã hóa 34 5.2 Các kiểu response khác 5.2.1 Xem response34 5.2.2 JSON response 5.2.3 Tải file 35 34 34 5.2.4 5.3 File response 35 Điều hướng 35 5.3.1 Điều hướng tới named route 5.3.2 Điều hướng tới controller actions 36 5.3.3 Điều hướng với flashed session data 5.4 36 36 Response macros 37 CHƯƠNG 6.1 VIEW VÀ BLADE TEMPLATES Cơ view 38 38 6.1.1 Xác định tồn view 6.1.2 Dữ liệu view 39 38 6.1.2.1 Truyền liệu vào view 39 6.1.2.2 Chia liệu với toàn view .39 6.1.3 View composers 40 6.1.3.1 Đính kèm composer vào nhiều view 42 6.1.3.2 View creators 42 6.2 Blade Templates 6.2.1 Giới thiệu 6.2.2 Kế thừa template 43 43 43 6.2.2.1 Định nghĩa layout 43 6.2.2.2 Mở rộng layout 43 6.2.3 Hiển thị liệu 44 6.2.3.1 Blade JavaScript Framework .45 6.2.3.2 Echo liệu tồn 45 6.2.3.3 Hiển thị liệu unescaped 45 6.2.4 Cấu trúc điều khiển 45 6.2.4.1 Câu lệnh If 46 6.2.4.2 Vòng lặp 46 6.2.4.3 Chèn sub-views .47 6.2.4.4 Render view cho collections 48 6.2.4.5 Comments .48 6.2.5 Ngăn xếp 48 6.2.6 Service Injection 49 6.2.7 Mở rộng Blade 49 CHƯƠNG 7.1 CƠ SỞ DỮ LIỆU AND ELOQUENT ORM 51 Cơ sở liệu 7.1.1 Mở đầu 51 51 7.1.1.1 Giới thiệu 51 7.1.1.2 Chạy Raw SQL query .53 7.1.1.3 Giao tác sở liệu 55 7.1.1.4 Sử dụng nhiều kết nối .56 7.1.2 Query Builder 56 7.1.2.1 Giới thiệu 56 7.1.2.2 Truy xuất kết 56 7.1.2.3 Selects .59 7.1.2.4 Joins 59 7.1.2.5 Unions .61 7.1.2.6 Mệnh đề Where .61 7.1.2.7 Mệnh đề Where nâng cao .63 7.1.2.8 Mệnh đề JSON Where 64 7.1.2.9 Sắp xếp, nhóm, giới hạn offset 65 7.1.2.10 Câu điều kiện 66 7.1.2.11 Inserts 66 7.1.2.12 Updates 67 7.1.2.13 Deletes 67 7.1.2.14 Pessimistics locking 68 7.1.3 Migrations 68 7.1.3.1 Giới thiệu 68 7.1.3.2 Tạo Migration 68 7.1.3.3 Cấu trúc Migration 69 7.1.3.4 Chạy Migration 70 7.1.3.5 Viết Migration 70 7.1.4 Seeding 78 7.1.4.1 Giới thiệu 78 7.1.4.2 Tạo Seeder 78 7.1.4.3 Chạy Seeder 80 7.2 Eloquent ORM 7.2.1 Mở đầu 80 80 7.2.1.1 Giới thiệu 80 7.2.1.2 Định nghĩa mơ hình 80 7.2.1.3 Truy xuất nhiều mơ hình 83 7.2.1.4 Truy xuất mơ hình đơn/ gộp nhóm 85 7.2.1.5 Thêm cập nhật mơ hình 86 7.2.1.6 Xóa mơ hình 89 7.2.1.7 Phạm vi truy vấn .92 7.2.1.8 Các kiện .96 7.2.2 Các quan hệ 97 7.2.2.1 Giới thiệu 97 7.2.2.2 Định nghĩa quan hệ 97 7.2.2.3 Truy vấn quan hệ 111 7.2.2.4 Thêm mơ hình liên quan 115 7.2.2.5 Quan hệ nhiều – nhiều 117 7.2.3 Collections 119 7.2.3.1 Giới thiệu 119 7.2.3.2 Các phương thức sẵn có 120 7.2.3.3 Custom Collections .120 7.2.4 Mutators 121 7.2.4.1 Giới thiệu 121 7.2.4.2 Accessors & Mutators 121 7.2.4.3 Date Mutators .123 7.2.4.4 Attribute Casting 124 7.2.5 Serialization 125 7.2.5.1 Giới thiệu 125 7.2.5.2 Sử dụng .126 7.2.5.3 Ẩn thuộc tính khỏi JSON 126 7.2.5.4 Thêm giá trị vào JSON 127 CHƯƠNG 8.1 SERVICES 129 Xác Thực (Authentication) 129 8.1.1 Giới thiệu 8.1.2 Bắt đầu nhanh với xác thực 129 8.1.3 Xác thực người dùng thủ công 133 8.1.4 Xác thực HTTP 136 8.1.5 Đặt lại mật 8.1.6 Thêm Custom User Providers 8.1.7 Events 143 8.2 129 Authorization 137 144 8.2.1 Giới thiệu 8.2.2 Định nghĩa Abilities 144 8.2.3 Kiểm tra Abilities 8.2.4 Bên Blade Templates 148 8.2.5 Policies 8.2.6 Controller Authorization 8.3 144 146 149 153 Cache 154 8.3.1 Cấu hình 8.3.2 Sử dụng Cache 8.3.3 Cache Tags 159 8.3.4 Thêm cache driver tùy chọn 8.3.5 Events 161 8.4 140 154 156 Errors & Logging 162 8.4.1 Giới thiệu 162 8.4.2 Cấu hình 162 8.4.3 The Exception Handler 8.4.4 HTTP Exceptions 8.4.5 Logging 165 165 163 159 8.5 Events 166 8.5.1 Giới thiệu 166 8.5.2 Registering Events / Listeners 8.5.3 Định nghĩa event 8.5.4 Định nghĩa listener 168 8.5.5 Tạo Events 8.5.6 Broadcasting Events 171 8.5.7 Event Subscriber 8.6 168 171 176 Filesystem / Cloud Storage 8.6.1 Giới thiệu 177 8.6.2 Cấu hình 178 8.6.3 Sử dụng 8.6.4 Custom Filesystems 182 8.7 166 177 179 Localization 184 8.7.1 Giới thiệu 8.7.2 Sử dụng 8.7.3 Ghi đè file ngôn ngữ nhà cung cấp 8.8 184 185 Mail 186 8.8.1 Giới thiệu 186 8.8.2 Gửi Mail 188 8.8.3 Mail & Local Development 192 8.8.4 Events 192 8.9 186 Hàng đợi (queue) 193 8.9.1 Giới thiệu 8.9.2 Viết lớp công việc 8.9.3 Đưa công việc vào hàng đợi 8.9.4 Thực thi lắng nghe hàng đợi (queue listener) 201 8.10 193 Phiên (session) 8.10.1 Giới thiệu 196 206 206 8.10.2 Sử dụng 208 8.10.3 Thêm driver phiên 210 8.11 193 Task Scheduling (Lap lich cho tác vụ) 212 8.11.1 Giới thiệu 212 8.11.2 Định nghĩa lịch 212 8.11.3 Đầu tác vụ 216 8.11.4 Task Hooks 8.12 216 Kiểm tra (Testing) 217 8.12.1 Giới thiệu 217 8.12.2 Kiểm thử ứng dụng 218 8.12.3 Làm việc với sở liệu 222 8.12.4 Mocking 8.13 227 Xác nhận(Validation) 8.13.1 Giới thiệu 230 230 8.13.2 Xác nhận Quickstart 230 8.13.3 Các phương pháp xác nhận khác 235 8.13.4 Làm việc với thông báo lỗi 8.13.5 Quy tắc Xác thực Có sẵn 241 8.13.6 Điều kiện Thêm Quy tắc 248 8.13.7 Quy tắc xác thực tùy chỉnh 249 239 * @param StoreBlogPostRequest $request * @return Response */ public function store(StoreBlogPostRequest $request) { // The incoming request is valid } Nếu xác nhận không thành công, phản hồi chuyển hướng tạo để gửi người dùng vị trí trước Các lỗi flashed đến phiên để chúng có sẵn để hiển thị Nếu yêu cầu yêu cầu AJAX, phản hồi HTTP với mã trạng thái 422 trả lại cho người dùng bao gồm biểu diễn lỗi xác nhận JSON Yêu cầu Mẫu Yêu cầu Lớp yêu cầu mẫu chứa phương thức ủy quyền Trong phương pháp này, bạn kiểm tra xem người dùng chứng thực có quyền cập nhật tài nguyên định hay khơng Ví dụ: người dùng cố gắng cập nhật nhận xét đăng blog, liệu họ có sở hữu bình luận khơng? Ví dụ: /**Determine if the user is authorized to make this request * @return bool */ public function authorize() { $commentId = $this->route('comment'); return Comment::where('id', $commentId) ->where('user_id', Auth::id())->exists(); } Ghi gọi đến phương pháp tuyến đường ví dụ Phương pháp cho phép bạn truy cập vào tham số URI xác định tuyến đường gọi, chẳng hạn tham số {comment} ví dụ đây: Route::post('comment/{comment}'); Nếu phương pháp ủy quyền trả false, phản hồi HTTP với mã trạng thái 403 tự động trả lại phương thức điều khiển bạn không thực Nếu bạn dự định có logic ủy quyền phần khác ứng dụng bạn, cần trả lại từ phương pháp ủy quyền: 238 /** Determine if the user is authorized to make this request @return bool */ public function authorize() { return true; } Tùy chỉnh định dạng Flashed Error Nếu bạn muốn tùy chỉnh định dạng lỗi xác nhận chiếu đến phiên xác nhận không thành công, ghi đè định dạng lỗi yêu cầu sở bạn (App \ Http \ Requests \ Request) Đừng quên nhập lớp Illuminate \ Contracts \ Validation \ Validator đầu tệp: /** {@inheritdoc} */ protected function formatErrors(Validator $validator) { return $validator->errors()->all(); } Tùy chỉnh thơng báo lỗi Bạn tùy chỉnh thông báo lỗi sử dụng yêu cầu mẫu cách ghi đè phương pháp điều trị thư Phương pháp nên trả mảng cặp thuộc tính / quy tắc thông báo lỗi tương ứng chúng: /**Get the error messages for the defined validation rules @return array */ public function messages() { return [ 'title.required' => 'A title is required', 'body.required' => 'A message is required', ]; } 239 8.13.4.Làm việc với thông báo lỗi Sau gọi phương thức lỗi cá thể Validator, bạn nhận ví dụ Illuminate \ Support \ MessageBag, có nhiều phương pháp thuận tiện để làm việc với thông báo lỗi Lấy thông báo lỗi cho trường A Để lấy thông báo lỗi cho trường định, sử dụng phương pháp đầu tiên: $messages = $validator->errors(); echo $messages->first('email'); Lấy tất thông báo lỗi cho trường A Nếu bạn muốn cần lấy mảng tất thông điệp cho trường định, sử dụng phương thức get: foreach ($messages->get('email') as $message) { // } Lấy tất thông báo lỗi cho tất trường Để lấy mảng thông điệp cho tất trường, sử dụng phương thức all: foreach ($messages->all() as $message) { // } Xác định xem thư có tồn cho trường A foreach ($messages->all() as $message) { // } Truy xuất thông báo lỗi với định dạng A echo $messages->first('email', ':message
'); Truy xuất tất thông báo lỗi với định dạng A foreach ($messages->all('