Laravel:同一控制器能否引入两个不同Password类?报错求助
问题
在Laravel项目中,同时引入Illuminate\Validation\Rules\Password(用于配置密码验证规则)和Illuminate\Support\Facades\Password(用于实现密码重置功能)时,应用程序出现报错。相关代码示例如下:
注册验证代码:
<?php namespace App\Http\Controllers; use Carbon\Carbon; use App\Models\User; use Illuminate\Support\Str; use Illuminate\Http\Request; use App\Mail\PasswordResetMail; use Illuminate\Validation\Rule; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; use function GuzzleHttp\Promise\all; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Mail; use Illuminate\Auth\Events\PasswordReset; use Illuminate\Validation\Rules\Password; use Illuminate\Support\Facades\Password; class UserController extends Controller { // 显示注册表单 public function create() { return view('users.register'); } // 创建新用户 public function store(Request $request) { $formFields = $request->validate([ 'name' => ['required', 'min:3', 'max:255', Rule::unique('users', 'name')], 'email' => ['required', 'email', Rule::unique('users', 'email')], 'password' => [ 'required', 'confirmed', Password::min(8) ->max(255) ->mixedCase() ->letters() ->numbers() ->symbols() ->uncompromised(), ], ]);
密码重置代码:
// 提交忘记密码请求 public function forgotSubmit(Request $request) { $request->validate(['email' => 'required|email']); $status = Password::sendResetLink( $request->only('email') ); return $status === Password::RESET_LINK_SENT ? back()->with(['status' => __($status)])->with('reset', '密码重置链接已发送至您的邮箱!') : back()->withErrors(['email' => __($status)]); }
疑问:是否可以在同一控制器文件中使用这两个不同的类?该如何解决当前的报错问题?
解决方案
完全可以在同一控制器中使用这两个类,报错的核心原因是两个类的名称均为Password,PHP无法区分你调用的是哪一个。有两种简单的解决方法:
方法一:给类设置别名引入
在use语句中给其中一个类设置别名,通过别名区分两个类的调用:
// 给验证规则的Password类设置别名 use Illuminate\Validation\Rules\Password as PasswordRule; // 保留密码重置的Facade类 use Illuminate\Support\Facades\Password;
之后在代码中分别调用:
// 注册验证时使用别名 'password' => [ 'required', 'confirmed', PasswordRule::min(8) ->max(255) ->mixedCase() ->letters() ->numbers() ->symbols() ->uncompromised(), ], // 密码重置时使用原类名 $status = Password::sendResetLink( $request->only('email') );
方法二:使用完全限定类名调用
如果不想设置别名,可以在调用时直接写完整的类路径,无需use其中一个类:
比如移除use Illuminate\Validation\Rules\Password;,然后在验证规则中这样编写:
'password' => [ 'required', 'confirmed', \Illuminate\Validation\Rules\Password::min(8) ->max(255) ->mixedCase() ->letters() ->numbers() ->symbols() ->uncompromised(), ],
密码重置的Password::sendResetLink()依然保留原有的use和调用方式即可。
内容的提问来源于stack exchange,提问作者Jasper Kenneth Samson
相关产品推荐
相关产品推荐

