Php Laravel中间件抛出一个错误,依赖性需要实现契约,而它确实需要

Php Laravel中间件抛出一个错误,依赖性需要实现契约,而它确实需要,php,laravel,middleware,contracts,Php,Laravel,Middleware,Contracts,类型错误:传递给App\Http\Middleware\UserAuthMiddleware::handle()的参数3必须实现接口App\Contracts\UserAuth,未给定,在第148行的C:\wamp64\www\laravel\vendor\laravel\framework\src\light\Pipeline\Pipeline.php中调用 我从中间件中得到这个错误,但是当我在控制器中使用给定的契约时,它工作得很好。有人知道发生了什么事吗 中间件文件 namespace Ap

类型错误:传递给App\Http\Middleware\UserAuthMiddleware::handle()的参数3必须实现接口App\Contracts\UserAuth,未给定,在第148行的C:\wamp64\www\laravel\vendor\laravel\framework\src\light\Pipeline\Pipeline.php中调用

我从中间件中得到这个错误,但是当我在控制器中使用给定的契约时,它工作得很好。有人知道发生了什么事吗

中间件文件
namespace App\Http\Middleware;

use Closure;
use App\Contracts\UserAuth;

class UserAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, UserAuth $user)
    {
        return $next($request);
    }
}
UserAuth服务文件

namespace App\Http\Middleware;

use Closure;
use App\Contracts\UserAuth;

class UserAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, UserAuth $user)
    {
        return $next($request);
    }
}
<?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;
    }
}
路线

namespace App\Http\Middleware;

use Closure;
use App\Contracts\UserAuth;

class UserAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, UserAuth $user)
    {
        return $next($request);
    }
}
//REGISTRATION ROUTES
Route::get("/register", "User@register")->middleware("user_auth");
Route::post("/register", "User@save_user")->middleware("user_auth");
具有工作合同的用户控制器

namespace App\Http\Middleware;

use Closure;
use App\Contracts\UserAuth;

class UserAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, UserAuth $user)
    {
        return $next($request);
    }
}
<?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]);
    }
}

您错误地试图将特殊参数传递给中间件参数中的handle函数

定义此项时:

public function handle($request, Closure $next, UserAuth $user)
这意味着中间件希望在其中传递一个参数,它不会来自DI容器,因此$user变量为null,无法传递类型提示约束

此处允许的参数仅适用于“角色”,您不能随机传递某个参数,而期望DI容器解析它

我建议您尝试以下方式:

public function handle($request, Closure $next)
{
    if($request->user()->isLogged()) {
        return $next($request);
    } else {
        return redirect('login'); // or whatever route
    }
}
为此,您需要将
isloged
函数定义为Trait的一部分,并将其添加到
App\User
模型中

请参阅:


您能显示使用此中间件的控制器或路由代码吗?您能发布:App\Contracts\UserAuth sourceAdded controller and routes,@Cyril现在它几乎是空文件,只有接口UserAuth定义。如果我从中间件中删除UserAuth,它会正常工作!我认为中间件可以像控制器一样从服务容器解析类,但我错了。我刚刚将其更改为在中间件中声明
$user
,如下所示:
$user=app()->make(UserAuth::class)。现在可以了。谢谢你的帮助!