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
Post a Comment