Laravel初始化ValidationFactory报错:Target无法实例化
问题解决:Target [Illuminate\contracts\Validation\Factory] 无法实例化
核心问题
你在请求类里引入的ValidationFactory契约命名空间写错了大小写——Laravel的契约类是Illuminate\Contracts\Validation\Factory(注意Contracts首字母大写),但你写成了Illuminate\contracts\Validation\Factory,容器找不到对应的实现类,所以抛出了无法实例化的错误。
修复步骤
1. 修正命名空间
打开loginrequest.php,把契约的引入语句改成:
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
2. 简化邮箱验证逻辑(可选)
其实没必要绕容器获取ValidationFactory,有更简单的方式:
要么用Laravel自带的Validator门面,要么直接用PHP原生函数验证邮箱,代码更清爽:
public function isMail($value){ // 方案1:用Validator门面 return \Illuminate\Support\Facades\Validator::make( ['username' => $value], ['username' => 'email'] )->passes(); // 方案2:用PHP原生函数,性能更好 // return filter_var($value, FILTER_VALIDATE_EMAIL) !== false; }
3. 额外的代码优化提示
- 按PSR规范,请求类名改成帕斯卡命名
LoginRequest.php,控制器里引入也对应改成use App\Http\Requests\LoginRequest; - 控制器
login方法里的验证逻辑写反了,应该是验证失败才跳转:
if( !Auth::validate($credentiales) ){ return redirect()->to('login')->withErrors('auth.failed'); }
authenticated方法里的跳转要用路由名称,别直接写字符串:
return redirect()->route('accountModule.indexusers');
修正后的完整请求类代码
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Factory as ValidationFactory; class LoginRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'username' => 'required', 'password' => 'required' ]; } public function getCredentials(){ $username = $this->get('username'); if( $this->isMail($username) ){ return [ 'email' => $username, 'password' => $this->get('password') ]; } return $this->only('username','password'); } public function isMail($value){ return \Illuminate\Support\Facades\Validator::make( ['username' => $value], ['username' => 'email'] )->passes(); } }
内容的提问来源于stack exchange,提问作者Julian Rodríguez
相关产品推荐
相关产品推荐

