Laravel 11控制器方法未调用及isAdmin中间件不存在问题排查
Laravel用户编辑表单提交问题排查与解决
问题情况
我开发了用户编辑表单,表单提交路由为user.update,采用PUT方法。web.php中配置了用户编辑的GET与PUT路由,均挂载isAdmin中间件。但控制器的editUsersPost方法里加了dd('123')却从来没被调用过。另外app.php的中间件配置项是空的,后来把路由改成带auth和isAdmin的路由组后,又出现错误:Target class [isAdmin] does not exist。
问题原因&解决办法
1. isAdmin中间件未注册
Laravel找不到isAdmin中间件,是因为没在应用中注册它。在app.php的withMiddleware闭包里添加中间件别名注册:
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'isAdmin' => \App\Http\Middleware\IsAdmin::class, // 对应你实际的中间件文件路径和类名 ]); }) ->withExceptions(function (Exceptions $exceptions) { // })->create();
注意:确保IsAdmin.php文件在app/Http/Middleware目录下,类名首字母必须大写(PHP类名区分大小写)。
2. 路由重复冲突
原路由和调整后的路由路径不一致(一个末尾带斜杠一个不带),导致请求匹配混乱。删掉单独的PUT路由,统一用路由组配置:
Route::group(['middleware' => ['auth', 'isAdmin']], function() { Route::get('dashboard/crud/users/{id}/edit', [\App\Http\Controllers\UserCrudController::class, 'editUsers']); Route::put('dashboard/crud/users/{id}/edit', [\App\Http\Controllers\UserCrudController::class, 'editUsersPost'])->name('user.update'); });
3. 表单验证失败拦截请求
ProfileUpdateRequest里的邮箱验证规则有误,$this->user()->id取的是当前登录用户ID,但我们编辑的是路由参数里的{id}用户,导致验证失败,请求直接被拦截,到不了控制器的dd代码。修改验证规则:
use Illuminate\Validation\Rule; use App\Models\User; class ProfileUpdateRequest extends FormRequest { public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($this->route('id'))], ]; } }
还可以在表单里添加错误提示,方便快速排查验证问题:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
4. 控制器方法关键字大小写错误
控制器里的Public应该改成小写public,PHP关键字区分大小写,写错会导致方法无法正常调用:
public function editUsersPost(ProfileUpdateRequest $request, $id): RedirectResponse { dd('123'); $user = User::findOrFail($id); $user->fill($request->validated()); if ($user->isDirty('email')) { $user->email_verified_at = null; } $user->save(); return Redirect::route('dashboard.crud.users')->with('status', 'profile-updated'); }
内容的提问来源于stack exchange,提问作者Marius Clément
相关产品推荐
相关产品推荐

