Laravel – Controllers

Controllers cơ bản

Controller là chữ viết tắt ‘C’ trong MCV framework. Nó là trung gian kết nối giữa Views với Models.

Tạo một Controller

Tạo một Controller bạn có thể dùng Artisan CLI (Command Line Interface). Mở command prompt hay terminal vào path ứng dụng, gõ lệnh sau:

php artisan make:controller <controller-name>

Với <controller-name> là tên controller muốn tạo. Lệnh Artisan CLI này sẽ tạo 1 file trong thư mục app\Http\Controllers với code cơ bản của 1 controller. Bạn có thể thêm code xử lý vào. Controller vừa được tạo sẽ được gọi thông qua route trong routes/web.php.

Route::get('base URI','controller@method');

Ví dụ

Step 1 : Thực thi dòng lệnh bên dưới để tạo một controller UserController.

php artisan make:controller UserController

Sau khi thực thi thành công, kết quả như sau:

Step 2 : Bạn có thể thấy file controller vừa tạo sau app/Http/Controller/UserController.php với code cơ bản như sau và bạn có thể thêm code xử lý tùy yêu cầu.

<?php

namespace blog\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    //
}

Controller Middleware

Ở bài trước, ta đã tìm hiểu về Middleware. Và Middleware có thể được gán cho route hay controller.

Gán Middleware cho Route

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => 'UserController@showProfile'
]);

Ở đây, chúng ta đã gán middleware tên auth và dùng Controller là UserController cho route profile.

Gán Middleware bên trong Controller

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct(){
      $this->middleware('auth');
   }
}

Chúng ta đã gán middleware auth vào trong __construct của Controller.

Ví dụ

Step 1 : Thêm route bên dưới vào file routes/web.php.

<?php
Route::get('/usercontroller/path',[
   'middleware' => 'First',
   'uses' => 'UserController@showPath'
]);

Step 2 : Tạo middleware FirstMiddleware bằng dòng lệnh bên dưới.

php artisan make:middleware FirstMiddleware

Step 3 : Thêm code như sau vào function handle trong file app/Http/Middleware/FirstMiddleware.php mới tạo.

<?php

namespace App\Http\Middleware;

use Closure;

class FirstMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        echo '<br>First Middleware';
        return $next($request);
    }
}

Step 4

Tương tự, tạo middleware SecondMiddleware.

php artisan make:middleware SecondMiddleware

Step 5 : Thêm code như sau trong function handle.

<?php

namespace App\Http\Middleware;

use Closure;

class SecondMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        echo '<br>Second Middleware';
        return $next($request);
    }
}

Step 6 : Đăng ký 2 Middleware vừa tạo trong file app/Http/Kernel.php như bên dưới (thêm 2 dòng First, và Second).

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'First' => \App\Http\Middleware\FirstMiddleware::class,
    'Second' => \App\Http\Middleware\SecondMiddleware::class,
];

Step 6 : Tạo controller UserController bằng lệnh sau:

php artisan make:controller UserController

Step 7 : Thêm code như bên dưới vào controller UserController mới tạo
app/Http/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function __construct(){
        $this->middleware('Second');
    }

    public function showPath(Request $request){
        $uri = $request->path();
        echo '<br>URI: '.$uri;

        $url = $request->url();
        echo '<br>';

        echo 'URL: '.$url;
        $method = $request->method();
        echo '<br>';

        echo 'Method: '.$method;
    }
}

Step 8 : Chạy web server bằng lệnh sau (có thể dùng xampp…)

php artisan serve

Step 9 : Vào url http://localhost:8000/usercontroller/path

Kết quả

Restful Resource Controllers

Khi tạo một ứng dụng, bạn thường phải thực hiện CRUD (Create, Read, Update, Delete). Laravel giúp việc này đơn giản hơn. Khi tạo Resource controller và Laravel sẽ cung cấp các phương thức cho việc CRUD này. Bạn chỉ cần đăng ký 1 route trong file routes/web.php thôi.

Step 1 : Tạo một Resource controller bằng lệnh command sau:

php artisan make:controller MyController --resource

Lệnh trên sẽ tạo 1 controller với các phương thức có sẵn như index, create, store, show, edit…. Thêm các đoạn code echo để kiểm tra kết quả.

Http/Controllers/MyController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MyController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        echo 'index';
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        echo 'create';
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        echo 'store';
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        echo 'show';
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        echo 'edit';
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        echo 'update';
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        echo 'destroy';
    }
}

 

Step 2 : Thêm route sau vào routes/web.php.

Route::resource('my','MyController');

Step 3 : Như vậy chúng ta đã đăng ký tự động tất cả phương thức trong resource controller.

Phương Thức Path Action Route Name
GET /my index my.index
GET /my/create create my.create
POST /my store my.store
GET /my/{my} show my.show
GET /my/{my}/edit edit my.edit
PUT/PATCH /my/{my} update my.update
DELETE /my/{my} destroy my.destroy

Step 3 : Vào các đường dẫn sau để kiểm tra kết quả:

Url Mô tả Kết quả
http://localhost:8000/my Kết quả từ function index của file MyController.php index
http://localhost:8000/my/create Kết quả từ function create của file MyController.php create
http://localhost:8000/my/1 Kết quả từ function show của file MyController.php show
http://localhost:8000/my/1/edit Kết quả từ function edit của file MyController.php edit

Constructor Injection

Service container của Laravel xử lý tất cả controller của Laravel. Do đó bạn có thể “type-hint” các thành phần phụ thuộc mà controller của bạn cần vào trong constructor của controller.

Bạn có thể “type-hint” các Contract Laravel vào để sử dụng như Database, Cache, Request

Ví dụ :

Step 1 : Tạo controller MyController bằng lệnh command

php artisan make:controller MyController

Step 2 : Thêm code bên dưới vào routes/web.php.

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','MyController@index');

Step 3 : Thêm code như bên dưới vào file controller MyController vừa tạo.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MyController extends Controller
{
    private $myclass;

    public function __construct(\MyClass $myclass){
        $this->myclass = $myclass;
     }
   
     public function index(){
        dd($this->myclass);
     }

    //
}

Step 4 : Vào url http://localhost:8000/myclass để xem kết quả

Method Injection

Ngoài cách Constructor Injection bạn cũng có thể “type-hint” các thành phần phụ thuộc vào method.

Ví dụ :

Step 1 : Tạo controller InjectionController bằng lệnh command

php artisan make:controller InjectionController

Step 2 : Thêm code bên dưới vào routes/web.php.

class InjectionClass{
   public $foo = 'bar';
}
Route::get('/injectionclass','InjectionController@index');

Step 3 : Thêm code như bên dưới vào file controller InjectionController vừa tạo
app\Http\Controllers\InjectionController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class InjectionController extends Controller
{
    private $injectionclass;

    public function __construct(\InjectionClass $injectionclass){
        $this->injectionclass = $injectionclass;
     }

     public function index(){
        dd($this->injectionclass);
     }
}

Step 4 : Vào url http://localhost:8000/injectionclass để xem kết quả