Запрос Laravel::all() не должен вызываться статически
В Laravel я пытаюсь вызвать $input = Request::all();
метод store()
в моем контроллере, но я получаю следующую ошибку:
Нестатический метод
Illuminate\Http\Request::all()
не следует вызывать статически, предполагая, что$this
из несовместимого контекста
Какая-нибудь помощь в определении наилучшего способа исправить это? (Я слежу за Ларакастом)
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');
}
}
Введите объект запроса в контроллер с помощью волшебной инъекции Laravel, а затем получите доступ к функции нестатически. Laravel автоматически введет конкретные зависимости в автоматически загружаемые классы
class MyController()
{
protected $request;
public function __construct(\Illuminate\Http\Request $request)
{
$this->request = $request;
}
public function myFunc()
{
$input = $this->request->all();
}
}
Вместо этого используйте помощник request()
. Вам не нужно беспокоиться о use
утверждениях, и, следовательно, подобные проблемы больше не повторятся.
$input = request()->all();
Простой
use Illuminate\Http\Request;
public function store(Request $request){
dd($request->all());
}
То же самое в контексте, говорящем
use Request;
public function store(){
dd(Request::all());
}
Фасад - это еще один класс запросов, доступ к нему осуществляется по полному пути:
$input = \Request::all();
Я столкнулся с этой проблемой даже со строкой use Illuminate\Http\Request;
в верхней части моего контроллера. Продолжал дергать себя за волосы, пока не понял, что делаю $request::ip()
вместо $request->ip()
. Может случиться с вами, если вы не спали всю ночь и смотрите на код в 6 утра с полуоткрытыми глазами.
Надеюсь, это поможет кому-то в будущем.