我正在开发一个API,因为我(大部分)具有相同的功能,我已经创建了一个抽象类,可以在我的控制器上进行扩展。
我的抽象类看起来像:http://laravel.io/bin/23Bzj
在控制器中我将用模型和响应构建(稍后可能会将响应移动到ApiController构造函数)。
class EventController extends ApiController
{
public function __construct(Event $model, ResponseRepository $response)
{
$this->model = $model;
$this->response = $response;
}
}
但问题是:我如何能够在我的ApiController中使用特定的Request
类来验证方法/什么是最佳实践。
我可以使用普通的Request
课程,但之后我不会在方法之前进行任何验证。
当我在EventController
时,我可以使用UpdateEventRequest
和CreateEventRequest
等等。
答案 0 :(得分:1)
据我所知,如果你在控制器中使用任何方法
public function edit(UpdateEventRequest $req) {
// any code
}
在启动// any code
之前将完成部分验证。
你可以尝试做什么:
update
方法更改为protected public function update(Request $request, $id)
更改为public function update($request, $id)
- 我不知道此步骤是否必要使用以下代码创建示例realUpdate
的新方法:
public function realUpdate(UpdateEventRequest $req, $id) {
parent::update($req, $id);
}
我不确定第2步,因为如果您在抽象类中使用Request
,我不知道Laravel是否会尝试运行任何验证。它也可能会再次针对UpdateEventRequest
运行此验证 - 您应该尝试一下,我还没有对其进行测试。
基本上你会有类似的代码:
<?php
class X
{
}
class Y extends X
{
}
abstract class ApiController
{
protected function update(X $x, $id)
{
echo "I have " . get_class($x) . ' and id ' . $id;
}
}
class Controller extends ApiController
{
public function realUpdate(Y $y, $id)
{
parent::update($y, $id);
}
}
$c = new Controller();
$c->realUpdate(new Y, 2);
并且Laravel应该至少运行一次基于UpdateEventRequest
规则的验证器。
在子类中,此方法的名称不能相同,因为您将收到警告:
严格标准:Controller :: update()的声明应该是 与......第31行中的ApiController :: update(X $ x,$ id)兼容
然而它仍然可以工作,但我认为你不想发出任何警告。