请求>除了给我一个数组而不是 laravel 5 中的请求对象


Request->except give me an array instead of a Request object in laravel 5

$request->except(['param1'])给了我一个数组,我想接收一个Request对象。

我不知道该怎么做...

$employee = EmployeeSnap::firstOrNew(['nss' => $request->nss, 'rfc' => $request->rfc]);
        if ($employee->name != null && $employee->name != "") {
            $employee->setData(Input::except(['bankid', 'bankaccount'])); //Input::except(['bankid', 'bankaccount']) gives me array instead of Request
        } else {
            $employee->setData($request);
        }
        $employee->save();
        $id = $employee->employeeid;
        $code = 200;
        $data = 'Success';
        $message = 'Operation successful';

知道吗?

选项 1

您可以尝试克隆Request对象并取消设置不需要的变量,如 @AlexeyMezenin 所述。但是,这只是一个浅拷贝,因此与原始请求相关的任何对象都将是与新请求相关的完全相同的对象。这可能会也可能不会给您带来问题。

选项 2

您还可以尝试生成新请求并替换输入。大致如下:

$newRequest = 'Illuminate'Http'Request::capture();
$newRequest->replace($request->except(['param1']));

但是,根据使用此新请求的方式,可能会导致不同的问题。

选项 3(最佳)

我认为问题的真正解决方案是更改EmployeeSnap模型上的setData()方法。 Request对象实际上应该只在控制器内部使用。控制器应负责与Request交互以获取所需的数据,然后应根据需要将该数据传递给模型。

因此,您的setData方法应如下所示:

public function setData(array $request) {
    // use your $request array
}

您的控制器应如下所示:

$employee = EmployeeSnap::firstOrNew(['nss' => $request->nss, 'rfc' => $request->rfc]);
if ($employee->name != null && $employee->name != "") {
    $employee->setData($request->except(['bankid', 'bankaccount']));
} else {
    $employee->setData($request->all());
}
// rest of code ...

这有助于分离您的顾虑,使您的代码更简洁,并解决您的问题。

我想我已经明白你想要什么以及为什么(感谢更新的代码帖子)。我想你将无法使用标准的Laravel方法做到这一点,但你可以做这样的事情:

$requestCopy = clone $request;
unset($requestCopy->bankid);
unset($requestCopy->bankaccount);

因此,您正在克隆 Request 类的实例,只需使用 unset() 从中删除不安全的属性。然后,您可以在代码中使用该$requestCopy。这是我能想象到的唯一方法。

这段代码只是一个示例,你可以做一些类似的事情,这将为你工作。