Запрос Laravel::all() не должен вызываться статически


В Laravel я пытаюсь вызвать $input = Request::all(); метод store() в моем контроллере, но я получаю следующую ошибку:

Нестатический метод Illuminate\Http\Request::all() не следует вызывать статически, предполагая, что $this из несовместимого контекста

Какая-нибудь помощь в определении наилучшего способа исправить это? (Я слежу за Ларакастом)

Author: patricus, 2015-02-18

6 answers

Сообщение об ошибке вызвано тем, что вызов не проходит через фасад Request.

Изменение

use Illuminate\Http\Request;

До

use Request;

И он должен начать работать.

В config/app.php файл, вы можете найти список псевдонимов классов. Там вы увидите, что базовый класс Request был переименован в класс Illuminate\Support\Facades\Request. Из-за этого, чтобы использовать фасад Request в файле пространства имен, вам необходимо указать, чтобы использовать базовый класс: use Request;.

Редактировать

С тех пор, как этот вопрос, похоже, получил некоторый трафик, я хотел немного обновить ответ, так как Laravel 5 был официально выпущен.

Хотя вышеизложенное по-прежнему технически правильно и будет работать, оператор use Illuminate\Http\Request; включен в новый шаблон контроллера, чтобы помочь разработчикам подтолкнуть их к использованию внедрения зависимостей, а не полагаться на фасад.

При введении объекта запроса в конструктор (или методы, доступные в Laravel 5), это объект Illuminate\Http\Request это должно быть введено, а не фасад Request.

Таким образом, вместо того, чтобы менять шаблон контроллера для работы с фасадом запроса, лучше рекомендуется работать с данным шаблоном контроллера и переходить к использованию внедрения зависимостей (с помощью конструктора или методов).

Пример с помощью метода

<?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.
     *
     * @param  Illuminate\Http\Request  $request
     * @return 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.
     *
     * @return Response
     */
    public function store() {
        $name = $this->request->input('name');
    }
}
 177
Author: patricus, 2015-05-25 21:30:53

Введите объект запроса в контроллер с помощью волшебной инъекции Laravel, а затем получите доступ к функции нестатически. Laravel автоматически введет конкретные зависимости в автоматически загружаемые классы

class MyController() 
{

   protected $request;

   public function __construct(\Illuminate\Http\Request $request)
   {
       $this->request = $request;
   }

   public function myFunc()
   {
       $input = $this->request->all();
   }

}
 6
Author: Jonathan Crowe, 2015-02-18 00:53:32

Вместо этого используйте помощник request(). Вам не нужно беспокоиться о use утверждениях, и, следовательно, подобные проблемы больше не повторятся.

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

Простой

 2
Author: lucidlogic, 2017-12-21 12:47:40
use Illuminate\Http\Request;
public function store(Request $request){
   dd($request->all());
}

То же самое в контексте, говорящем

use Request;
public function store(){
   dd(Request::all());
}
 1
Author: Ravi G, 2017-02-24 07:01:15

Фасад - это еще один класс запросов, доступ к нему осуществляется по полному пути:

$input = \Request::all();
 1
Author: Luca C., 2017-12-28 10:55:41

Я столкнулся с этой проблемой даже со строкой use Illuminate\Http\Request; в верхней части моего контроллера. Продолжал дергать себя за волосы, пока не понял, что делаю $request::ip() вместо $request->ip(). Может случиться с вами, если вы не спали всю ночь и смотрите на код в 6 утра с полуоткрытыми глазами.

Надеюсь, это поможет кому-то в будущем.

 0
Author: dotNET, 2018-08-19 01:28:47