Sephen
Sephen

Reputation: 1111

Lumen role middleware missing argument

I'm new to Lumen and i am trying to get the role middleware to work from an example in the Lumen docs: http://lumen.laravel.com/docs/middleware#middleware-parameters

But as soon as i add the middleware to the route like so:

$app->get('/', ['middleware' => 'role:editor', 'uses' => 'IndexController@index']);

I get the error:

at Application->Laravel\Lumen\{closure}('2', 'Missing argument 3 for App\Http\Middleware\RoleMiddleware::handle()', '/Users/peter/app/Http/Middleware/RoleMiddleware.php', '17', array('request' => object(Request), 'next' => object(Closure))) in RoleMiddleware.php line 17

When i remove the middle ware everything works as expected

$app->get('/', ['uses' => 'IndexController@index']);

In app.php:

$app->middleware([
    Illuminate\Cookie\Middleware\EncryptCookies::class,
    Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    Illuminate\Session\Middleware\StartSession::class,
    Illuminate\View\Middleware\ShareErrorsFromSession::class,
    Laravel\Lumen\Http\Middleware\VerifyCsrfToken::class,
    App\Http\Middleware\RoleMiddleware::class
]);

App\Http\Middleware\RoleMiddleware.php:

<?php

namespace App\Http\Middleware;

use Closure;

class RoleMiddleware
{
    public function handle($request, Closure $next, $role) // <-line 17
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }
        return $next($request);
    }
}

Hope someone can help

Upvotes: 2

Views: 2038

Answers (2)

Sephen
Sephen

Reputation: 1111

Seems that you have to register the Middleware as RouteMiddleware so instead of:

$app->middleware([
    Illuminate\Cookie\Middleware\EncryptCookies::class,
    Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    Illuminate\Session\Middleware\StartSession::class,
    Illuminate\View\Middleware\ShareErrorsFromSession::class,
    Laravel\Lumen\Http\Middleware\VerifyCsrfToken::class,
    App\Http\Middleware\RoleMiddleware::class
]);

it has to be:

$app->middleware([
    Illuminate\Cookie\Middleware\EncryptCookies::class,
    Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    Illuminate\Session\Middleware\StartSession::class,
    Illuminate\View\Middleware\ShareErrorsFromSession::class,
    Laravel\Lumen\Http\Middleware\VerifyCsrfToken::class,
]);

$app->routeMiddleware([
    "role" => App\Http\Middleware\RoleMiddleware::class
]);

Then it works fine!

Upvotes: 2

Vishal Sharma
Vishal Sharma

Reputation: 2610

By the error I understand that you are not providing a parameter in your handle() i.e. the 3rd argument.

Your handle() should look like this.

public function handle($request, Closure $next, $role)

The third parameter $role stores the value editor as per your code

Upvotes: 0

Related Questions