Laravel Request::all()不应该被静态调用。

4 浏览
0 Comments

Laravel Request::all()不应该被静态调用。

在Laravel中,我尝试在我的控制器的store()方法中调用$input = Request::all();,但是我遇到了以下错误:

非静态方法Illuminate\Http\Request::all()不应以静态方式调用,假定$this来自不兼容的上下文

有什么帮助可以找出最佳纠正方法吗?(我在跟随Laracast的教程)

0
0 Comments

Laravel中的静态调用Request::all()会出现问题,这篇文章将解释出现问题的原因并提供解决方法。

问题的原因是在Laravel中,静态调用Request::all()无法正常工作。在Laravel中,Request类被设计为实例化后使用,而不是静态调用。因此,如果我们在控制器中尝试静态调用Request::all(),将会导致错误。

为了解决这个问题,我们可以通过Laravel的魔术注入来将请求对象注入到控制器中,并以非静态方式访问它。具体的解决方法如下:

首先,在控制器的构造函数中注入请求对象。我们可以使用依赖注入来实现这一点。代码如下:

class MyController
{
   protected $request;
   public function __construct(\Illuminate\Http\Request $request)
   {
       $this->request = $request;
   }
   public function myFunc()
   {
       $input = $this->request->all();
   }
}

在上面的代码中,我们在控制器的构造函数中接收一个Request对象,并将其赋值给类的属性$request。然后,在myFunc()方法中,我们可以以非静态的方式访问$request对象,并使用all()方法来获取请求中的所有输入。

通过使用上述的解决方法,我们可以避免使用静态调用Request::all()时出现的问题。这样,我们就能够正常地获取请求中的所有输入数据了。

总结一下,本文介绍了在Laravel中静态调用Request::all()会出现问题的原因,并提供了解决方法。我们可以通过将请求对象注入到控制器中,并以非静态方式访问它来解决这个问题。希望本文对你有所帮助!

0
0 Comments

问题的原因是调用没有经过Request外观。

use Illuminate\Http\Request;

更改为

use Request;

它应该开始工作。

在config/app.php文件中,您可以找到一个类别名列表。在那里,您将看到基类Request已被别名为Illuminate\Support\Facades\Request类。因此,在命名空间文件中使用Request外观时,需要指定使用基类:use Request;

编辑

由于这个问题似乎有一些流量,我想更新一下答案,因为Laravel 5已经正式发布。

虽然上面的方法仍然是正确的并且可以工作,但是新的Controller模板中包含use Illuminate\Http\Request;语句,以帮助推动开发人员使用依赖注入而不是依赖外观。

当将Request对象注入到构造函数(或Laravel 5中可用的方法)中时,应注入Illuminate\Http\Request对象,而不是Request外观。

因此,与其更改Controller模板以适应Request外观,不如使用给定的Controller模板,并开始使用依赖注入(通过构造函数或方法)。

通过方法示例

<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller {
    /**
     * Store a newly created resource in storage.
     *
     *   Illuminate\Http\Request  $request
     *  Response
     */
    public function store(Request $request) {
        $name = $request->input('name');
    }
}

通过构造函数示例

<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller {
    protected $request;
    public function __construct(Request $request) {
        $this->request = $request;
    }
    /**
     * Store a newly created resource in storage.
     *
     *  Response
     */
    public function store() {
        $name = $this->request->input('name');
    }
}

答案是正确的,但是出于个人偏好,我会使用Illuminate\Support\Facades\Request;,因为我个人认为Laravel将所有内容别名到根命名空间的习惯与首先具有命名空间的目的相违背。这也使得API文档生成更加困难,因为apigen/phpdoc将无法找到"Request"类。

实际上,您不需要更改artisan make:controller的模板。如果您想在不将其注入到方法中的情况下使用Request,只需使用$ input = \Request::all()(注意\)。如果要使用注入,请使用public myFunction(Request $request() { $input = $request->all() })或将其注入到构造函数并将其分配给类变量

为什么我在使用use Illuminate\Http\Request;时不能使用Request::all();

__Request::all()是一种外观方式,所以你必须使用use Illuminate\Support\Facades\Request;而不是use Illuminate\Http\Request;

有没有办法将Request::all()转换为直接方式(而不通过外观类)?

这正是这个答案的"编辑"部分所解决的问题。注入到控制器中的Request对象是实际对象,而不是外观对象。因此,您只需使用$input = $this->request->all();

- 感谢编辑部分,非常有帮助。

0
0 Comments

在Laravel中,有一个常用的方法是使用Request::all()来获取所有请求参数。然而,该方法在静态调用时会出现问题。

问题的原因是,Request::all()是一个非静态方法,应该通过实例化Request类来调用。但是,有些开发人员可能会错误地使用静态调用的方式来调用这个方法。

为了解决这个问题,我们可以使用request()助手函数来代替静态调用Request::all()方法。这样,我们就不需要担心use语句的问题,从而避免了这种问题的发生。

下面是一个示例代码,展示了如何使用request()函数来获取所有请求参数:

$input = request()->all();

通过使用request()函数,我们可以简单地获取所有请求参数,而不需要担心静态调用的问题。这种方法的优势在于简洁方便,而且避免了出错的可能性。

总结起来,为了避免Laravel Request::all()静态调用的问题,我们应该使用request()助手函数来代替。这样可以简化代码,避免出错,并提高开发效率。

0