Laravel Tutorial

Bài 15: Controller trong Laravel

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  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  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 createedit

Ví dụ: Chuyển PhotoController trên về API resource route

Kết quả

 

1 Comment

Leave a Comment