如何使用真实 http 请求的模拟数据在命令行 REPL 工具 Tinker 中填充 Request object

How to fill Request object in command line REPL tool Tinker with emulated data of real http request

在我的项目中使用 Laravel 框架和名为 Tinker 的 REPL,我想将请求 object 设置为与我通过浏览器发出一些真正的 HTTP 请求时相同的状态。

当我使用

转储请求时
 dd($request);

我在 $request 中收到很多数据,例如 headers、表单输入数据等。

我想在 Tinker REPL $request 中接收相同的数据。

如何从命令行在 Tinker 中模拟 HTTP 请求?

您应该能够实例化一个请求对象,然后使用 replace 将一些输入数据输入其中。像这样的东西应该在 tinker 中工作...

>> $r = new Illuminate\Foundation\Http\FormRequest()

>> $r->replace(['yada' => 'bla bla bla'])

>> $r->yada

那应该输出 bla bla bla。

Request class 有一些方法来启动它,名称从 create 开始......并且 create 方法允许使用手动给定的参数启动它,例如 url,方法和其他可选参数:

Illuminate\Foundation\Http\FormRequest::create('http://your-url', 'METHOD', ...)

因此您可以从 REPL 使用它来玩您的控制器并启动它们,就像您来自某条路线一样

我知道这个问题很老了,但我最近想测试一个控制器 POST,发现很难找到答案,所以这是我的解决方案:

我创建了一个 formRequest class,我想在 Tinker 中对其进行测试。 class 看起来像这样:

    <?php

namespace App\Http\Requests;

use App\Models\Task;
use Carbon\Carbon;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class TaskRequest extends FormRequest
{
private $_validator;
private $_task;
/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
// public function authorize()
// {
//     return false;
// }

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'task_name' => ['required', 'max:100'],
        'task_description' => ['nullable', 'max:1024'],
        'due_date' => ['nullable', 'max:50','after:today'],
        // ... and more
    ];
}

public function validator() 
{
    return $this->_validator ?? $this->_validator = Validator::make($this->sanitize(), $this->rules());
}

/**
* Convert any of your incoming variables, such as dates to required format
**/
public function sanitize()
{
    // get request vars
    $vars = $this->all();
    if ( !empty($vars['due_date']) )
    {
        $date = new Carbon($vars['due_date'] );
        $vars['due_date'] = $date->toDateTimeString();
    }
    return $vars;
}


public function save()
{
    if ( $this->validator()->fails() )
        return false;

    return $this->_task = Task::create(
       $this->validator()->validated()
    );
}

在修补程序中:

 $form = new App\Http\Requests\TaskRequest();
 $form->merge(['task_name'=>'test task','due_date'=>'2022-04-22Z15:45:13UTC']);
 $form->validator()->validated(); 


=> [
 "task_name" => "test task",
 "due_date" => "2022-04-22 15:45:13"
]