Урок 17. Контроллеры и получение данных от пользователя
Все уроки по Laravel для начинающих тут. Второе наиболее распространенное действие, выполняемое в методе контроллера, - это получение входных данных от пользователя и действие в соответствии с ними. Это вводит несколько новых концепций, поэтому давайте взглянем на небольшой пример кода и рассмотрим новые части.
Во-первых, давайте свяжем наш маршрут;
Привязка основных действий формы
// routes/web.php Route::get('tasks/create', 'TasksController@create'); Route::post('tasks', 'TasksController@store');Обратите внимание, что мы связываем действие "GET tasks/create" (которое показывает форму для создания новой задачи) и действие "POST tasks/" (в котором будет размещена наша форма при создании новой задачи). Мы можем предположить, что метод create() в нашем контроллере просто отображает форму, поэтому давайте рассмотрим метод store().
Способ для контроллера ввода общей формы
// TasksController.php ... public function store() { Task::create(request()->only(['title', 'description'])); return redirect('tasks'); }В этом примере используются Eloquent модели и функциональность redirect(), и мы поговорим о них подробнее позже, а пока давайте быстро поговорим о том, как мы получаем наши данные здесь.
Мы используем помощник request() для представления HTTP-запроса (подробнее об этом позже) и используем его only() метод для извлечения полей заголовка и описания, отправленных пользователем.
Затем мы передаем эти данные в метод create() нашей модели задач, который создает новый экземпляр Task с заголовком, равным переданному заголовку, и описанием, равным переданному описанию. Наконец, мы перенаправляем обратно на страницу, на которой показаны все задачи.
Здесь работает несколько уровней абстракции, которые мы рассмотрим через секунду, но знайте, что данные, поступающие из метода only(), поступают из одного и того же пула данных, из которого извлекаются все общие методы, используемые для объекта запроса, включая all() и get(). Набор данных, из которых извлекается каждый из этих методов, представляет все предоставленные пользователем данные, будь то параметры запроса или значения POST. Итак, наш пользователь заполнил два поля на странице “добавить задачу”: “название” и “описание”.
Чтобы немного разбить абстракцию, request()->только() берет ассоциативный массив входных имен и возвращает их:
request()->only(['title', 'description']); // returns: [ 'title' => 'Какой бы заголовок пользователь ни набрал на предыдущей странице', 'description' => 'Независимо от того, какое описание пользователь ввел на предыдущей странице', ]И Task::create()берет ассоциативный массив и создает из него новую задачу:
Task::create([ 'title' => 'Купить молоко', 'description' => 'Не забудь на этот раз проверить срок годности, Норберт!', ]);Объединение их вместе создает задачу только с полями “название” и “описание”, предоставленными пользователем.
Внедрение зависимостей в контроллеры
Фасады и глобальные помощники Laravel предоставляют простой интерфейс для наиболее полезных классов в кодовой базе Laravel. Вы можете получить информацию о текущем запросе и вводе данных пользователем, сеансе, кэшах и многом другом.
Но если вы предпочитаете внедрять свои зависимости или хотите использовать службу, у которой нет фасада или помощника, вам нужно будет найти какой-то способ включить экземпляры этих классов в свой контроллер.
Это наше первое знакомство с сервисным контейнером Laravel. На данный момент, если это вам незнакомо, вы можете думать об этом как о небольшой части магии Laravel.
Все методы контроллера (включая конструкторы) разрешаются из контейнера Laravel, что означает, что все, что вы вводите, что контейнер знает, как разрешить, будет автоматически введено.
В качестве приятного примера, что, если вы предпочтете иметь экземпляр объекта запроса вместо использования глобального помощника? Просто введите " Illuminate\Http\Request" в параметрах вашего метода, как в примере ниже.
Способ ввода контроллера с помощью ввода типа
// TasksController.php ... public function store(\Illuminate\Http\Request $request) { Task::create($request->only(['title', 'description'])); return redirect('tasks'); }Итак, вы определили параметр, который должен быть передан в метод store(). И поскольку вы ввели его, и поскольку Laravel знает, как разрешить это имя класса, у вас будет готовый объект запроса, который вы сможете использовать в своем методе без какой-либо работы с вашей стороны. Никакой явной привязки, ничего другого — это просто переменная $request.
И, как вы можете видеть из сравнения примеров кода выше, помощник request() и объект запроса ведут себя совершенно одинаково.
Контроллеры ресурсов
Иногда присвоение имен методам в ваших контроллерах может быть самой сложной частью написания контроллера. К счастью, в Laravel есть некоторые соглашения для всех маршрутов традиционного контроллера REST/CRUD (в Laravel он называется “контроллером ресурсов”); кроме того, он поставляется с готовым генератором и удобным определением маршрута, которое позволяет привязать весь контроллер ресурсов сразу.
Чтобы увидеть методы, которые Laravel ожидает для контроллера ресурсов, давайте сгенерируем новый контроллер из командной строки:
php artisan make:controller MySampleResourceController –resourceТеперь откройте app/Http/Controllers/MySampleResourceController.php. Вы увидите, что он поставляется с несколькими предварительными методами. Давайте рассмотрим, что представляет собой каждый из них. Мы будем использовать Task в качестве примера.
Привязка контроллера ресурсов
Итак, мы увидели, что это обычные имена маршрутов, используемые в Laravel, а также что легко создать контроллер ресурсов с методами для каждого из этих маршрутов по умолчанию. К счастью, вам не нужно вручную создавать маршруты для каждого из этих методов контроллера, если вы этого не хотите. Для этого есть трюк, называемый привязкой контроллера ресурсов. Взгляните на пример ниже.
Привязка контроллера ресурсов
// routes/web.php Route::resource('tasks', 'TasksController');Это автоматически свяжет все маршруты, для этого ресурса, с соответствующими именами методов на указанном контроллере. Он также будет соответствующим образом называть эти маршруты; например, метод index() в контроллере ресурсов задач будет называться tasks.index().
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.