laravel передать параметр в контроллер

Маршрутизация в Laravel 8: как это делать правильно

После прочтения этой статьи вы узнаете, как:

Для понимания материала, изложенного в этой статье, необходимы базовые знания PHP, при этом навыков работы с Laravel не требуется. Предполагается, что Laravel и Composer у вас уже установлены.

Введение

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Самая основная и важная функция серверных фреймворков – это способность получать запросы пользователя и возвращать ответы в виде HTML-страниц или даже документов JSON. Такое взаимодействие сервера и клиента возможно благодаря HTTP(S) маршрутизации: уже этот факт сам по себе объясняет степень важности маршрутов.

Laravel значительно упрощает определение маршрутов, передачу им кода на исполнение, а также решает множество других задач, связанных с маршрутизацией. По умолчанию Laravel при установке создает каталог для работы с маршрутами. Эта папка содержит четыре файла – api.php, channels.php, console.php и web.php. Первый файл (api.php) используется для обработки маршрутов API интерфейсов, остальные три – для всех остальных случаев. В этой статье мы сосредоточимся на файле web.php – все наши маршруты будут располагаться в нем.

Приступим

Создайте новый проект Laravel и откройте файл web.php. На вашем экране должно быть то же самое, что и у меня.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Базовый файл web.php в Laravel

Все, что мы здесь видим – ответ Laravel на запрос корневого маршрута вашего домена, «/». Используется замыкание, которое выдает содержимое файла welcome.blade.php из каталога views. Ниже мы рассмотрим полученный результат более подробно.

Определение маршрутов в Laravel

Маршруты в Laravel задаются с использованием класса Route и HTTP методов, маршрута для ответа, и замыкания (или метода контроллера).

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Определение маршрута в Laravel

HTTP методы

Это действия для создания пользовательских HTTP запросов. В предыдущем примере вы уже видели методы GET и POST. Рассмотрим, какие функции выполняют эти и другие запросы.

GET – в основном используется для получения данных с сервера и их передачи пользователю без внесения каких-либо изменений.

POST – позволяет создавать новые ресурсы и записи на сервере, также может использоваться для отправки данных с целью дальнейшей обработки (например, для проверки информации или в процессе авторизации). Считается более безопасным методом отправки конфиденциальной информации, чем GET.

PUT – во многом метод аналогичен методу POST; отсылает данные на сервер, как правило, для обновления записей вместо создания новых.

DELETE – название этого метода говорит само за себя, он удаляет существующую запись из базы данных.

Замыкания

Замыкание – это, по сути, анонимная функция, которой не требуется имя для вызова. Могут передаваться как объекты, присваиваться переменным, или даже передаваться другим функциям или методам.

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

Обработка маршрутов

С использованием замыканий

Независимо от используемой версии Laravel, это самый простой и понятный способ.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Обработка маршрутов с замыканиями

Обратите внимание на использование метода view(). В отличие от других фреймворков для создания веб-приложений, в которых необходимо указывать расположение каталога, содержащего пользовательские представления, Laravel все автоматически делает за вас и даже предоставляет простой метод для связи контроллера или замыкания с представлением.

Поэтому всякий раз, когда вы используете метод view (), Laravel возвращает шаблон Blade (.blade.php) или PHP-файл (.php) из каталога views.

С использованием контроллеров – Laravel 7

Этот способ, на мой взгляд, еще проще, чем метод для Laravel 8, но это только мое мнение.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

С использованием контроллеров – Laravel 8

Почти то же самое, но с учетом синтаксических изменений в Laravel версии 8.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Еще одно различие – в Laravel 8, помимо представления второго параметра в виде массива, вам также потребуется импортировать контроллеры.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Файл routes.php в Laravel 8

Параметры маршрута

Довольно часто приходится иметь дело с динамическими маршрутами, которые используются для генерации одной страницы с динамическим контентом, передаваемым в маршруте. Параметры маршрута – это динамические сегменты в структуре URL-адреса.

Мы видим параметры маршрута каждый день, на многих сайтах. Facebook, Linkedin, Twitter, например, используют именно динамические маршруты. Laravel позволяет очень легко определять динамические маршруты, внося лишь некоторые изменения в базовое определение.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Часть /users/ — это статическая часть маршрута, а фрагмент в фигурных скобках показывает, что он динамический — посещение /users/Zubair вернет «Hello Zubair».

Обратите внимание на то, как переменная была передана в замыкание. Параметры маршрута необязательно размещать в самом конце, их можно задавать где угодно.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Произвольное размещение параметров

Параметры маршрута с контроллерами

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

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Параметры маршрута с контроллерами

Названия маршрутов

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

Каждому маршруту, определенному в файле web.php, может быть присвоено уникальное имя, которое избавляет от многих проблем, как показано в приведенном ниже примере.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Короткие названия маршрутов

Зачем использовать короткие названия маршрутов

Для этого есть несколько причин. Если пользователь набирает адрес в строке браузера, ему проще указать «users», например, вместо фактического пути «pages/users». Второе важное преимущество – простота разработки и обслуживания: всякий раз, когда вы меняете путь, не изменяя названия, фактический маршрут автоматически изменяется везде, где было упомянуто короткое название.

Помощник route()

В Laravel есть помощник route(), который помогает ссылаться на маршруты по их именам в вашем интерфейсном коде.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Присвоение имени маршруту в Laravel 8

Обратите внимание на то, как название маршрута было использовано вместо фактического пути. Если в реальный путь в дальнейшем будут внесены изменения, редактирование кода не потребуется.

Использование параметров в именованных маршрутах

На самом деле нет никакой разницы в использовании параметров, поскольку вы просто даете название существующему, определенному маршруту. Всю работу в пользовательской части приложения выполняет помощник route(), и вот так вы передаете ему параметры.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Передача параметров в именованных маршрутах

Предположим, что метод или замыкание принимают больше одного параметра. Несколько параметров вы можете передать следующими способами:

Использование строк запросов с именованными маршрутами

С передачей строк запросов именованным маршрутам в Laravel все обстоит очень просто.

laravel передать параметр в контроллер. Смотреть фото laravel передать параметр в контроллер. Смотреть картинку laravel передать параметр в контроллер. Картинка про laravel передать параметр в контроллер. Фото laravel передать параметр в контроллер

Передача строк запросов именованным маршрутам

Строка запроса передается как обычный элемент массива, если в замыкании нет соответствующего параметра. Если в замыкании присутствует «?», оно прикрепляется как строка запроса.

Вот и все на сегодня, спасибо за внимание. Если у вас есть какие-либо вопросы или советы, пожалуйста, оставьте их в комментариях к этой статье.

Пожалуйста, опубликуйте свои отзывы по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!

Источник

Laravel Framework Russian Community

Введение

Простейшие контроллеры

Вот пример простейшего класса контроллера:

Привязка «действия» (action) к определенному маршруту происходит так:

Примечание: Все контроллеры должны наследоваться от базового класса контроллера.

Контроллеры и пространства имён

По умолчанию, класс RouteServiceProvider загружает все маршруты из файла routes.php в группу с «корневым» пространством имён.

Именованные роуты с контроллерами

Как и в случае с обработчиками-замыканиями, вы можете присвоить имя этому роуту:

Ссылки на «действия» контроллера

Если вы хотите создавать ссылки на «действие» контроллера, используя относительные имена классов, то сначала нужно зарегистрировать «корневое» пространство имён с контроллерами:

Для непосредственного создания ссылки на «действие» контроллера, воспользуйтесь функцией-помощником action :

Получить имя «действия», которое выполняется в данном запросе, можно методом currentRouteAction :

Использование посредников с контроллерами

Посредники могут быть привязаны к маршрутам следующим образом:

Так же, вы можете указывать их и в конструкторе самого контроллера:

Единые контроллеры

Laravel позволяет вам легко создавать один маршрут для обработки всех действий контроллера. Для начала, зарегистрируйте маршрут методом Route::controller :

Если имя действия вашего контроллера состоит из нескольких слов вы можете обратиться к нему по URI, используя синтаксис с дефисами (-). Например, данное действие в нашем классе UserController будет доступно по адресу users/admin-profile :

Назначение имён

RESTful ресурс-контроллеры

Для создания контроллера выполните следующую консольную команду:

Теперь мы можем зарегистрировать его как ресурс-контроллер:

Действия, обрабатываемые ресурс-контроллером:

VerbПутьДействиеИмя маршрута
GET/photoindexresource.index
GET/photo/createcreatephoto.create
POST/photostorephoto.store
GET/photo/

showphoto.show
GET/photo//editeditphoto.edit
PUT/PATCH/photo/

updatephoto.update
DELETE/photo/

destroyphoto.destroy

Настройка маршрутов в ресурс-контроллерах

Иногда вам понадобится обрабатывать только часть всех возможных действий:

По умолчанию, все действия ресурс контроллеров имеют имя в формате «ресурс.действие». Однако, вы можете изменить эти имена, используя массив names в опциях:

Обработка наследуемых ресурс-контроллеров

Этот маршрут зарегистрирует «унаследованный» контроллер ресурсов, который может принимать URL такие как: photos//comments/ .

Добавление дополнительных маршрутов к ресурс контроллерам

Если вдруг необходимо добавить дополнительные маршруты к уже существующим маршрутам ресурс-контроллера, необходимо зарегистрировать эти маршруты перед вызовом метода Route::resource :

Внедрение зависимостей в контроллерах

Внедрение зависимостей в конструкторе

Сервис-контейнер используется для поиска и получения всех контроллеров. За счёт этого вы можете указать любые зависимости в качестве аргументов конструктора вашего контроллера, в том числе и любой контракт:

Внедрение зависимостей в методах контроллеров

Точно так же можно указывать зависимости для любого метода контролера. Например, давайте укажем Request как зависимость метода store :

Если метод контроллера так же ожидает какие-либо данные из маршрута, то можно просто указать их после всех зависимостей:

Примечание: Внедрение зависимостей в методы контроллера полностью дружат с механизмом связанных моделей. Сервис-контейнер определит, какие из аргументов должны быть связаны с моделями, а какие должны быть внедрены.

Кэширование маршрутов

Если ваше приложение использует только контроллеры для обработки маршрутов, вы можете использовать кэширование маршрутов, которое кардинально уменьшает время, требуемое на разбор и регистрацию всех маршрутов внутри приложения.

В некоторых случаях прирост скорости может достигнуть 100 раз! Для включения кэширования просто выполните Artisan-команду route:cache :

Для удаления кэша маршрутов без генерации нового используется Artisan-команда route:clear :

Источник

Laravel Framework Russian Community

Пролог

Начало работы

Основы архитектуры

Основы

Фронтенд

Безопасность

Копаем глубже

База данных

Eloquent ORM

Тестирование

Официальные пакеты

Роутинг

Простейший роутинг

В Laravel простейшие роуты принимают URI (путь) и функцию-замыкание, предоставляя очень простой и выразительный метод определения роутов:

Файлы роутов по умолчанию

Доступные методы роутера

Роутер (маршрутизатор) позволяет регистрировать роуты для любого HTTP-запроса:

CSRF-защита

Параметры роутов

Обязательные параметры

Разумеется, иногда вам может понадобиться захватить сегменты URI в вашем роуте. Например, если вам необходимо захватить ID пользователя из URL. Это можно сделать, определив параметры роута:

Вы можете определить сколько угодно параметров:

Необязательные параметры

Ограничения регулярными выражениями

Вы можете ограничить формат параметров вашего роута с помощью метода where на экземпляре роута. Метод where принимает название параметра и регулярное выражение, определяющее ограничения для параметра:

Глобальные ограничения

Когда шаблон был определён, он автоматически применится ко всем роутам, использующим этот параметр:

Именованные роуты

Именованные роуты позволяют удобно генерировать URL-адреса и делать переадресацию на конкретный роут. Вы можете задать имя роута, прицепив метод name к определению роута:

Также можно указать имена роутов для действий контроллера:

Генерирование URL адресов для именованных роутов

Когда вы назначили имя роуту, вы можете использовать это имя для генерирования URL адресов и переадресаций глобальным методом route :

Группы роутов

Посредники

Посредники применяются ко всем роутам в группе путём указания списка этих посредников с параметром middleware в массиве групповых атрибутов. Посредники выполняются в порядке перечисления в этом массиве:

Пространства имён

Другой типичный пример использования групп роутов — назначение одного пространства имён PHP для группы контроллеров, используя параметр namespace в массиве группы:

Доменный роутинг

Группы роутов можно использовать для обработки маршрутизации поддоменов. Поддоменам можно назначать параметры роутов также как URI роутов, поэтому вы можете захватить часть поддомена и использовать в своём роуте или контроллере. Поддомен можно указать с помощью ключа domain в массиве атрибутов группы:

Префиксы роута

Метод prefix можно использовать для указания URI-префикса каждого роута в группе. Например, если вы хотите добавить admin ко всем URI роутов в группе:

Привязка модели роута

Неявная привязка

Laravel автоматически включает модели Eloquent, определённые в действиях роута или контроллера, чьи переменные имеют имена, совпадающие с сегментом роута. Например:

Изменение имени ключа

Если вы хотите, чтобы для получения класса данной модели вместо столбца id использовался другой столбец базы данных, вы можете переопределить метод getRouteKeyName в своей модели Eloquent:

Явная привязка

Для регистрации явной привязки используйте метод роута model для указания класса для данного параметра. Вам надо определить явные привязки вашей модели в методе boot класса RouteServiceProvider :

Затем определите роут, содержащий параметр :

Если совпадающий экземпляр модели не найден в базе данных, будет автоматически сгенерирован HTTP-отклик 404.

Изменение логики принятия решения

Подмена методов

Получение текущего роута

Чтобы изучить все доступные методы, обратитесь к документации по API класса, лежащего в основе фасада Route и экземпляра Route.

Источник

Laravel Framework Russian Community

Пролог

Начало работы

Основы архитектуры

Основы

Фронтенд

Безопасность

Копаем глубже

База данных

Eloquent ORM

Тестирование

Официальные пакеты

Контроллеры

Введение

Простейшие контроллеры

Определение контроллеров

Вы можете задать роут для этого контроллера следующим образом:

Контроллеры и пространства имён

Важно помнить, что при определении роута контроллера нам не надо указывать полное пространство имён контроллера. Так как RouteServiceProvider загружает файлы вашего роута в группу роута, которая содержит пространство имён, мы указали только ту часть имени класса, которая следует за частью App\Http\Controllers пространства имён.

Контроллеры одного действия

Для определения контроллера, обрабатывающего всего одно действие, поместите в контроллер единственный метод __invoke :

При регистрации роутов для контроллеров одного действия вам не надо указывать метод:

Посредник контроллера

Посредников можно назначить роутам контроллера в файлах роутов:

Но удобнее указать посредника в конструкторе вашего контроллера. Используя метод middleware в конструкторе контроллера, вы легко можете назначить посредника для действия контроллера. Вы можете даже ограничить использование посредника, назначив его только для определённых методов класса контроллера:

Контроллеры также позволяют регистрировать посредников с помощью замыканий. Это удобный способ определения посредника для одного контроллера, не требующий определения целого класса посредника:

Вы можете назначить посредника на определённый набор действий контроллера, но если возникает такая необходимость, возможно ваш контроллер стал слишком велик. Вместо этого вы можете разбить контроллер на несколько меньших контроллеров.

Контроллеры ресурсов

Маршрутизация ресурсов Laravel назначает обычные CRUD-роуты на контроллеры одной строчкой кода. Например, вы можете создать контроллер, обрабатывающий все HTTP-запросы к фотографиям, хранимым вашим приложением. Вы можете быстро создать такой контроллер с помощью Artisan-команды make:controller :

Теперь мы можем зарегистрировать роут контроллера ресурса:

Один этот вызов создаёт множество роутов для обработки различных действий для ресурса. Сгенерированный контроллер уже имеет методы-заглушки для каждого из этих действий с комментариями о том, какие URI и типы запросов они обрабатывают.

Действия, обрабатываемые контроллером ресурсов

ОперацияURIДействиеНазвание роута
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/

showphotos.show
GET/photos//editeditphotos.edit
PUT/PATCH/photos/

updatephotos.update
DELETE/photos/

destroyphotos.destroy

Указание модели ресурса

Подмена методов формы

Частичные роуты ресурсов

При объявлении роута вы можете указать подмножество всех возможных действий, которые должен обрабатывать контроллер вместо полного набора стандартных действий:

Именование роутов ресурса

По умолчанию все действия контроллера ресурсов имеют имена роутов, но вы можете переопределить эти имена, передав массив names вместе с остальными параметрами:

Именование параметров роута ресурса

По умолчанию Route::resource создаст параметры для ваших роутов ресурсов на основе имени ресурса в единственном числе. Это легко можно изменить для каждого ресурса, передав parameters в массив опций. Массив parameters должен быть ассоциативным массивом имён ресурсов и имён параметров:

Этот пример генерирует следующие URI для роута ресурса show :

Локализация URI ресурсов

Добавление дополнительных роутов в контроллеры ресурсов

Если вам надо добавить дополнительные роуты в контроллер ресурсов, не входящие в набор роутов ресурсов по умолчанию, их надо определить до вызова Route::resource ; в ином случае, определенные методом resource роуты могут нечаянно превзойти по важности ваши дополнительные роуты:

Старайтесь, чтобы контроллеры были узкоспециализированными. Если вам постоянно требуются методы вне стандартного набора действий с ресурсами, попробуйте разделить контроллер на два небольших контроллера.

Внедрение зависимостей и контроллеры

Внедрение в конструктор

Сервис-контейнер Laravel используется для работы всех контроллеров Laravel. В результате вы можете указывать типы любых зависимостей, которые могут потребоваться вашему контроллеру в его конструкторе. Заявленные зависимости будут автоматически получены и внедрены в экземпляр контроллера:

Разумеется, вы можете также указать в качестве аргумента тип любого Laravel-контракта. Если контейнер может с ним работать, значит вы можете указывать его тип. В некоторых случаях внедрение зависимостей в контроллер обеспечивает лучшую тестируемость приложения.

Внедрение в метод

Кроме внедрения в конструктор, вы также можете указывать типы зависимостей в методах вашего контроллера. Распространённый пример внедрения в метод — внедрение экземпляра Illuminate\Http\Request в один из методов контроллера:

Если метод вашего контроллера также ожидает данные из параметра роута, просто перечислите аргументы роута после остальных зависимостей. Например, если ваш роут определён так:

Кэширование роутов

Роуты на основе замыканий нельзя кэшировать. Чтобы использовать кэширование роутов, необходимо перевести все роуты замыканий на классы контроллера.

Если ваше приложение единолично использует роуты контроллера, то вы можете воспользоваться преимуществом кэширования роутов в Laravel. Использование кэша роутов радикально уменьшит время, требуемое для регистрации всех роутов вашего приложения. В некоторых случаях регистрация ваших роутов может стать быстрее в 100 раз. Для создания кэша роутов просто выполните Artisan-команду route:cache :

После выполнения этой команды ваши кэшированные роуты будут загружаться при каждом запросе. Помните, после добавления новых роутов, вам необходимо заново сгенерировать свежий кэш роутов. Поэтому нужно выполнить команду route:cache уже при развёртывании вашего проекта.

Для очистки кэша роутов используйте команду route:clear :

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *