Laravel 8 Illuminate\Foundation\Http\FormRequest 且 Ajax 错误 403 禁止访问
Laravel 8 Illuminate\Foundation\Http\FormRequest with Ajax Error 403 Forbidden
我正在重新制作网站的一部分,并决定使用 Laravel 8 及其内置的存储库模式。我设置了项目,首先在处理所有首页方法的 WelcomeController 中完成了所有工作。一切都很好。
然后我提取了 WelcomeController 方法的部分功能
1> 表单验证 => App\Http\Requests\WelcomeRequest
2> 使用的方法 => App\Interfaces\WelcomeInterface
3> 实现的方法=> App\Repositories\WelcomeRepository
4> 注入接口=> App\Http\Controllers\WelcomeController
5> 绑定接口 + 存储库 => Providers\RepositoryWebServiceProvider
6> 注册服务商RepositoryWebServiceProvider
=> config/app.php
7> 命令 => php artisan config:cache
& composer dump-autoload
首页已加载。欢呼!
然后,我使用 ajax 发布了联系表单值,并收到了一个 403 Forbidden
http 响应代码。
A] 为了尝试解决这个问题,我将 WelcomeController store
方法中的 WelcomeRequest
参数替换为 Illuminate\Http\Request
的实例,并将请求存入 WelcomeController store
方法。
B] 但是在注入的接口方法 $this->welcomeInterface->contactEmail($request)
上再次出现错误消息 expected WelcomeRequest $request instance Illuminate\Http\Request given
。
C] 403 forbidden 错误只会在实例化App\Http\Requests\WelcomeRequest
class 时发生。
App\Http\Controllers\WelcomeController
use App\Http\Requests\WelcomeRequest;
use App\Interfaces\web\WelcomeInterface;
class WelcomeController extends Controller
{
protected $welcomeInterface;
public function __construct(WelcomeInterface $welcomeInterface)
{
$this->welcomeInterface = $welcomeInterface;
}
// ...
public function store(WelcomeRequest $request) // the request argument causes the error
{
return $this->welcomeInterface->requestContact($request);
}
Routes\web.php
Route::post('/email-contact', [App\Http\Controllers\WelcomeController::class, 'store'])->name('email-contact');
App\Http\Requests\WelcomeRequest
class WelcomeRequest extends FormRequest
{
public function authorize()
{
return false;
}
public function rules()
{
return [
'name'=> 'required|string|max:60',
'email'=> 'required|string|email|max:255',
'subject' => 'required|string|max:60',
'message' => 'nullable|string|max:300',
];
}
public function messages()
{
return [
'name.required' => 'Your name is required and should not exceed maximum length of 60.',
'name.max' => 'Your name is required and should not exceed maximum length of 60.',
'email.required' => 'Email is required.',
'email.email' => 'Email is incorrect format.',
'subject.required' => 'The subject is required and should not exceed maximum length of 60.',
'subject.max' => 'The subject is required and should not exceed maximum length of 60.',
'message.max' => 'Comment maximum length exceeded.',
'message.string' => 'Comment is invalid format.',
];
}
}
我的问题是为什么使用扩展 Illuminate\Foundation\Http\FormRequest
的 App\Http\Requests\WelcomeRequest
class 会给我一个 403 Forbidden
http 响应?我该如何解决?
解决了。 WelcomeRequest
class 在允许验证之前需要被授权。因此我改变了下面的方法 return --
public function authorize()
{
return true;
}
我正在重新制作网站的一部分,并决定使用 Laravel 8 及其内置的存储库模式。我设置了项目,首先在处理所有首页方法的 WelcomeController 中完成了所有工作。一切都很好。
然后我提取了 WelcomeController 方法的部分功能
1> 表单验证 => App\Http\Requests\WelcomeRequest
2> 使用的方法 => App\Interfaces\WelcomeInterface
3> 实现的方法=> App\Repositories\WelcomeRepository
4> 注入接口=> App\Http\Controllers\WelcomeController
5> 绑定接口 + 存储库 => Providers\RepositoryWebServiceProvider
6> 注册服务商RepositoryWebServiceProvider
=> config/app.php
7> 命令 => php artisan config:cache
& composer dump-autoload
首页已加载。欢呼!
然后,我使用 ajax 发布了联系表单值,并收到了一个 403 Forbidden
http 响应代码。
A] 为了尝试解决这个问题,我将 WelcomeController store
方法中的 WelcomeRequest
参数替换为 Illuminate\Http\Request
的实例,并将请求存入 WelcomeController store
方法。
B] 但是在注入的接口方法 $this->welcomeInterface->contactEmail($request)
上再次出现错误消息 expected WelcomeRequest $request instance Illuminate\Http\Request given
。
C] 403 forbidden 错误只会在实例化App\Http\Requests\WelcomeRequest
class 时发生。
App\Http\Controllers\WelcomeController
use App\Http\Requests\WelcomeRequest;
use App\Interfaces\web\WelcomeInterface;
class WelcomeController extends Controller
{
protected $welcomeInterface;
public function __construct(WelcomeInterface $welcomeInterface)
{
$this->welcomeInterface = $welcomeInterface;
}
// ...
public function store(WelcomeRequest $request) // the request argument causes the error
{
return $this->welcomeInterface->requestContact($request);
}
Routes\web.php
Route::post('/email-contact', [App\Http\Controllers\WelcomeController::class, 'store'])->name('email-contact');
App\Http\Requests\WelcomeRequest
class WelcomeRequest extends FormRequest
{
public function authorize()
{
return false;
}
public function rules()
{
return [
'name'=> 'required|string|max:60',
'email'=> 'required|string|email|max:255',
'subject' => 'required|string|max:60',
'message' => 'nullable|string|max:300',
];
}
public function messages()
{
return [
'name.required' => 'Your name is required and should not exceed maximum length of 60.',
'name.max' => 'Your name is required and should not exceed maximum length of 60.',
'email.required' => 'Email is required.',
'email.email' => 'Email is incorrect format.',
'subject.required' => 'The subject is required and should not exceed maximum length of 60.',
'subject.max' => 'The subject is required and should not exceed maximum length of 60.',
'message.max' => 'Comment maximum length exceeded.',
'message.string' => 'Comment is invalid format.',
];
}
}
我的问题是为什么使用扩展 Illuminate\Foundation\Http\FormRequest
的 App\Http\Requests\WelcomeRequest
class 会给我一个 403 Forbidden
http 响应?我该如何解决?
解决了。 WelcomeRequest
class 在允许验证之前需要被授权。因此我改变了下面的方法 return --
public function authorize()
{
return true;
}