在Laravel 5中将数组转换为请求对象

15

我在用户控制器中有一个存储方法,就像这样

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() 的第一个参数必须是 Illuminate\Http\Request 的实例,

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


在执行 app('\App\Http\Controllers\UserController')->store($request); 之前,如何获取 $request 数组? - Alexey Mezenin
为什么$request是test的参数?你最好使用setUp或数据提供程序。 - ohhh
5个回答

47

只需要使用

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

8

使用$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类型。

希望这能解决您的问题。


1
我应该如何将数组转换为请求对象?
如果你真的想这样做,虽然我不建议,但是这里有一个方法:
像这样的代码应该可以解决问题 - 我没有测试过:
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);

1
我不认为你能够以这种方式使用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,但我不能在模型中添加方法,因为在此之前我已经在控制器中添加了任何方法。 - paranoid
我觉得你没有理解我的意思。你可以将与数据库相关的逻辑放在一个模型类中。然后,你就可以从任何控制器和任何操作(从test()store())中调用它。这是 MVC 模式的正确使用。 - Alexey Mezenin
我在用户控制器的存储方法中有验证和另一件事情,如果我在模型中使用,我会在测试控制器中写下这个:User::create($request); - paranoid
这就是为什么Laravel允许您创建自定义请求类进行验证的原因:https://laravel.com/docs/5.0/validation#form-request-validation - Alexey Mezenin

-2

为什么不使用闪存会话数据来重定向呢?正如响应-使用闪存会话数据重定向文档所说:

通常同时进行重定向到新的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')->with('user', $userModel);


你不理解我的问题,我想在其他地方使用控制器方法来访问REST API。 - paranoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接