Trong bài viết thứ nhất về hướng dẫn cơ bản, mình đã giới thiệu với các bạn về các điều sau:
- Tạo project
- Cài đặt bootstrap, js, ghép theme
- Cấu hình database
- Repository Pattern
Ở bài viết này, mình sẽ giới thiệu tiếp với các bạn các kiến thức cơ bản tiếp theo để phát triển với Laravel
Route
Các routes trong
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
0 xác định các route dành cho giao diện web của bạn. Các routes trong Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
1 xác định các route phần mềm trung gian apiCác routes trong
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
1 xác định các route phần mềm trung
gian apiCác phương thức trong Route
Route sẽ hỗ trợ các phương thức như sau:
Route::get[$uri, $callback];
Route::post[$uri, $callback];
Route::put[$uri, $callback];
Route::patch[$uri, $callback];
Route::delete[$uri, $callback];
Route::options[$uri, $callback];
Trong đó $url: đường dẫn route và $callback : là một hành động nào đó sẽ được thực hiện để trả về.
Route::redirect['/here', '/there'];
Route::view['/welcome', 'welcome'];
Tham số tùy chọn
Nhiều khi chúng ta sẽ cần truyền tham số trên đường dẫn, chúng ta cũng có thể truyền trong route.
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
Tên Route
Route::get['user/profile', function [] {
//
}]->name['profile'];
You may also specify route names for controller actions:
Route::get['user/profile', 'UserProfileController@show']->name['profile'];
Middleware
Để gán function middleware cho tất cả các route trong một nhóm, bạn có thể sử dụng middleware trước khi xác định route. Middleware được thực hiện theo thứ tự chúng được liệt kê trong mảng:
Route::middleware[['first', 'second']]->group[function [] {
Route::get['/', function [] {
// Uses first & second Middleware
}];
Route::get['user/profile', function [] {
// Uses first & second Middleware
}];
}];
Namespaces
Namespace trong Laravel giông như PHP namespace được chỉ định với một nhóm controller.
Route::namespace['Admin']->group[function [] {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
}];
Route Prefixes
Xét ví dụ sau
Route::get['manager/products', 'ProductController@index'];
Route::get['manager/products/create', 'ProductController@create'];
Route::post['manager/products/store', 'ProductController@store'];
Route::get['manager/products/{id}/edit', 'ProductController@edit'];
Route::patch['manager/products/{id}', 'ProductController@update];
Route::patch['manager/products/{id}', 'ProductController@destroy'];
Các bạn có thấy đặc điểm chung của các route đều bắt đầu bằng manager vì thể để viết gọn lại các URL thì chúng ta sẽ sử dụng prefix để URL khi định nghĩa route ngắn gọn dễ nhìn hơn.
Route::group[['prefix' => 'manager'], function [] {
Route::get['products', 'ProductController@index'];
Route::get['products/create', 'ProductController@create'];
Route::post['products/store', 'ProductController@store'];
Route::get['products/{id}/edit', 'ProductController@edit'];
Route::patch['products/{id}', 'ProductController@update];
Route::patch['products/{id}', 'ProductController@destroy'];
}];
Sub-Domain Routing
Tên miền phụ có thể được chỉ định tham số tuyến giống như URI route, cho phép bạn bắt một phần của tên miền phụ để sử dụng trong route hoặc controler. Tên miền phụ có thể được chỉ định bằng cách gọi phương thức miền trước khi xác định nhóm:
Tên miền phụ có thể được chỉ định bằng cách gọi phương thức miền trước khi xác định nhóm:
Route::redirect['/here', '/there'];
0View
Blade Templates
Template engine có tác dụng giúp sạch đi những đoạn code PHP nằm trong View nên tách biệt hoàn toàn giữa người cắt CSS và người code PHP. Blade rất đơn giản, nhưng lại là một templating engine đầy mạnh mẽ! Blade không giới hạn chúng ta sử dụng code PHP trong views. Tất cả các file Blade sẽ được dịch thành file code PHP và cache cho đến khi file Blade bị thay đổi, điều đó cũng có nghĩa là Blade tự làm tất cả những việc cần thiết để có thể chạy views cho ứng dụng của bạn Các file view dùng cho Blade có phần tên đuôi file là
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
2 và được lưu trong thư mục mặc định Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
3 Defining A LayoutBlade rất đơn giản, nhưng lại là một templating engine đầy mạnh mẽ! Blade không giới hạn chúng ta sử dụng code PHP trong views. Tất cả các file Blade sẽ được dịch thành file code PHP và cache cho đến khi file Blade bị thay đổi, điều đó cũng có nghĩa là Blade tự làm tất cả những việc cần thiết để có thể chạy views cho ứng dụng của bạn
Các file view dùng cho Blade có phần tên đuôi file là
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
2 và được lưu trong thư mục mặc định Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
3 Defining A Layout
Route::redirect['/here', '/there'];
1 Cú pháp tạo layout
Route::redirect['/here', '/there'];
2Route::redirect['/here', '/there'];
3- Trên đây là một ví dụ về việc tạo ra một layout cho một ứng dụng
- Mỗi session sẽ là một khu vực hiển thị giữ liệu trong ứng dụng. ta chỉ cần viết một lần và nó sẽ được gọi ra ở bất kỳ một màn hình con nào được extend
- một session được bắt đầu bởi @session['name'] và kết thúc bởi @endsession
- để include một layout ta sử dụng @exends['name_layout']
Kế thừaĐây là phần quan trọng nhất và cũng là mục tiêu của việc tạo ra các templete trong một ngôn ngữ lập trình Một templete tốt không chỉ dễ sử dụng mà còn phải có tác dụng kế thừa để có thể sử dụng lại, tránh tối đa việc lặp code Không thể nào tạo ra một file templete mà lại chỉ dùng cho một chức năng nhất định. ta phải làm cho chúng có thể sử dụng lại ở các màn hình khác có cùng chức năng. Cú pháp:
Đây là phần quan trọng nhất và cũng là mục tiêu của việc tạo ra các templete trong một ngôn ngữ lập trình
Một templete tốt không chỉ dễ sử dụng mà còn phải có tác dụng kế thừa để có thể sử dụng lại, tránh tối đa việc lặp code
Không thể nào tạo ra một file templete mà lại chỉ dùng cho một chức năng nhất định. ta phải làm cho chúng có thể
sử dụng lại ở các màn hình khác có cùng chức năng.
Cú pháp:
Route::redirect['/here', '/there'];
4Route::redirect['/here', '/there'];
5Giờ ta include file
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
4 vào màn hình Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
5Route::redirect['/here', '/there'];
6Kết quả thu được cũng tương hệt như kết quả lúc đầu. tuy nhiên từ nay ta có thể sử include templete
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
6 vào bất kỳ đoạn nào cần sử dụng đến hiển thị Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
7 Các cú pháp trong blade templete engineĐể hiển thị giữ liệu trên view ta dùng dấu Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
8Các cú pháp trong blade templete engine
Để hiển thị giữ liệu trên view ta dùng dấu
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
8Route::redirect['/here', '/there'];
7Khi đó file blade sẽ tự build ra temple dạng theo dạng
Route::redirect['/here', '/there'];
8Hiển thị giữ liệu tồn tại
Route::redirect['/here', '/there'];
9Cú pháp rút gọn:
Route::get['posts/{post}/comments/{comment}', function [$postId, $commentId] {
//
}];
9 Chú ý: Blate không chấp nhận các lệnh comment thông thường của php như Route::get['user/profile', function [] {
//
}]->name['profile'];
0. Lúc này mặc dù dòng code đã được comment nhưng khi được build ra view thì giữ liệu vẫn được sử lý và hiển thị bình thường. Cấu trúc điều khiểnLệnh ifChú ý: Blate không chấp nhận các lệnh comment thông thường của php như
Route::get['user/profile', function [] {
//
}]->name['profile'];
0. Lúc này mặc dù dòng code đã được comment nhưng khi được build ra view thì giữ liệu vẫn được sử lý và hiển thị bình thường. Cấu trúc điều khiển
Lệnh if
Route::view['/welcome', 'welcome'];
0Có thể thấy code đã đơn giản hơn rất nhiều so với việc ta sử dụng lệnh if với cú pháp php thông thường Vòng lặp
Vòng lặp
Route::view['/welcome', 'welcome'];
1Route::view['/welcome', 'welcome'];
2Route::view['/welcome', 'welcome'];
3Localization
Route::view['/welcome', 'welcome'];
4Ví dụ ở trên mình muốn cài đặt ngôn ngữ tiếng việt và tiếng anh cho trang web của mình. Mình tạo 2 thư mục " en " và " vi" trong " resources\lang\ " bên trong mình file messages.php trong file này mình viết các label hiển thị ra
Route::get['user/profile', function [] {
//
}]->name['profile'];
1Route::view['/welcome', 'welcome'];
5và
Route::get['user/profile', function [] {
//
}]->name['profile'];
2Route::view['/welcome', 'welcome'];
5Vậy ta thiết lập xong rồi, làm thế nào để dùng nó?Mỗi khi muốn in label thay vì ta gõ thẳng đoạn text đó bằng ngôn ngữ ta đang dùng thì ta sẽ dùng hàm trans[] để gọi tới những label chúng ta vừa thiết lập. Ta dùng
3 Route::get['user/profile', function [] {
//
}]->name['profile'];
Mỗi khi muốn in label thay vì ta gõ thẳng đoạn text đó bằng ngôn
ngữ ta đang dùng thì ta sẽ dùng hàm trans[] để gọi tới những label chúng ta vừa thiết lập.
Ta dùng
Route::get['user/profile', function [] {
//
}]->name['profile'];
3Laravel Collective Form/Html
Laravel collective là một package cung cấp cho chúng ta cách viết form, html với cú pháp ngắn gọn hơn, dễ nhìn hơn.// Không dùng Laravel collective
// Không dùng Laravel collective
Route::view['/welcome', 'welcome'];
7// Dùng Laravel collective
Route::view['/welcome', 'welcome'];
8Để cài đặt pakage này ta cài đặt nó qua composer với câu lệnh:
Route::get['user/profile', function [] {
//
}]->name['profile'];
4 Tiếp theo ta cần config để sử dụng. Bạn vào Route::get['user/profile', function [] {
//
}]->name['profile'];
5 và thêm Provider và Aliases sau:Tiếp theo ta cần config để sử dụng. Bạn vào
Route::get['user/profile', function [] {
//
}]->name['profile'];
5 và thêm Provider và Aliases sau:Route::view['/welcome', 'welcome'];
9Tham Khảo
- //laravel.com/docs/5.7/routing
- //laravel.com/docs/5.7/blade
- //laravel.com/docs/5.7/localization
- //viblo.asia/p/laravel-collective-formhtml-naQZRJyvZvx
- //viblo.asia/p/da-ngon-ngu-trong-laravel-i18n-WAyK8LLoKxX