Laravel有一种向请求数组添加值的方法


113

我在使用请求参数调用store()或update()方法以在请求Eloquent函数之前向请求添加一些附加值的时候遇到了Laravel的情况,对此有什么解决方法。

function store(Request $request) 
{
  // some additional logic or checking
  User::create($request->all());
}

您想进行哪种治疗?是否要向$request->all()数组添加键值?
Hammerbot

是的,我需要添加一个键值
Vijayanand Premnath

您不能使用array_add()助手吗?$array = array_add($request->all(), 'new_key', $value);laravel.com/docs/5.2/helpers#method-array-add如果这不是您想要的那种东西,您能为您的问题提供更多信息吗?
Hammerbot

$ request是php对象,据我了解,如果您想在控制器旁边添加一些功能,请将请求对象转换为数组,然后添加所需的内容
Chathura Hettiarachchi

Answers:


207

通常,您不希望向Request对象添加任何内容,最好使用collection和put()helper:

function store(Request $request) 
{
    // some additional logic or checking
    User::create(array_merge($request->all(), ['index' => 'value']));
}

或者你可以联合数组

User::create($request->all() + ['index' => 'value']);

但是,如果您确实想向Request对象添加某些内容,请执行以下操作:

$request->request->add(['variable' => 'value']); //add request

3
是的,它现在对我有用。我已将代码更改为函数store(Request $ request){//一些其他逻辑或检查$ plan = 123; //决定用户计划的一些逻辑$ request-> request-> add(['plan'=> $ plan]); 用户:: create($ request-> all()); }
Vijayanand Premnath

1
这不起作用,因为$ request-> all()是一个数组而不是一个集合。
kjdion84

1
我猜它一定是$ request-> request-> add(['variable'=>'value']);
谢尔盖·奥尼申科

$ request-> request-> add ...我收到错误消息“未定义的变量:request”,但是我却收到了“ use Illuminate \ Http \ Request;”为什么收到错误消息?
robspin

我需要$ request = collect();吗?第一?$ request是集合或数组吗?
robspin

58

参考Alexey Mezenin答案:

在使用他的答案时,我必须直接向Request Object添加一些内容并使用:

$request->request->add(['variable', 'value']);

使用它添加了两个变量:

$request[0] = 'variable', $request[1] = 'value'

如果您是像我这样的新手,并且需要一个关联数组,那么正确的方法是

$request->request->add(['variable' => 'value']);

希望我节省了一些时间

PS:谢谢@Alexey,您的回答确实帮助了我


$ request-> request-> add ...我收到错误消息“未定义的变量:request”,但是我却收到了“ use Illuminate \ Http \ Request;”为什么收到错误消息?
robspin

@robspin我认为已经很晚了,但是您可能没有将请求注入函数Eg:function(Request $ request)
mushood badulla

1
对于那些正在寻找为什么您的值没有插入数据库的人,因为我没有在我的Model班级中声明数据库的值:protected $fillable = ['slug'];
fWd82 '20


17

在这个问题上已经足够说了,但是我无法拒绝添加自己的答案。我认为最简单的方法是

request()->merge([ 'foo' => 'bar' ]);

16

在laravel 5.6中,我们可以在中间件之间传递参数,例如:

第一中间件

public function handle($request, Closure $next, ...$params)
{
    //some code
    return $next($request->merge(['key' => 'value']));
}

SecondMiddleware

public function handle($request, Closure $next, ...$params)
{
    //some code
    dd($request->all());
}

1
那个$request->merge()方法FTW!谢谢。
马丁·乔纳


4

要将ex:的新参数添加newParam到当前Request对象,您可以执行以下操作:

$newParam = "paramvalue";
$request->request->add(['newParam' => $newParam]);

添加新参数后,您可以通过以下方式将此新添加的参数查看到Request对象中:

dd($request);//prints the contents of the Request object

3

根据我的观察

$request->request->add(['variable' => 'value']);(大多数)可以在POST,PUT和DELETE方法中工作,因为传递了值,其中之一是_token。像下面的例子。

<form action="{{ route('process', $id) }}" method="POST">
    @csrf
</form>

public function process(Request $request, $id){
    $request->request->add(['id' => $id]);
}

但是[下面的代码]无法使用,因为没有传递任何值,它实际上并没有增加。

<a href='{{ route('process', $id) }}'>PROCESS</a>

public function process(Request $request, $id){
    $request->request->add(['id' => $id]);
}


使用GET方法时,您可以声明Request并直接为其赋值。如下所示:

public function process($id){
    $request = new Request(['id' => $id]);
}

或者您可以使用merge。这实际上要好于$request->request->add(['variable' => 'value']);因为可以初始化,并添加对所有方法(GETPOSTPUTDELETE)都适用的请求值

public function process(Request $request, $id){
    $request->merge(['id' => $id]);
}

标签: laravel5.8.11


2

我使用此代码向请求添加了一些内容。

$req->query->add(['key'=>'variable']);
$req->request->add(['key'=>'variable']);


2

我使用过的最好的方法是$ request-> merge([])(检查我的代码):

    public function index(Request $request) {
        not_permissions_redirect(have_premission(2));
        $filters = (!empty($request->all())) ? true : false;
        $request->merge(['type' => 'admin']);
        $users = $this->service->getAllUsers($request->all());
        $roles = $this->roles->getAllAdminRoles();
        return view('users.list', compact(['users', 'roles', 'filters']));
    }

检查索引函数中的第3行。


0

您可以执行以下操作将参数添加到中间件的请求中:

public function handle($request, Closure $next)
{
    $request->route()->setParameter('foo', 'bar');
    return $next($request);
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.