【问题标题】:Laravel is there a way to add values to a request arrayLaravel 有没有办法向请求数组添加值
【发布时间】:2016-09-03 14:58:33
【问题描述】:

我在 Laravel 中遇到一种情况,在调用带有 Request 参数的 store() 或 update() 方法以在调用 Eloquent 函数之前为请求添加一些额外的值,有什么办法吗?

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

【问题讨论】:

  • 您想进行哪种治疗?是否要将键值添加到 $request->all() 数组?
  • 是的,我需要添加一个键值
  • 你不能使用array_add() 助手吗? $array = array_add($request->all(), 'new_key', $value);:laravel.com/docs/5.2/helpers#method-array-add如果这不是你要找的东西,你能否为你的问题提供更多信息?
  • $request 是 php 对象,据我了解,如果您想在控制器内部添加一些功能,请将请求对象转换为数组,然后添加您想要的任何内容

标签: php laravel


【解决方案1】:

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

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

或者你可以union arrays:

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

但是,如果您真的想向 Request 对象添加内容,请执行以下操作:

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

【讨论】:

  • 是的,它现在对我有用,我已经将代码更改为函数 store(Request $request) { // 一些额外的逻辑或检查 $plan = 123; // 一些决定用户计划的逻辑 $request->request->add(['plan' => $plan]);用户::create($request->all()); }
  • 这不起作用,因为 $request->all() 是一个数组而不是一个集合。
  • 我猜肯定是$request->request->add(['variable' => 'value']);
  • $request->request->add ... 我收到错误消息「未定义变量:请求」但我有「使用 Illuminate\Http\Request;」为什么我收到错误消息?
  • 我需要 $request=collect();第一的? $resquest 是集合还是数组?
【解决方案2】:

参考Alexey Mezenin答案:

在使用他的答案时,我不得不直接向请求对象添加一些内容并使用:

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

使用它添加两个变量:

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

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

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

希望我为您节省了一些时间

PS:谢谢@Alexey,你的回答真的帮助了我

【讨论】:

  • $request->request->add ... 我收到错误消息「未定义变量:请求」但我有「使用 Illuminate\Http\Request;」为什么我收到错误消息?
  • @robspin 我认为它已经很晚了,但你可能没有在函数中注入请求例如:function (Request $request)
  • 对于那些正在寻找为什么您的值没有插入数据库的人,因为我没有在我的Model 类中声明数据库的值:protected $fillable = ['slug'];
【解决方案3】:

要为 ex:newParam 添加一个新参数到当前的 Request 对象,你可以这样做:

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

添加新参数后,您可以通过以下方式看到这个新添加的参数到 Request 对象:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      第一个中间件

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

      第二个中间件

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

      【讨论】:

      • 那个$request->merge() 方法FTW!谢谢。
      【解决方案6】:

      你也可以使用下面的代码

      $request->request->set(key, value).

      更适合我。

      【讨论】:

      • 至少在 Laravel 5.6 中是这样的!很好的答案
      【解决方案7】:
      $request->offsetSet(key, value);
      

      【讨论】:

        【解决方案8】:

        我在 Laravel 5.2 中尝试了 $request->merge($array) 函数,它运行良好。

        例子:

        $request->merge(["key"=>"value"]);
        

        【讨论】:

          【解决方案9】:

          可以通过$request['key'] = 'value'直接访问请求数组;

          【讨论】:

            【解决方案10】:

            关于这个主题已经说得够多了,但我忍不住要添加我自己的答案。我相信最简单的方法是

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

            【讨论】:

              【解决方案11】:

              根据我的观察

              $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-&gt;request-&gt;add(['variable' =&gt; 'value']); 更好,因为可以初始化,并且添加 请求值适用于所有方法(GETPOST , PUT, DELETE)

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

              标签: laravel5.8.11

              【讨论】:

                【解决方案12】:

                我用过和研究过的最好的是$request-&gt;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 行。

                【讨论】:

                  【解决方案13】:

                  您可以通过以下方式从中间件向请求添加参数:

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

                  【讨论】:

                    【解决方案14】:

                    你可以使用 laravel helper 和 request() 魔法方法...

                    request()->request->add(['variable1'=>'value1','variable2'=>'value2']);
                    

                    【讨论】:

                      【解决方案15】:

                      如果你想在Request对象中添加查询参数,可以通过调用获取

                      $request->get('key') 
                      

                      $request->all()
                      

                      以下内容对我很有效。

                      $request->query->set('key','value');
                      

                      【讨论】:

                        【解决方案16】:

                        只需使用这个:-

                        $request->merge(['index' => 'value']);
                        

                        为我工作

                        这将使用给定索引向您的请求对象添加一个新值,并且可以在您的函数中使用它或将所有请求数据保存到数据库中。

                        【讨论】:

                        • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-11-28
                        • 2020-10-09
                        • 1970-01-01
                        • 2022-11-27
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多