php - Laravel middleware throws error that depedency needs to implement contract, while it does -


type error: argument 3 passed app\http\middleware\userauthmiddleware::handle() must implement interface app\contracts\userauth, none given, called in c:\wamp64\www\laravel\vendor\laravel\framework\src\illuminate\pipeline\pipeline.php on line 148

i'm getting error inside middleware, when i'm use given contract in controllers, works fine. have clue happening?

middleware file

namespace app\http\middleware;  use closure; use app\contracts\userauth;  class userauthmiddleware {     /**      * handle incoming request.      *      * @param  \illuminate\http\request  $request      * @param  \closure  $next      * @return mixed      */     public function handle($request, closure $next, userauth $user)     {         return $next($request);     } } 

userauth service file

<?php  namespace app\services; use app\usersmodel;  class userauth implements \app\contracts\userauth {     public $username;     public $password;     public $perm_level = "admin";     public $guest = true;      public function load()     {         if (session()->has("user"))         {             $user = usermodel::where([                 "username" => session("user"),                 "password" => session("password")             ])->first();             $this->username = $user->username;             $this->password = $user->password;             $this->guest = false;         }     }      public function islogged()     {         return $this->guest;     } } 

appserviceprovider register

public function register() {     $this->app->singleton(\app\contracts\userauth::class, \app\services\userauth::class); } 

routes

//registration routes route::get("/register", "user@register")->middleware("user_auth"); route::post("/register", "user@save_user")->middleware("user_auth"); 

user controller working contract

<?php  namespace app\http\controllers;  use illuminate\http\request; use app\usersmodel; use app\contracts\userauth;  class user extends controller {     public function register(request $request, userauth $user)     {         return view("registration.form", ["request" => $request]);     }      public function login(request $request)     {         $user = usersmodel::where([             "username" => $request->username,             "password" => $request->password         ])->first();         if ($user)          {             session(["user" => $user->username, "password" => $user->password]);             return back();         }         else return back()->with("login_attempt", "failed");     }      public function logout()     {         session()->forget("user", "password");         return back();     }      public function save_user(request $request)     {         $errors = [];          //data validation         $input = $request->all();          if ( in_array(null, $input) )              $errors["empty_fields"] = true;          if ( !preg_match("/[a-za-z0-9 ]{3,16}/", $input["username"]) )              $errors["invalid_username"] = true;          if ( $input["password"] != $input["password_confirm"] )              $errors["unmatching_passwords"] = true;          if ( !preg_match("/[a-za-z0-9\-\.]{3,16}@[a-za-z0-9](\.[a-z0-9]){1,2}/", $input["email"]) )              $errors["invalid_email"] = true;          if ( usersmodel::where("username", $input["username"])->first() )              $errors["username_taken"] = true;          if (count($errors) > 0) return view("registration.form", ["err" => $errors, "request" => $request]);         else return view("registration.save", ["request" => $request]);     } } 

you incorrectly trying pass ad-hoc paramter handle function in middleware parameter.

when define this:

public function handle($request, closure $next, userauth $user) 

that means middleware expecting parameter passed in there, not come di container, hence $user variable null, failing pass type-hint constraint.

the parameters allowed here "roles", cannot pass random , expect di container resolve it.

i suggest try instead:

public function handle($request, closure $next) {     if($request->user()->islogged()) {         return $next($request);     } else {         return redirect('login'); // or whatever route     } } 

for work, need define islogged function part of trait, add app\user model.

please see:

https://laracasts.com/discuss/channels/laravel/pass-variable-from-route-to-middleware

https://laravel.com/docs/5.4/middleware#middleware-parameters


Comments

Popular posts from this blog

python - Selenium remoteWebDriver (& SauceLabs) Firefox moseMoveTo action exception -

html - How to custom Bootstrap grid height? -

transpose - Maple isnt executing function but prints function term -