【问题标题】:Convert array to Request object in laravel 5在laravel 5中将数组转换为请求对象
【发布时间】:2016-08-26 19:22:31
【问题描述】:

我在用户控制器中有这样的存储方法

public function store(Request $request)
{
    User::create($request->all()); 

}

在另一个控制器中我想使用这个方法

 public function test(Request $request)
{
  .....
   app('\App\Http\Controllers\UserController')->store($test_array);
  ...
}

$test_array 是:

{"name":"test","email":"test@gmail.com"}

最后告诉我这个错误

传递给 App\Http\Controllers\UserController::store() 的参数 1 必须是 Illuminate\Http\Request 的实例,

如何将数组转换为 Request 对象?

【问题讨论】:

  • 如何在app('\App\Http\Controllers\UserController')->store($request);之前得到$request数组?
  • 为什么 $request 首先是 test 的参数?您最好使用setUp 或数据提供者

标签: php laravel laravel-5 laravel-5.1


【解决方案1】:

随便用

$request = new Illuminate\Http\Request($test_array);

【讨论】:

    【解决方案2】:

    使用$request->merge($someArray)

    你可以试试这个方法..

    您的第二个控制器的测试方法。

    public function test(Request $request)
    {
      $another_array = [];
      $another_array['eg'] = $test_array;
      $request->merge($another_array);
    
      .....
       app('\App\Http\Controllers\UserController')->store($request->get('eg'));
      ...
    }
    

    你的$test_array必须是array的类型

    希望这能解决您的问题。

    【讨论】:

      【解决方案3】:

      我认为你不能以这种方式使用store()

      如果您从其他地方调用 store() 操作,您可以将持久化逻辑放入模型中:

      class User extends Model
      
          public function storeData($data)
          {
              $createdUser = User::create($data);
              return $createdUser;
          }
      

      然后从store() 操作和test() 调用它。

      如果不只是,只需将store() 更改为:

      public function store($data)
      {
          User::create($data); 
      }
      

      【讨论】:

      • 感谢@Alexey,但我无法在模型中添加方法,因为在此之前我在控制器中添加了任何方法
      • 我想你没明白我的意思。您可以将与数据库相关的逻辑放在模型类中。然后您就可以从任何控制器和您想要的任何操作(来自test()store())调用它。这就是 MVC 模式的正确用法。
      • 我在用户控制器的存储方法中有验证和另一件事,如果我在模型中使用,我会在测试控制器中写这个 User::create($request);
      • 这就是 Laravel 允许您创建自定义请求类进行验证的原因:laravel.com/docs/5.0/validation#form-request-validation
      【解决方案4】:

      如何将数组转换为 Request 对象?

      如果你真的想这样做,而我不会这样做,那么你就是:

      这样的东西应该可以解决问题——我没有测试它:

      use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
      use Symfony\Component\HttpFoundation\ParameterBag;
      use Illuminate\Http\Request as IlluminateRequest;
      
      
      $symfonyRequest = SymfonyRequest::createFromGlobals();
      
      $symfonyRequest->query = new ParameterBag([
          'foo' => 'bar',
      ]);
      
      $request = IlluminateRequest::createFromBase($symfonyRequest);
      

      【讨论】:

        【解决方案5】:

        为什么不使用闪现的会话数据进行重定向?正如Response - Redirecting With Flashed Session Data 文档所说:

        重定向到新的 URL 并将数据闪烁到会话是 通常同时进行。因此,为方便起见,您可以创建一个 RedirectResponse 实例和闪存数据在单个会话中 方法链。这对于存储状态特别方便 操作后的消息:

        Route::post('user/profile', function () {
            // Update the user's profile...
        
            return redirect('dashboard')->with('status', 'Profile updated!');
        });
        

        当然,在用户被重定向到一个新页面后,你可以 从会话中检索并显示闪现的消息。为了 例如,使用 Blade 语法:

        @if (session('status'))
            <div class="alert alert-success">
                {{ session('status') }}
            </div>
        @endif
        

        因此,在您的情况下,您将存储 return redirect('dashboard')-&gt;with('user', $userModel);

        【讨论】:

        • 你不明白我的问题,我想在其他地方使用控制器方法来 REST API
        猜你喜欢
        • 1970-01-01
        • 2017-10-15
        • 2021-02-11
        • 2019-07-19
        • 2014-11-28
        • 2016-03-14
        • 2019-11-15
        • 2015-10-06
        • 2018-02-16
        相关资源
        最近更新 更多