В Laravel, я пытаюсь позвонить $input = Request::all();
по store()
методе в моем контроллере, но я получаю следующее сообщение об ошибке:
Нестатический метод
Illuminate\Http\Request::all()
не следует вызывать статически, исходя$this
из несовместимого контекста.
Любая помощь в определении лучшего способа исправить это? (Я слежу за Ларакастом)
use Illuminate\Http\Request;
заявление в вашем контроллере?Illuminate\Http\Request
пакета в / vendor. Нужно ли мне скачивать это отдельно?Illuminate
пакеты включены как часть Laravel / рамочный пакет. Если вы хотите посмотреть любой исходный код Laravel, вы найдете его под/vendor/laravel/framework/src/Illuminate/...
Ответы:
Сообщение об ошибке связано с тем, что вызов не проходит через
Request
фасад.+ Изменить
use Illuminate\Http\Request;
Чтобы
use Request;
и он должен начать работать.
В файле config / app.php вы можете найти список псевдонимов классов. Там вы увидите, что базовый класс
Request
имеет псевдонимIlluminate\Support\Facades\Request
класса. Из - за этого, использоватьRequest
фасад в файл пространства имен, необходимо указать использовать базовый класс:use Request;
.редактировать
Поскольку этот вопрос, похоже, привлекает некоторый трафик, я хотел немного обновить ответ, так как Laravel 5 был официально выпущен.
Хотя вышеизложенное все еще технически верно и будет работать, этот
use Illuminate\Http\Request;
оператор включен в новый шаблон контроллера, чтобы помочь разработчикам перейти к использованию внедрения зависимостей вместо использования фасада.При внедрении объекта 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'); } }
источник
Request::all();
пока используюuse Illuminate\Http\Request;
?use Illuminate\Support\Facades\Request;
вместоuse Illuminate\Http\Request;
используйте
request()
вместо этого помощника. Вам не нужно беспокоиться оuse
заявлениях, и, следовательно, такого рода проблемы больше не повторится.$input = request()->all();
просто
источник
Внедрите объект запроса в контроллер с помощью волшебной инъекции Laravel, а затем получите доступ к функции нестатически. Laravel автоматически вводит конкретные зависимости в автоматически загружаемые классы.
class MyController() { protected $request; public function __construct(\Illuminate\Http\Request $request) { $this->request = $request; } public function myFunc() { $input = $this->request->all(); } }
источник
Фасад - это еще один класс Request, для доступа к нему используйте полный путь:
$input = \Request::all();
Из laravel 5 вы также можете получить к нему доступ через
request()
функцию:$input = request()->all();
источник
Я подумал, что для будущих посетителей будет полезно дать небольшое объяснение того, что здесь происходит.
Illuminate\Http\Request
классУ
Illuminate\Http\Request
класса Laravel есть метод с именемall
(на самом делеall
метод определяется в трейте, которыйRequest
использует класс, называемомIlluminate\Http\Concerns\InteractsWithInput
). Сигнатураall
метода на момент написания выглядит так:public function all($keys = null)
Этот метод не определен как
static
и поэтому, когда вы пытаетесь вызвать метод в статическом контексте, т.е.Illuminate\Http\Request::all()
вы получите сообщение об ошибке, отображаемое в вопросе OP.all
Метод является методом экземпляра и имеет дело с информацией, которая присутствует в экземпляреRequest
класса, поэтому называть его таким образом , не имеет смысла.Фасады
Фасад в Laravel предоставляет разработчикам удобный способ доступа к объектам в контейнере IoC и вызова методов для этих объектов. Разработчик может вызвать метод «статически» на фасаде, например
Request::all()
, на фасаде , но фактический вызов метода на реальномIlluminate\Http\Request
объекте не является статическим.Фасад работает как прокси - он обращается к объекту в контейнере IoC и передает вызов статического метода этому объекту (нестатически). Например, возьмем
Illuminate\Support\Facades\Request
фасад, вот как он выглядит:class Request extends Facade { protected static function getFacadeAccessor() { return 'request'; } }
Под капотом базовый
Illuminate\Support\Facades\Facade
класс использует некоторую магию PHP, а именно__callStatic
метод:all
без параметровgetFacadeAccessor
, в данном случаеIlluminate\Http\Request
объектall
вызывается нестатически для экземпляраIlluminate\Http\Request
.Вот почему, как указал @patricus в своем ответе выше, изменив
use
оператор / import для ссылки на фасад, ошибки больше нет, потому что, что касается PHP,all
был правильно вызван для экземпляраIlluminate\Http\Request
.Сглаживание
Псевдонимы - еще одна функция, которую Laravel предоставляет для удобства. Он работает, эффективно создавая классы псевдонимов, которые указывают на фасады в корневом пространстве имен. Если вы посмотрите на свой
config/app.php
файл, подaliases
ключом вы найдете длинный список сопоставлений строк с классами фасадов. Например:'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, // ... 'Request' => Illuminate\Support\Facades\Request::class,
Laravel создает для вас эти псевдонимы классов на основе вашей конфигурации, и это позволяет вам использовать классы, доступные в корневом пространстве имен (на что указывают строковые ключи
aliases
конфигурации), как если бы вы использовали сам фасад:use Request: class YourController extends Controller { public function yourMethod() { $input = Request::all(); // ... } }
Замечание о внедрении зависимостей
Хотя фасады и псевдонимы по-прежнему предусмотрены в Laravel, можно и обычно рекомендуется идти по пути внедрения зависимостей. Например, использование внедрения конструктора для достижения того же результата:
use Illuminate\Http\Request; class YourController extends Controller { protected $request; public function __construct(Request $request) { $this->request = $request; } public function yourMethod() { $input = $this->request->all(); // ... } }
У этого подхода есть ряд преимуществ, но, по моему личному мнению, самым большим преимуществом внедрения зависимостей является то, что он упрощает тестирование кода. Объявляя зависимости ваших классов в качестве аргументов конструктора или метода, становится очень легко имитировать эти зависимости и изолированно тестировать свой класс.
источник
use Illuminate\Http\Request; public function store(Request $request){ dd($request->all()); }
то же самое в контексте, говоря
use Request; public function store(){ dd(Request::all()); }
источник
также это происходит, когда вы импортируете следующую библиотеку в файл api.php. это происходит из-за предложения некоторой среды IDE импортировать его из-за того, что класс маршрута не обнаружен .
просто удалите его, и все будет работать нормально.
use Illuminate\Routing\Route;
Обновить:
кажется, если вы добавите эту библиотеку, это не приведет к ошибке
use Illuminate\Support\Facades\Route;
источник
Я столкнулся с этой проблемой даже с
use Illuminate\Http\Request;
линией в верхней части моего контроллера. Продолжал тянуть за волосы, пока не понял, что делаю$request::ip()
вместо$request->ip()
. Может случиться с вами, если вы не спали всю ночь и смотрите на код в 6 утра приоткрытыми глазами.Надеюсь, это поможет кому-то в будущем.
источник
Я заставляю его работать с определением области действия
общедоступная функция pagar (\ Illuminate \ Http \ Request $ request) {//
источник