Bài 13. Sử dụng Middleware trong Laravel 5

Bài trước mình đã giới thiệu về Auth trong Laravel 5 và ứng dụng tạo chức năng login cho trang quản trị website tin tức. Bài hôm nay chúng ta sẽ đi tìm hiểu về Middleware trong Laravel 5 và ứng dụng nó để bảo vệ trang quản trị website.

Mục Lục:

1. Giới thiệu

Laravel có chứa một middleware xác thực người dùng đăng nhập vào hệ thống. Nếu user chưa đăng nhập, middleware sẽ chuyển hướng user tới màn hình đăng nhập. Tuy nhiên, nếu user đã đăng nhập rồi, thì middleware sẽ cho phép request được thực hiện tiếp tiến trình xử lý vào ứng dụng.

Có vài middleware đã có sẵn trong Laravel framework, bao gồm middlware xác thực, CSRF protection. Tất cả được nằm trong thư mục app/Http/Middleware.

2. Tạo và đăng ký Middleware

Cú pháp:

        $ php artisan make:middleware DemoMiddleware
    

DemoMiddleware là tên middleware. Chạy lệnh tên sẽ tạo ra class DemoMiddleware trong thư mục app/Http/Middleware

        class AdminMiddleware
        {
            /**
             * Handle an incoming request.
             *
             * @param  \Illuminate\Http\Request  $request
             * @param  \Closure  $next
             * @return mixed
             */
            public function handle($request, Closure $next)
            {
                if($request->age <= 18) {
                    return $next($request);
                } else {
                    return redirect('home');
                }

            }
        }
    

Nói cho vui thì middleware này sẽ cấm trẻ em dưới 18 tuổi được truy cập vào. Nếu không đủ 18 tuổi nó sẽ 'đá' về trang chủ còn ngược lại sẽ cho phép truy cập vào.

Đăng ký Middleware

Bạn mở file app/Http/Kernel.php tìm tới $routeMiddleware đây là thuộc tính sẽ chứa một số class thuộc middleware của framework Laravel. Để thêm middleware của bạn, đơn giản chỉ là thêm nó vào dach sách và gán từ khóa bạn chọn. Ví dụ:

        protected $routeMiddleware = [
            ...,
            'demo' => \App\Http\Middleware\DemoMiddleware::class
        ];
    

Gán Middleware vào Routes

Khi middleware đã được định nghĩa trong HTTP kernel, bạn có thể sử dụng phương thức middleware gán cho một route:

    Route::group(['prefix' => 'anh/18', 'middleware' => 'demo'], function() {
        ... // danh sách các route
    });
    

3. Tạo Middleware cho trang quản trị website tin tức

Tạo middleware AdminMiddleware

        $ php artisan make:middleware AdminMiddleware
    

Mở file app/Middleware/AdminMiddleware.php

        namespace App\Http\Middleware;
        use Closure;
        use Auth;

        class AdminMiddleware
        {
            /**
             * Handle an incoming request.
             *
             * @param  \Illuminate\Http\Request  $request
             * @param  \Closure  $next
             * @return mixed
             */
            public function handle($request, Closure $next)
            {
                if(Auth::check()) {
                    return $next($request);
                } else {
                    return redirect('administrator/login');
                }

            }
        }
    

middleware này giúp ta xác đinh người dùng đã xác thực hay chưa? nếu chưa sẽ redirect về trang login còn ngược lại sẽ cho đi qua.

Bạn mở file app/Http/Kernel.php tìm tới $routeMiddleware đây là thuộc tính sẽ chứa một số class thuộc middleware của framework Laravel. Để thêm middleware của bạn, đơn giản chỉ là thêm nó vào dach sách và gán từ khóa bạn chọn. Ví dụ:

        protected $routeMiddleware = [
            ...,
            'adminLogin' => \App\Http\Middleware\AdminMiddleware::class
        ];
    

Gán middlewware vào route

        Route::group(['prefix' => 'administrator', 'middleware' => 'adminLogin'], function() {

	        Route::get('index', 'AdminController@index');

            Route::group(['prefix' => 'category'], function () {
               Route::get('list', ['as' => 'getListCate', 'uses' => 'Admin\CategoryController@getList']);
               Route::get('insert', ['as' => 'getInsertCate', 'uses' => 'Admin\CategoryController@getInsert']);
               Route::post('insert', ['as' => 'postInsertCate', 'uses' => 'Admin\CategoryController@postInsert']);
               Route::get('update/{id}', ['as' => 'getUpdateCate', 'uses' => 'Admin\CategoryController@getUpdate']);
               Route::post('update/{id}', ['as' => 'postUpdateCate', 'uses' => 'Admin\CategoryController@postUpdate']);
               Route::get('delete/{id}', ['as' => 'getDeleteCate', 'uses' => 'Admin\CategoryController@getDelete']);
            });

            Route::group(['prefix' => 'article'], function () {
                Route::get('list', ['as' => 'getListArticle', 'uses' => 'Admin\ArticleController@getList']);
                Route::get('insert', ['as' => 'getInsertArticle', 'uses' => 'Admin\ArticleController@getInsert']);
                Route::post('insert', ['as' => 'postInsertArticle', 'uses' => 'Admin\ArticleController@postInsert']);
                Route::get('update/{id}', ['as' => 'getUpdateArticle', 'uses' => 'Admin\ArticleController@getUpdate']);
                Route::post('update/{id}', ['as' => 'postUpdateArticle', 'uses' => 'Admin\ArticleController@postUpdate']);
                Route::get('delete/{id}', ['as' => 'getDeleteArticle', 'uses' => 'Admin\ArticleController@getDelete']);
            });

            Route::group(['prefix' => 'user'], function () {
                Route::get('list', ['as' => 'getListUser', 'uses' => 'Admin\UserController@getList']);
                Route::get('insert', ['as' => 'getInsertUser', 'uses' => 'Admin\UserController@getInsert']);
                Route::post('insert', ['as' => 'postInsertUser', 'uses' => 'Admin\UserController@postInsert']);
                Route::get('update/{id}', ['as' => 'getUpdateUser', 'uses' => 'Admin\UserController@getUpdate']);
                Route::post('update/{id}', ['as' => 'postUpdateUser', 'uses' => 'Admin\UserController@postUpdate']);
                Route::get('delete/{id}', ['as' => 'getDeleteUser', 'uses' => 'Admin\UserController@getDelete']);
            });

        });
    

Bạn thử không đăng nhập truy cập 1 trong các route trong nhóm route administrator nếu nó redirect về trang login là bạn đã thành công.

Trong bài này mình đã giới thiệu về Middleware trong Laravel 5 và tạo Middleware cho website tin tức. Trong series bài viết tiếp theo mình sẽ hướng dẫn các bạn về Query Builder trong Laravel 5 và hiển thị tin tức lên trang chủ.