php artisan make controller resource
Laravel Framework Russian Community
Пролог
Начало работы
Архитектурные концепции
Основное
Погружение
Безопасность
База данных
Eloquent ORM
Тестирование
Пакеты
Контроллеры
Введение
Написание контроллеров
Основные понятия о контроллерах
Вы можете определить маршрут к этому методу контроллера следующим образом:
Контроллеры одиночного действия
Если действие контроллера является особенно сложным, вам может показаться удобным посвятить целый класс контроллера этому единственному действию. Для этого вы можете определить один метод __invoke в контроллере:
При регистрации маршрутов для контроллеров одиночного действия вам не нужно указывать метод контроллера. Вместо этого вы можете просто передать маршрутизатору имя контроллера:
Заготовки контроллера можно настроить с помощью публикации заготовок.
Посредник контроллера
Посредник может быть назначен маршрутам контроллера в ваших файлах маршрутизации:
Или вам может быть удобно указать посредника в конструкторе вашего контроллера. Используя метод middleware в конструкторе вашего контроллера, вы можете назначить посредника действиям контроллера:
Контроллеры также позволяют регистрировать посредника с помощью замыкания. Это обеспечивает удобный способ определения встроенного посредника для одного контроллера без определения целого класса посредника:
Ресурсные контроллеры
Эта команда поместит новый класс контроллера в каталог app/Http/Controllers вашего приложения. Контроллер будет содержать метод для каждого из доступных действий с ресурсами. Затем, вы можете зарегистрировать маршрут ресурса, который указывает на контроллер:
Это единое определение маршрута создаст несколько маршрутов для обработки множества действий с ресурсом. Сгенерированный контроллер уже будет иметь заготовки для каждого из этих действий. Помните, вы всегда можете получить быстрый обзор маршрутов своего приложения, выполнив команду route:list Artisan.
Вы даже можете зарегистрировать сразу несколько контроллеров ресурсов, передав массив методу resources :
Действия, выполняемые ресурсными контроллерами
Метод | URI | Действие | Имя маршрута |
---|---|---|---|
GET | /photos | index | photos.index |
GET | /photos/create | create | photos.create |
POST | /photos | store | photos.store |
GET | /photos/ | show | photos.show |
GET | /photos/ | edit | photos.edit |
PUT/PATCH | /photos/ | update | photos.update |
DELETE | /photos/ | destroy | photos.destroy |
Настройка поведения при отсутствии модели
Указание модели ресурса
Частичные ресурсные маршруты
При объявлении маршрута ресурса вы можете указать подмножество действий, которые должен обрабатывать контроллер, вместо полного набора действий по умолчанию:
Ресурсные API-маршруты
Вы можете зарегистрировать сразу несколько ресурсных API-контроллеров, передав массив методу apiResources :
Вложенные ресурсы
Иногда требуется определить маршруты ко вложенному ресурсу. Например, фоторесурс может иметь несколько комментариев, которые могут быть прикреплены к фотографии. Чтобы вложить ресурсные контроллеры, используйте «точечную нотацию» в определении маршрута:
Этот маршрут зарегистрирует вложенный ресурс, к которому можно получить доступ с помощью URI, подобных следующим:
Ограничение вложенных ресурсов
Функционал неявной привязки модели Laravel может автоматически ограничивать вложенные привязки для подтверждения принадлежности извлеченной дочерней модели по отношению к родительской модели. Используя метод scoped при определении вашего вложенного ресурса, вы можете включить автоматическое ограничение, а также указать Laravel, через какое поле дочерний ресурс должен быть получен. Для получения дополнительных сведений о том, как это сделать, смотрите документацию по ограничению ресурсных маршрутов.
Упрощенное вложение
Часто нет необходимости иметь в URI и родительский, и дочерний идентификаторы, поскольку дочерний идентификатор уже является уникальным идентификатором. При использовании уникальных идентификаторов, таких как автоинкрементные первичные ключи, для идентификации ваших моделей в сегментах URI, вы можете использовать «упрощенное вложение»:
Это объявление маршрута будет определять следующие маршруты:
Метод | URI | Действие | Имя маршрута |
---|---|---|---|
GET | /photos/ | index | photos.comments.index |
GET | /photos/ | create | photos.comments.create |
POST | /photos/ | store | photos.comments.store |
GET | /comments/ | show | comments.show |
GET | /comments/ | edit | comments.edit |
PUT/PATCH | /comments/ | update | comments.update |
DELETE | /comments/ | destroy | comments.destroy |
Именование ресурсных маршрутов
По умолчанию все действия ресурсного контроллера имеют имя маршрута; однако, вы можете переопределить эти имена, передав массив имен с желаемыми именами маршрутов:
Именование параметров ресурсных маршрутов
В приведенном выше примере создается следующий URI для маршрута show ресурса:
Ограничение ресурсных маршрутов
Функционал ограничения неявной привязки модели Laravel может автоматически ограничивать вложенные привязки для подтверждения принадлежности извлеченной дочерней модели по отношению к родительской модели. Используя метод scoped при определении вашего вложенного ресурса, вы можете включить автоматическое ограничение, а также указать Laravel, через какое поле дочерний ресурс должен быть получен:
Этот маршрут зарегистрирует ограниченный вложенный ресурс, к которому можно получить доступ с помощью таких URI, как следующий:
Локализация URI ресурсов
Дополнение ресурсных контроллеров
Помните, что ваши контроллеры должны быть сосредоточенными. Если вам постоянно требуются методы, выходящие за рамки типичного набора действий с ресурсами, рассмотрите возможность разделения вашего контроллера на два меньших контроллера.
Внедрение зависимостей и контроллеры
Внедрение зависимостей в конструкторе контроллера
Контейнер служб Laravel используется для извлечения всех контроллеров. В результате вы можете объявить любые зависимости, которые могут понадобиться вашему контроллеру в его конструкторе. Объявленные зависимости будут автоматически извлечены и внедрены в экземпляр контроллера:
Внедрение зависимостей в методах контроллера
Помимо внедрения в конструкторе, вы также можете объявить тип зависимости в методах вашего контроллера. Распространенный вариант использования внедрения в методе – это внедрение экземпляра Illuminate\Http\Request в методы вашего контроллера:
Если ваш метод контроллера также ожидает входные данные из параметра маршрута, укажите аргументы маршрута после других зависимостей. Например, если ваш маршрут определен так:
Команды Artisan Make с параметрами
В Laravel есть потрясающий набор artisan команд, из которых чаще всего используется make:xxx — например, make:model или make:migration и т. Д. Но знаете ли вы их все? Знаете ли их параметры, которые могут помочь сделать код еще быстрее?
Во-первых, есть команда php artisan list, которая выдаст нам все команды:
Но это не даст нам никакой информации о параметрах и опциях этих команд. Я расскажу вам об этом подробно, начиная с наиболее используемых.
Для этого мы углубимся в код фреймворка, находящийся в папке /vendor/laravel/framework/src/Illuminate, и проверим, какие опции и недокументированные функции есть у этих команд.
1. make:controller
Эта команда создает новый файл контроллера в папке app/Http/Controllers.
—resource
Контроллер будет содержать методы для каждой из доступных операций с ресурсами — index(), create(), store(), show(), edit(), update(), destroy().
—model=Photo
Если нужно, чтобы методы контроллера указывали на экземпляр модели.
—parent=Photo
Недокументированный параметр, в коде написано «Генерирует вложенный класс контроллера ресурсов», но мне не удалось сгенерировать контроллер таким образом. Вероятно, работа над этим параметром еще в процессе.
2. make:model
Создает новый класс Eloquent модели.
—migration
Создает новый файл миграции для модели.
—controller
Создает новый контроллер для модели.
—resource
Указывает, что сгенерированный контроллер должен контроллером ресурсов.
Да, вы правильно поняли, вы можете сделать так:
3. make:migration
Создает новый файл миграции.
—create=Table
Таблица, которая будет создана.
—table=Table
Таблица для миграции.
—path=Path
Место, где будет создан файл миграции.
4. make:seeder
Создает новый класс наполнения базы данных.
5. make:request
Создает новый класс валидации форм в папке app/Http/Requests.
6. make:middleware
Создает новый класс посредника.
7. make:policy
Создает новый класс политики.
—model=Photo
Модель, к которой применяется политика.
8. make:auth
Шаблоны и маршруты для логина и регистрации.
—views
Только шаблоны аутентификации.
—force
Перезаписать существующие шаблоны по умолчанию.
9. make:command
Создает новую команду Artisan.
—command=Command
Назначаем терминальную команду.
10. make:event
Создает новый класс событий.
11. make:job
Создает новый класс отложенных задач
—sync
Задача должна быть синхронной.
12. make:listener
Создает новый класс слушателя событий
—event=Event
Класс, который будет прослушиваться.
—queued
Указывает, что слушатель должен быть поставлен в очередь.
13. make:mail
Создает новый почтовый класс.
—markdown
Создает новый Markdown-шаблон для писем
14. make:notification
Создает новый класс уведомлений.
—markdown
Создает новый Markdown-шаблон для уведомлений.
15. make:provider
Создает новый класс провайдера
16. make:test
Создает новый класс тестирования.
—unit
Создает модуль теста.
Наш Телеграм-канал — следите за новостями о Laravel.
Задать вопросы по урокам можно на нашем форуме.
How to create a RESTful Resource Controller in Laravel 5.2, using Artisan command (PHP)
I’m working with Laravel 5 and I would like to know how to generate a RESTful Resource Controller with all predefined methods using the Artisan command (PHP).
How can I achieve this?
7 Answers 7
Try getting help on the command
Summary: from Laravel 5.2 onward the make:controller artisan command will create a plain controller by default.
For default controller which have all methods you want. php artisan make:controller LessonsController
Best Regards, I am using laravel 5.0
so you are using Laravel 5.2, so to have the controller with RESTful methods issue the command
In Laravel 5.1 and below, by default the make:controller command used to generate the Controller with all required methods such as ‘index, create, store, show, edit, update, destroy’. And for 5.1 and below, to have the blank controller file without any methods, we used to use ‘—plain’ parameter as
But with Laravel 5.2, by default the artisan command will create the bare controller file without any RESTful methods.
As Laravel 5.2 has many changes, it is better to use the ‘artisan help’ command as below
Suggestion: As this is the change from 5.2, it would be good to edit the Post Title too.
Контроллеры
Введение
Простейшие контроллеры
Определение контроллеров
Мы можем определить маршрут для действия (action) этого контроллера вот так:
Контроллеры и пространства имён
Контроллеры одного действия
Для определения контроллера, обрабатывающего всего одно действие, поместите в контроллер единственный метод PHP __invoke () :
При регистрации маршрутов для контроллеров одного действия вам не надо указывать метод:
Имена маршрутов контроллеров
Подобно маршрутам замыканий, вы можете указать имена для маршрутов контроллеров:
URL-адреса для действий контроллера
Получить имя действия, которое выполняется в данном запросе, можно методом PHP currentRouteAction () фасада Route :
Для получения URL для действия контроллера используйте метод PHP action () :
Если вы хотите получить URL для действия контроллера, используя только часть имени класса относительно пространства имён контроллера, зарегистрируйте корневое пространство имён контроллера с помощью генератора URL:
Посредник контроллера
Посредник можно указать для маршрутов контроллера в файлах маршрутов:
Но удобнее указать посредника в конструкторе вашего контроллера. Используя метод PHP middleware () в конструкторе контроллера, вы легко можете назначить посредника для действия контроллера. Вы можете даже ограничить использование посредника, назначив его только для определённых методов класса контроллера:
Контроллеры также позволяют регистрировать посредников с помощью замыканий. Это удобный способ определения посредника для одного контроллера, не требующий определения целого класса посредника:
Вы можете назначить посредника на определённый набор действий контроллера, но если возникает такая необходимость, возможно ваш контроллер стал слишком велик. Вместо этого вы можете разбить контроллер на несколько маленьких контроллеров.
Контроллеры ресурсов
Маршрутизация ресурсов Laravel назначает обычные CRUD-маршруты на контроллеры одной строчкой кода. Например, вы можете создать контроллер, обрабатывающий все HTTP-запросы к фотографиям, хранимым вашим приложением. Вы можете быстро создать такой контроллер с помощью Artisan-команды sh make:controller :
Теперь мы можем зарегистрировать маршрут контроллера ресурса:
Один этот вызов создаёт множество маршрутов для обработки различных действий для ресурса. Сгенерированный контроллер уже имеет методы-заглушки для каждого из этих действий с комментариями о том, какие URI и типы запросов они обрабатывают.
Действия, обрабатываемые контроллером ресурсов
Тип | URI | Действие | Имя маршрута |
---|---|---|---|
GET | /photos | index | photo.index |
GET | /photos/create | create | photo.create |
POST | /photos | store | photo.store |
GET | /photos/ | show | photo.show |
GET | /photos/ | edit | photo.edit |
PUT/PATCH | /photos/ | update | photo.update |
DELETE | /photos/ | destroy | photo.destroy |
Подмена методов формы
Частичные маршруты ресурсов
При объявлении маршрута вы можете указать подмножество всех возможных действий, которые должен обрабатывать контроллер вместо полного набора стандартных действий:
Именование маршрутов ресурсов
По умолчанию все действия контроллера ресурсов имеют имена маршрутов, но вы можете переопределить эти имена, передав массив names вместе с остальными параметрами:
Вложенные ресурсы
Этот маршрут зарегистрирует «вложенный» ресурс, к которому можно обратиться по такому URL: photos/
Именование параметров маршрута ресурса
По умолчанию PHP Route :: resource создаст параметры для ваших маршрутов ресурсов на основе имени ресурса в единственном числе. Это легко можно изменить для каждого ресурса, передав parameters в массив опций. Массив parameters должен быть ассоциативным массивом имён ресурсов и имён параметров:
Этот пример генерирует следующие URI для маршрута ресурса show :
Или, вы можете глобально задать, чтобы параметры маршрута вашего ресурса были сингулярными, или задать глобальное сопоставление имён параметров ресурса:
При изменении параметров ресурса важно помнить о приоритете именования:
Добавление дополнительных маршрутов в контроллеры ресурсов
Старайтесь, чтобы контроллеры были узкоспециализированными. Если вам постоянно требуются методы вне стандартного набора действий с ресурсами, попробуйте разделить контроллер на два небольших контроллера.
Неявные контроллеры
После регистрации просто добавьте методы в контроллер, назвав их по имени URI с большой буквы и с префиксом в виде типа HTTP-запроса (HTTP verb), который они обрабатывают:
Назначение имён маршрутов
Если вы хотите назвать некоторые маршруты в контроллере, вы можете передать массив имён в качестве третьего аргумента в метод PHP controller () :
Внедрение зависимостей и контроллеры
Внедрение в конструктор
Сервис-контейнер в Laravel используется для работы всех контроллеров Laravel. В результате вы можете указывать типы любых зависимостей, которые могут потребоваться вашему контроллеру в его конструкторе. Заявленные зависимости будут автоматически получены и внедрены в экземпляр контроллера:
Разумеется, вы можете также указать тип любого контракта Laravel. Если контейнер может с ним работать, значит вы можете указывать его тип. В некоторых случаях внедрение зависимостей в контроллер обеспечивает лучшую тестируемость приложения.
Внедрение в метод
Кроме внедрения в конструктор, вы также можете указывать типы зависимостей в методах вашего контроллера. Распространённый пример внедрения в метод — внедрение экземпляра Illuminate\Http\Request в один из методов контроллера:
Если метод вашего контроллера также ожидает данных из параметра маршрута, просто перечислите аргументы маршрута после остальных зависимостей. Например, если ваш маршрут определён так:
Внедрение в метод полностью совместимо с привязкой к модели. Контейнер автоматически определит, какие из аргументов привязаны к модели, а какие аргументы должны быть внедрены.
Кэширование маршрутов
Маршруты на основе замыканий нельзя кэшировать. Чтобы использовать кэширование маршрутов, необходимо перевести все маршруты замыканий на классы контроллера.
Если ваше приложение единолично использует маршруты контроллера, то вы можете воспользоваться преимуществом кэширования маршрутов в Laravel. Использование кэша маршрутов радикально уменьшит время, требуемое для регистрации всех маршрутов вашего приложения. В некоторых случаях регистрация ваших маршрутов может стать быстрее в 100 раз. Для создания кэша маршрутов просто выполните Artisan-команду sh route:cache :
После выполнения этой команды ваши кэшированные маршруты будут загружаться при каждом запросе. Помните, после добавления новых маршрутов, вам необходимо заново сгенерировать свежий кэш маршрутов. Поэтому нужно выполнить команду sh route:cache уже при развёртывании вашего проекта.
Для очистки кэша маршрутов используйте команду sh route:clear :
Комментарии (11)
Для генерации контроллера с методами-заглушками к команде php artisan make:controller PhotoController нужно добавить параметр —resource
Контроллер — это просто файл, содержащий ваш класс контроллера (наследуемый от абстракции контроллера фреймворка, скорее всего). Чтобы удалить контроллер, надо просто удалить класс (файл). Найти его можно в app/Http/Controllers/
Артисан для этого не нужен. Он просто помогает создавать шаблоны этих классов, чтобы вам меньше было писать кода. Удалить вы можете и сами.
Почему статьи для опытных, 200 лет программирующих специалистов? Где пояснение как этим пользоваться, как получать, что с чем взаимодействует, как ресурсный получает все обработчики и выдаёт один путь?
Везде написано — что лишь есть и чем можно пользоваться. Нифига не понятно.
200 лет опыта не обязательно. У меня сразу во время прочтения складываются алгоритмы использования. Достаточно опыта разработки на любом фреймворке, особенно старого(я писал на CodeIgniter) — сразу замечаешь разницу в лучшую сторону
Согласен! Если ранее не сталкивался с подобным, то ничего не понятно. Можно как-нибудь поподробнее?
Нужно дописать что «Неявные контроллеры» не работают начиная с версии 5.3
Не полностью! Все ещё можно использовать:
на сайте есть регистрация и авторизация, которые работают, но нет контроллера UserController для работы с пользователями как в админке так и на сайте, подскажите, мне его нужно создать?
Если контроллер создавался как ресурс с привязкой к модели
Laravel Framework Russian Community
Пролог
Начало работы
Основы архитектуры
Основы
Фронтенд
Безопасность
Копаем глубже
База данных
Eloquent ORM
Тестирование
Официальные пакеты
Контроллеры
Введение
Простейшие контроллеры
Определение контроллеров
Вы можете задать роут для этого контроллера следующим образом:
Контроллеры и пространства имён
Важно помнить, что при определении роута контроллера нам не надо указывать полное пространство имён контроллера. Так как RouteServiceProvider загружает файлы вашего роута в группу роута, которая содержит пространство имён, мы указали только ту часть имени класса, которая следует за частью App\Http\Controllers пространства имён.
Контроллеры одного действия
Для определения контроллера, обрабатывающего всего одно действие, поместите в контроллер единственный метод __invoke :
При регистрации роутов для контроллеров одного действия вам не надо указывать метод:
Посредник контроллера
Посредников можно назначить роутам контроллера в файлах роутов:
Но удобнее указать посредника в конструкторе вашего контроллера. Используя метод middleware в конструкторе контроллера, вы легко можете назначить посредника для действия контроллера. Вы можете даже ограничить использование посредника, назначив его только для определённых методов класса контроллера:
Контроллеры также позволяют регистрировать посредников с помощью замыканий. Это удобный способ определения посредника для одного контроллера, не требующий определения целого класса посредника:
Вы можете назначить посредника на определённый набор действий контроллера, но если возникает такая необходимость, возможно ваш контроллер стал слишком велик. Вместо этого вы можете разбить контроллер на несколько меньших контроллеров.
Контроллеры ресурсов
Маршрутизация ресурсов Laravel назначает обычные CRUD-роуты на контроллеры одной строчкой кода. Например, вы можете создать контроллер, обрабатывающий все HTTP-запросы к фотографиям, хранимым вашим приложением. Вы можете быстро создать такой контроллер с помощью artisan-команды make:controller :
Теперь мы можем зарегистрировать роут контроллера ресурса:
Один этот вызов создаёт множество роутов для обработки различных действий для ресурса. Сгенерированный контроллер уже имеет методы-заглушки для каждого из этих действий с комментариями о том, какие URI и типы запросов они обрабатывают.
Вы можете зарегистрировать сразу несколько контроллеров ресурсов, передав массив:
Действия, обрабатываемые контроллером ресурсов
Операция | URI | Действие | Название роута |
---|---|---|---|
GET | /photos | index | photos.index |
GET | /photos/create | create | photos.create |
POST | /photos | store | photos.store |
GET | /photos/ | show | photos.show |
GET | /photos/ | edit | photos.edit |
PUT/PATCH | /photos/ | update | photos.update |
DELETE | /photos/ | destroy | photos.destroy |
Указание модели ресурса
Подмена методов формы
Частичные роуты ресурсов
При объявлении роута вы можете указать подмножество всех возможных действий, которые должен обрабатывать контроллер вместо полного набора стандартных действий:
Роуты для API-ресурсов
Вы можете зарегистрировать сразу несколько API-контроллеров ресурсов, передав массив:
Вложенные ресурсы
Иногда может понадобиться определить роуты к вложенному ресурсу. Например, фоторесурс может иметь несколько комментариев, которые могут быть прикреплены к фотографии. Для вложенных контроллеров ресурсов используйте dot-нотацию в декларации роута.
Этот маршрут зарегистрирует вложенный ресурс, к которому можно получить доступ с помощью такого URI:
Неглубокое вложение
Часто не обязательно иметь и родительский, и дочерний идентификатор в URI, так как дочерний идентификатор уже является уникальным идентификатором. При использовании уникального идентификатора, такого как первичные ключи для идентификации ваших моделей в сегментах URI, вы можете использовать «неглубокое вложение»:
Данная конструкция зарегистрирует следующие роуты:
Verb | URI | Action | Route Name |
---|---|---|---|
GET | /photos/ | index | photos.comments.index |
GET | /photos/ | create | photos.comments.create |
POST | /photos/ | store | photos.comments.store |
GET | /comments/ | show | comments.show |
GET | /comments/ | edit | comments.edit |
PUT/PATCH | /comments/ | update | comments.update |
DELETE | /comments/ | destroy | comments.destroy |
Именование роутов ресурса
По умолчанию все действия контроллера ресурсов имеют имена роутов, но вы можете переопределить эти имена, передав массив names вместе с остальными параметрами:
Именование параметров роута ресурса
Этот пример генерирует следующие URI для роута ресурса show :
Локализация URI ресурсов
Добавление дополнительных роутов в контроллеры ресурсов
Если вам надо добавить дополнительные роуты в контроллер ресурсов, не входящие в набор роутов ресурсов по умолчанию, их надо определить до вызова Route::resource ; в ином случае, определенные методом resource роуты могут нечаянно превзойти по важности ваши дополнительные роуты:
Старайтесь, чтобы контроллеры были узкоспециализированными. Если вам постоянно требуются методы вне стандартного набора действий с ресурсами, попробуйте разделить контроллер на два небольших контроллера.
Внедрение зависимостей и контроллеры
Внедрение в конструктор
Сервис-контейнер Laravel используется для работы всех контроллеров Laravel. В результате вы можете указывать типы любых зависимостей, которые могут потребоваться вашему контроллеру в его конструкторе. Заявленные зависимости будут автоматически получены и внедрены в экземпляр контроллера:
Вы можете также указать в качестве аргумента тип любого Laravel-контракта. Если контейнер может с ним работать, значит вы можете указывать его тип. В некоторых случаях внедрение зависимостей в контроллер обеспечивает лучшую тестируемость приложения.
Внедрение в метод
Кроме внедрения в конструктор, вы также можете указывать типы зависимостей в методах вашего контроллера. Распространённый пример внедрения в метод — внедрение экземпляра Illuminate\Http\Request в один из методов контроллера:
Если метод вашего контроллера также ожидает данные из параметра роута, перечислите аргументы роута после остальных зависимостей. Например, если ваш роут определён так:
Кэширование роутов
Роуты на основе замыканий нельзя кэшировать. Чтобы использовать кэширование роутов, необходимо перевести все роуты замыканий на классы контроллера.
Если ваше приложение единолично использует роуты контроллера, то вы можете воспользоваться преимуществом кэширования роутов в Laravel. Использование кэша роутов радикально уменьшит время, требуемое для регистрации всех роутов вашего приложения. В некоторых случаях регистрация ваших роутов может стать быстрее в 100 раз. Для создания кэша роутов просто выполните Artisan-команду route:cache :
После выполнения этой команды ваши кэшированные роуты будут загружаться при каждом запросе. Помните, после добавления новых роутов, вам необходимо заново сгенерировать свежий кэш роутов. Поэтому нужно выполнить команду route:cache уже при развёртывании вашего проекта.
Для очистки кэша роутов используйте команду route:clear :