Adding multiple middleware to Laravel route

Per laravel doc, I can add the auth middleware as follows:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

I've also seen middleware added as follows:

Route::group(['middleware' => ['web']], function() {
  // Uses all Middleware $middlewareGroups['web'] located in /app/Http/kernel.php?
  Route::resource('blog','BlogController'); //Make a CRUD controller
});

How can I do both?

PS. Any comments providing insight on what the bottom four lines of code are doing would be appreciated


Solution 1:

To assign middleware to a route you can use either single middleware (first code snippet) or middleware groups (second code snippet). With middleware groups you are assigning multiple middleware to a route at once. You can find more details about middleware groups in the docs.

To use both (single middleware & middleware group) you can try this:

Route::group(['middleware' => ['auth', 'web']], function() {
  // uses 'auth' middleware plus all middleware from $middlewareGroups['web']
  Route::resource('blog','BlogController'); //Make a CRUD controller
});

Solution 2:

You may also assign multiple middleware to the route:

Route::get('/', function () {
//
})->middleware('first', 'second');

Reference

Solution 3:

You could also do the following using the middleware static method of the Route facade:

Route::middleware(['middleware1', 'middlware2'])
    ->group(function () {
        // Your defined routes go here
    });

The middleware method accepts a single string for one middleware, or an array of strings for a group of middleware.