【问题标题】:Request->except give me an array instead of a Request object in laravel 5Request->except 给我一个数组而不是 laravel 5 中的 Request 对象
【发布时间】:2016-03-15 16:53:09
【问题描述】:

$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';

有什么想法吗?

【问题讨论】:

    标签: php laravel laravel-5 httprequest


    【解决方案1】:

    选项 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 ...
    

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

    【讨论】:

      【解决方案2】:

      我想我已经了解您想要什么以及为什么(感谢更新的代码帖子)。我猜你不能用标准的 Laravel 方法做到这一点,但你可以这样做:

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

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

      此代码只是一个示例,您可以执行类似的操作。

      【讨论】:

      • 我测试了它,但它不起作用 -> 必须是 Illuminate\\Http\\Request 的实例,给定数组。我认为它正在工作,因为 PhpStorm 没有给我错误...
      猜你喜欢
      • 2016-01-05
      • 2017-08-03
      • 2020-06-07
      • 2020-05-23
      • 1970-01-01
      • 2016-07-01
      • 2019-01-31
      • 2020-06-06
      • 2020-06-20
      相关资源
      最近更新 更多