Контролери, Laravel на български

HTTP контролери →

контролери
Общност+1000 31 май 2015 г.

Вместо да дефинирате цялата си логика за обработка на заявки като затваряния във вашите маршрутни файлове, можете да я организирате с класове на контролери. Контролерите могат да групират логиката, свързана с обработката на HTTP заявки, в отделен клас. Контролерите се съхраняват в папката app/Http/Controllers.

Най-простите контролери

Дефиниране на контролери

По-долу е даден пример за прост клас контролер. Имайте предвид, че контролерът наследява базовия клас на контролера, вграден в Laravel. Базовият клас предоставя няколко удобни метода, като метода на PHP мидълуер(), използван за присвояване на мидълуер на действия на контролера:

Можем да дефинираме маршрут за действието на този контролер по следния начин:

Сега, когато заявката съвпада с указания URI адрес на маршрута, PHP методът show() на класа UserController ще бъде изпълнен. Разбира се, параметрите на маршрута също ще бъдат предадени на метода.

Контролерите несе изисква да наследяват от базовия клас. Но тогава няма да имате удобствата на методите PHP middleware(), validate() и PHP dispatch().

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

Важно е да запомните, че когато дефинираме маршрут на контролер, не е необходимо да указваме пълното пространство от имена на контролера, а само частта от името на класа, която следва "корена" на пространството от имена - App\Http\Controllers . Тъй като RouteServiceProvider зарежда вашите файлове за маршрут заедно с група за маршрутизиране, съдържаща основното пространство от имена на контролера.

Ако изберете да поставите вашите контролери в поддиректории на App\Http\Controllers, тогава просто използвайте конкретното име на клас спрямо коренапространство от имена App\Http\Controllers. След това, ако пълният път до вашия клас е App\Http\Controllers\Photos\AdminController, тогава трябва да регистрирате маршрути към контролера по следния начин:

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

За да дефинирате контролер, който обработва само едно действие, поставете един PHP метод __invoke() в контролера:

Когато регистрирате маршрути за контролери с едно действие, не е необходимо да указвате метод:

Имена на маршрути на контролери

Подобно на маршрутите за затваряне, можете да посочите имена за маршрутите на контролера:

Можете също да използвате помощната функция PHP route(), за да генерирате URL адреса на маршрута на посочения контролер:

Можете също така да използвате помощния метод action() на PHP, за да генерирате URL, като използвате имената на класа и метода на контролера. Отново трябва да посочим само частта от името на контролера, която идва след базовото пространство от имена App\Http\Controllers:

Можете да получите името на действието, което се изпълнява в дадена заявка, като използвате PHP метода currentRouteAction() на фасадата на Route:

За да получите URL адреса за действие на контролера, използвайте метода PHP action():

Ако искате да получите URL адреса за действие на контролера, като използвате само частта от името на класа спрямо пространството от имена на контролера, регистрирайте основното пространство от имена на контролера с генератор на URL адреси:

Контролер посредник

Проксито може да бъде указано за маршрути на контролера във файловете на маршрута:

Но е по-удобно да посочите междинния софтуер в конструктора на вашия контролер. Използвайки метода PHP middleware() в конструктора на контролера, можете лесно да присвоите мидълуер на действие на контролера. Можете дори да ограничите използването на посредник,като го присвоите само на определени методи от класа на контролера:

Контролерите също ви позволяват да регистрирате прокси сървъри, като използвате затваряния. Това е удобен начин за дефиниране на прокси за един контролер, без да се налага да дефинирате цял прокси клас:

Можете да присвоите прокси към конкретен набор от действия на контролера, но ако възникне необходимост, вашият контролер може да е станал твърде голям. Вместо това можете да разделите контролера на няколко по-малки контролера.

Контролери на ресурси

Маршрутизирането на ресурси на Laravel присвоява редовни CRUD маршрути на контролери с един ред код. Например, можете да създадете контролер, който обработва всички HTTP заявки за снимки, съхранявани от вашето приложение. Можете бързо да създадете такъв контролер с командата sh make:controller Artisan:

Тази команда ще генерира app/Http/Controllers/PhotoController.php контролер. Контролерът ще съдържа метод за всяка налична ресурсна операция.

Сега можем да регистрираме маршрута на контролера на ресурсите:

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

Въведете URI Име на маршрут на действие
ВЗЕМЕТЕ/снимкииндексснимка.индекс
ВЗЕМЕТЕ/снимки/създайсъздавамснимка.създай
ПУБЛИКУВАНЕ/снимкимагазинснимка.магазин
ВЗЕМЕТЕ/снимки/шоуснимка.покажи
ВЗЕМЕТЕ/снимки//редактиранередактиранеснимка.редактиране
ПОСТАВЯНЕ/ИЗКРЪПКА/снимки/актуализацияснимка.актуализация
ИЗТРИЙ/снимки/унищожавамснимка.унищожи

НеНе забравяйте, че тъй като HTML формулярите не могат да правят заявки PUT, PATCH и DELETE, ще трябва да добавите скрито поле _method, за да подправите тези HTTP команди:

Замяна на метод на формуляр

Тъй като HTML формулярите не могат да правят заявки PUT, PATCH и DELETE, трябва да добавите скрито поле _method, за да замените тези HTTP заявки. Помощният метод PHP method_field() ще създаде това поле за вас:

Частични маршрути за ресурси

Наименуване на маршрут на ресурс

По подразбиране всички действия на контролера на ресурсите имат имена на маршрути, но можете да замените тези имена, като подадете масива с имена заедно с останалите параметри:

Вложени ресурси

Наименуване на параметри на маршрута на ресурса

По подразбиране PHP Route::resource ще генерира параметри за вашите маршрути на ресурси въз основа на единственото име на ресурса. Това може лесно да се промени на базата на ресурс чрез предаване на параметри към масива с опции. Масивът от параметри трябва да бъде асоциативен масив от имена на ресурси и имена на параметри:

Този пример генерира следните URI за маршрута на ресурса за показване:

Вместо да предавате масив от имена на параметри, можете просто да подадете думата в единствено число, за да накарате Laravel да използва имената на параметрите по подразбиране, но да ги „единично“:

Или можете глобално да зададете параметрите на маршрута на вашия ресурс да бъдат единични или да зададете глобално съпоставяне на името на параметрите на ресурса:

Когато променяте параметрите на ресурса, е важно да запомните приоритета на именуване:

  1. Параметрите се предават изрично на PHP Route :: resource.
  2. Съпоставянето на глобалните параметри е зададено в PHP Route::resourceParameters.
  3. Единствената настройка се предава през масива от параметри към ресурса Route :: на PHPили задайте в PHP Route :: singularResourceParameters.
  4. Поведение по подразбиране.

Добавяне на допълнителни маршрути към контролери на ресурси

Ако трябва да добавите допълнителни маршрути към контролера на ресурсите, които не са в набора маршрути за ресурси по подразбиране, те трябва да бъдат дефинирани, преди да извикате PHP Route :: resource, в противен случай маршрутите, дефинирани от метода resource() на PHP, могат по невнимание да „победят“ вашите допълнителни маршрути:

Опитайте се да запазите контролерите високо специализирани. Ако постоянно се нуждаете от методи извън стандартния набор от действия с ресурси, помислете дали да разделите вашия контролер на два по-малки контролера.

Неявни контролери

Laravel ви позволява лесно да създадете единичен маршрут, който да управлява всички действия в клас на контролер. Първо регистрирайте маршрут с метода PHP Route::controller(). Този метод приема два аргумента. Първият е основният URI, управляван от контролера, а вторият е името на класа на контролера:

След като се регистрирате, просто добавете методите към контролера, като ги наименувате с тяхното URI име, с главни букви и префикс с типа HTTP заявка (HTTP глагол), която обработват:

Както можете да видите, в този пример методите на индекса обработват основния URI на контролера, който в нашия случай е потребители.

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

Ако искате да наименувате някои маршрути в контролера, можете да подадете масив от имена като трети аргумент на метода PHP controller():

Инжектиране на зависимости и контролери

Инжектиране на конструктор

Сервизният контейнер в Laravel се използва за стартиране на всички Laravel контролери. В резултат на това можете да въведете всякакви зависимости, от които вашият контролер може да се нуждае в неговия конструктор.Декларираните зависимости ще бъдат автоматично получени и инжектирани в екземпляра на контролера:

Разбира се, можете също да посочите типа на всеки договор на Laravel. Ако контейнерът може да работи с него, тогава можете да посочите неговия тип. В някои случаи инжектирането на зависимост в контролер осигурява по-добра възможност за тестване на приложение.

Инжектиране на метод

В допълнение към инжектирането на конструктор, можете също да посочите типове зависимости в методите на вашия контролер. Често срещан пример за инжектиране на метод е инжектирането на екземпляр на Illuminate\Http\Request в един от методите на контролера:

Ако вашият метод на контролер също очаква данни от параметър на маршрут, просто избройте аргументите на маршрута след останалите зависимости. Например, ако вашият маршрут е дефиниран така:

Все още можете да въведете Illuminate\Http\Request и да получите достъп до id параметъра, като дефинирате метод на контролер като този:

Инжектирането на метода е напълно съвместимо с обвързването на модела. Контейнерът автоматично ще определи кои аргументи са обвързани с модела и кои аргументи трябва да бъдат инжектирани.

Кеширане на маршрути

Базираните на затваряне маршрути не могат да бъдат кеширани. За да използвате кеширане на маршрути, трябва да преведете всички затварящи маршрути в класове на контролер.

Ако вашето приложение използва само маршрути на контролер, тогава можете да се възползвате от кеширането на маршрути на Laravel. Използването на кеша за маршрути ще намали драстично времето, необходимо за регистриране на всички маршрути във вашето приложение. В някои случаи регистрирането на вашите маршрути може да бъде до 100 пъти по-бързо. За да създадете кеш маршрут, просто издайте командата sh route:cache Artisan:

След изпълнение на тази команда вашите кеширани маршрути ще бъдатда се зарежда при всяка заявка. Не забравяйте, че след като добавите нови маршрути, трябва да генерирате отново нов кеш за маршрути. Следователно трябва да изпълните командата sh route:cache още при внедряването на вашия проект.

За да изчистите кеша на маршрута, използвайте командата sh route:clear:

Коментари (10)

контролера

За да генерирате контролер с методи на мъниче, добавете параметъра --resource към командата php artisan make:controller PhotoController

контролери

Как да премахнете контролера? занаятчия --помощта не помогна

български

контролери

Контролерът е просто файл, съдържащ вашия клас контролер (най-вероятно наследява от абстракцията на контролера на рамката). За да изтриете контролер, трябва само да изтриете класа (файла). Можете да го намерите в app/Http/Controllers/

Artisan не е необходим за това. Просто ви помага дашаблонирате тези класове, така че да можете да пишете по-малко код.Можете сами да изтриете.

контролера

Защо статии за опитни, 200-годишни програмисти? Къде е обяснението как да се използва, как да се получи, какво взаимодейства с какво, как ресурсът получава всички манипулатори и издава един път? Навсякъде пише - какво само е и какво може да се използва. Нифига не е ясно.

български

200 години опит не са необходими. При мен веднага по време на преглеждане се добавят алгоритми за използване. Достатъчно опит в разработката на всяка рамка, особено старата (писах на CodeIgniter) - веднага забелязвате разликата към по-добро

контролера

Съгласен! Ако не сте изпитвали това преди, тогава нищо не е ясно. Възможно ли е някак по-подробно?

контролера

Необходимо е да се добави, че "Неявните контролери" не работят от версия 5.3

контролери

Не напълно! Все още е възможноизползвайте:

контролера