【问题标题】:Laravel - limit FormRequest to certain parametersLaravel - 将 FormRequest 限制为某些参数
【发布时间】:2017-05-23 18:08:35
【问题描述】:

在表单请求类中,我使用这样的方法来验证输入数据。

class SignupRequest extends FormRequest
{
...
    public function rules()
    {
        return [
            'user.email' => 'required_with:user|email',
            'user.domain_name' => 'required_with:user|string',
            'user.password' => 'required_with:user|string|min:8',
            'user.username' => 'required_with:user',
        ];
    }
...
}

稍后在控制器中我使用类似的东西

 $data = $request->get('user', []);
 return $this->response($this->userService->create($data, false), 201);

我想以某种方式写入我的 SignupRequest 应该允许传递哪些字段。因此,当后来我收到$data = $request->get('user', []); 时,我确信其中只有允许的字段。

这可能在 FormRequest 中吗?

附:我知道$request->only(['field1', 'field2', 'field3']) 的方式,但是如果我想限制SignupRequest extends FormRequest 中的字段。因为如果我在我的代码中多次使用$request->only([...]),我将不得不多次更改它。我想把它放在一个地方。

【问题讨论】:

  • 你总是可以做 $request->only(['field1', 'field2', 'field3']) 这将只返回一个指定请求参数的数组。
  • 永远不要相信来自表单的字段,您需要始终剥离或验证它,因为@Yasen Slavov 说您只能请求特定字段,如果您请求所需数据并存储在新数组中,然后创建用户。
  • laravel.com/docs/5.4/requests#retrieving-input 向下滚动到“检索输入数据的一部分” - 仅使用/除外来检索您真正想要的数据(输入数据的子集)。
  • $request->only(['field1', 'field2', 'field3']) 变体有效,但如果我在多个地方使用请求,我需要一次又一次地列出这些字段。以后如果我想更改字段列表,我必须在几个地方执行此操作。这就是为什么我在SignupRequest extends FormRequest 中询问如何执行此操作以将登录信息保存在一个地方。
  • 您可以在 SignupRequest 类中添加一个方法,例如 SignupRequest->getSubsetParams() 返回所需字段的数组,然后您可以使用 $request->getSubsetParams()使用该请求的控制器方法。

标签: php laravel


【解决方案1】:

您不需要对请求执行此操作。

一种选择是执行以下操作:

$user = $request->input('user', []);
$data = array_only($user, ['email', 'domain_name', 'password', 'username']);

或者你甚至可以内联它:

$data = array_only($request->input('user', []), ['email', 'domain_name', 'password', 'username']);

希望这会有所帮助!

【讨论】:

  • 我想将登录信息保存在一个地方。这我必须在几个地方潜在地使用。如果我想稍后更改字段列表,我会在几个地方进行更改。这就是为什么我要求将其限制在 FormRequest 类中。
【解决方案2】:

FormRequest 旨在验证您的请求数据,而不是控制它们。通过这样做,您始终可以提取所需的输入。

$data = $request->only(['user.name', 'user.password']);

编辑:根据您的评论,您可以执行以下操作。这允许您将所有字段名称存储在单个请求中,以使它们保持井井有条且更易于更新。

将此添加到您的SignupRequest

public function loginData()
{
    return array_only($this->input('user', []), ['username', 'password']);
}

像这样在控制器中使用它

$request->loginData();

return $this->response($this->userService->create($request->loginData(), false), 201);

【讨论】:

  • 我想将登录信息保存在一个地方。这我必须在几个地方潜在地使用。如果我想稍后更改字段列表,我会在几个地方进行更改。这就是为什么我要求将其限制在 FormRequest 类中。
  • @Gruz 检查我对答案的编辑。它应该做你需要的事情,并保持你想要的方式。
猜你喜欢
  • 2017-11-27
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多