Trong ứng dụng thực tế sẽ có rất nhiều route
, lúc này nếu như code logic mà đặt trong route
luôn thì file này sẽ rất lớn và code lúc này sẽ trở nên rối hơn.
Trong Laravel, Controller
sẽ là nơi chứa các logic code thay thế cho route. Lúc này bạn có thể gom nhóm một loạt các logic có chung một nghiệp vụ vào một class
cho dễ quản lý. Mặc định, Controller trong Laravel được đặt trong thư mục app/Http/Controllers
1. Tạo controller trong Laravel
Trong Laravel tất cả các controller đều phải kế thừa class Controller (App\Http\Controllers\Controller
). Nếu không kế thừa class Controller này thì bạn sẽ không sử dụng được các tính năng kèm theo của Laravel như middleware
, authorize
,… bằng việc gọi phương thức.
Để tạo mới một controller trong Laravel các bạn sử dụng artisan command
hoặc có thể tạo bằng tay. Đối artisan command
các bạn sử dụng câu lệnh:
php artisan make:controller ControllerName
Ví dụ: Mình sẽ tạo mới một controller là ContactController
php artisan make:controller ContactController
Nếu muốn tạo Controller
trong thư mục con Pages:
php artisan make:controller Pages/PostController
Mình sẽ thêm method show vào trong ContactController
vừa tạo ở trên để hiển thị view contact
đồng thời assign vào route với path /contact
app/Http/Controllers/ContactController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ContactController extends Controller{
public function show() {
return view('contact');
}
}
resources/contact.blade.php
<h3>Contact</h3>
routes/web.php
use App\Http\Controllers\ContactController;
use Illuminate\Support\Facades\Route;
Route::get('/contact', [ContactController::class, 'show']);
Route /contact sẽ gọi function show()
của class ContactController
trong Controller ContactController
Kết quả dưới dạng view-source
2. Single Action Controller
Nếu bạn chỉ muốn một controller class thực thi một hành động duy nhất, thì các bạn cũng có thể thêm một phương thức như phần trên rồi assign chúng vào route. Hoặc có thể viết chúng trong phương thức __invoke
rồi trong route các bạn sẽ không cần phải truyền thêm phương thức
Ví dụ: Tạo single action controller ProvisionController
php artisan make:controller ProvisionController --invokable
app/Http/Controllers/ProvisionController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProvisionController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
return view('provision');
}
}
resources/provision.blade.php
<h3>Provision</h3>
routes/web.php
use App\Http\Controllers\ProvisionController;
use Illuminate\Support\Facades\Route;
Route::get('/provision', ProvisionController::class);
Bạn có thể thấy ta không cần phải gọi thêm function
Kết quả
3. Middleware trong Controller
Trong Laravel các bạn có thể assign middleware vào trong controller
với method middleware
class UserController extends Controller
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
}
Nếu bạn muốn chỉ định middleware hoạt động cho một vài method nào đó trong controller các bạn có thể đặt middleware trong method đó. Hoặc sử dụng phương thức only
Ví dụ: middleware
cho hành động edit
trong UserController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function __construct()
{
$this->middleware('auth')->only('edit');
}
public function edit()
{
//
}
}
Hoặc
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function edit()
{
$this->middleware('auth');
}
}
Nếu bạn muốn middleware hoạt động với tất cả action trong controller và bỏ qua một vài action nào đó, các bạn có thể sử dụng phương thức except
Ví dụ: assign middleware
auth cho controller UserController
và bỏ qua action index
và show
$this->middleware('auth')->except(['index', 'show']);
Hoặc
$this->middleware('auth')->except('index', 'show');
4. Resource Controller
Resource controller trong Laravel là một dạng controller cung cấp sẵn các action index
, create
, store
, show
, edit
, update
, destroy
để thực thi các hành động CRUD data
Để tạo resource controller trong Laravel các bạn sử dụng command :
php artisan make:controller ControllerName --resource
Ví dụ: Mình sẽ tạo một resource controller là PhotoController
php artisan make:controller PhotoController --resource
Lúc này Laravel sẽ sinh ra cho chúng ta file app/Http/Controllers/PhotoController.php
có nội dung như sau:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PhotoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
Lúc này để assign route cho resource controller
các bạn sử dụng phương thức resource
routes/web.php
use App\Http\Controllers\PhotoController;
use Illuminate\Support\Facades\Route;
Route::resource('photos', PhotoController::class);
Để xem danh sách các route
các bạn sử dụng command:
php artisan route:list
Kết quả
Trong một số trường hợp, bạn không muốn sử dụng tất cả các action trong controller thì ở route các bạn sử dụng phương thức except
để xác định các action không muốn sử dụng.
Ví dụ: Loại bỏ action index
và show
trong controller PhotoController
Route::resource('photos', PhotoController::class)->except([
'index', 'show'
]);
Hoặc các bạn có thể sử dụng phương thức only
để xác định các action được phép sử dụng
Ví dụ: Chỉ sử dụng action index
và show
trong controller PhotoController
Route::resource('photos', PhotoController::class)->only([
'index', 'show'
]);
Trong một số trường hợp, bạn muốn thay đổi route name cho một action nào đó trong resource controller các bạn có thể sử dụng phương thức names
.
Ví dụ: Thay đổi route name cho action create
thành photo.build
Route::resource('photos', PhotoController::class)->names([
'create' => 'photos.build'
]);
Bạn cũng có thể thay đổi route parameters cho resource controller, bằng cách sử dụng phương thức parameters
.
Ví dụ: Thay đổi parameter photo
thành photo_id
Route::resource('photos', PhotoController::class)->parameters([
'photo' => 'photos_id'
]);
5. API Resource Routes
Trong trường hợp ứng dụng của bạn chỉ cần cung cấp các action như một API Resfull. Thì bạn có thể sử dụng API Resource route. Lúc này các route sẽ bỏ qua các action create
, edit
Ví dụ: Chuyển PhotoController
trên về API resource route
Kết quả
[…] bạn trả về nhiều hơn một bản ghi thì Eloquent sẽ tự động convert nó sang collection để tiện cho mọi người xử lí dữ […]
[…] Collection này được kế thừa Base collection của Laravel và sẽ bổ sung thêm một số các phương thức khác để hỗ trợ xử […]
[…] Collection này được kế thừa Base collection của Laravel và sẽ bổ sung thêm một số các phương thức khác để hỗ trợ xử […]