Laravel - Контроллеры

В структуре MVC буква «C» означает «Контроллер». Он действует как направляющий трафик между представлениями и моделями. В этой главе вы узнаете о контроллерах в Laravel.

Создание контроллера

Откройте командную строку или терминал в зависимости от операционной системы, которую вы используете, и введите следующую команду для создания контроллера с помощью Artisan CLI (интерфейс командной строки).

php artisan make:controller <controller-name> --plain

Замените <controller-name> именем вашего контроллера. Это создаст простой конструктор при передаче аргумента -plain. Если вы не хотите создавать простой конструктор, вы можете просто проигнорировать аргумент. Созданный конструктор можно увидеть по адресуapp/Http/Controllers.

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

Синтаксис

Route::get(‘base URI’,’controller@method’);

пример

Step 1 - Выполните следующую команду, чтобы создать UserController.

php artisan make:controller UserController --plain

Step 2 - После успешного выполнения вы получите следующий результат.

Step 3 - Вы можете увидеть созданный контроллер по адресу app/Http/Controller/UserController.php с уже написанным для вас базовым кодированием, и вы можете добавить свою собственную кодировку в зависимости от ваших потребностей.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   //
}

ПО промежуточного слоя контроллера

Мы уже видели промежуточное ПО, и его также можно использовать с контроллером. Промежуточное ПО также может быть назначено маршруту контроллера или в конструкторе вашего контроллера. Вы можете использовать метод промежуточного программного обеспечения для назначения промежуточного программного обеспечения контроллеру. Зарегистрированное промежуточное ПО также может быть ограничено определенным методом контроллера.

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

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => 'UserController@showProfile'
]);

Здесь мы назначаем промежуточное ПО аутентификации для UserController в маршруте профиля.

Назначение промежуточного программного обеспечения в конструкторе контроллера

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct() {
      $this->middleware('auth');
   }
}

Здесь мы назначаем auth промежуточное ПО, использующее метод промежуточного ПО в UserController конструктор.

пример

Step 1 - Добавьте следующие строки кода в app/Http/routes.php файл и сохраните его.

routes.php

<?php
Route::get('/usercontroller/path',[
   'middleware' => 'First',
   'uses' => 'UserController@showPath'
]);

Step 2 - Создайте промежуточное ПО под названием FirstMiddleware выполнив следующую строку кода.

php artisan make:middleware FirstMiddleware

Step 3 - Добавьте следующий код в handle метод вновь созданного FirstMiddleware на app/Http/Middleware.

FirstMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class FirstMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>First Middleware';
      return $next($request);
   }
}

Step 4 - Создайте промежуточное ПО под названием SecondMiddleware выполнив следующую команду.

php artisan make:middleware SecondMiddleware

Step 5 - Добавьте следующий код в метод handle только что созданного SecondMiddleware по адресу app/Http/Middleware.

SecondMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class SecondMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>Second Middleware';
      return $next($request);
   }
}

Step 6 - Создайте контроллер под названием UserController выполнив следующую строку.

php artisan make:controller UserController --plain

Step 7 - После успешного выполнения URL-адреса вы получите следующий вывод -

Step 8 - Скопируйте следующий код в app/Http/UserController.php файл.

app/Http/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct() {
      $this->middleware('Second');
   }
   public function showPath(Request $request) {
      $uri = $request->path();
      echo '<br>URI: '.$uri;
      
      $url = $request->url();
      echo '<br>';
      
      echo 'URL: '.$url;
      $method = $request->method();
      echo '<br>';
      
      echo 'Method: '.$method;
   }
}

Step 9 - Теперь запустите внутренний веб-сервер php, выполнив следующую команду, если вы еще не выполнили ее.

php artisan serve

Step 10 - Посетите следующий URL.

http://localhost:8000/usercontroller/path

Step 11 - Результат будет таким, как показано на следующем изображении.

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

Часто при создании заявки нам нужно выполнить CRUD (Create, Read, Update, Delete)операции. Laravel облегчает нам эту работу. Просто создайте контроллер, и Laravel автоматически предоставит все методы для операций CRUD. Вы также можете зарегистрировать единый маршрут для всех методов в файле routes.php.

пример

Step 1 - Создайте контроллер под названием MyController выполнив следующую команду.

php artisan make:controller MyController

Step 2 - Добавьте следующий код в

app/Http/Controllers/MyController.php файл.

app/Http/Controllers/MyController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class MyController extends Controller {
   public function index() {
      echo 'index';
   }
   public function create() {
      echo 'create';
   }
   public function store(Request $request) {
      echo 'store';
   }
   public function show($id) {
      echo 'show';
   }
   public function edit($id) {
      echo 'edit';
   }
   public function update(Request $request, $id) {
      echo 'update';
   }
   public function destroy($id) {
      echo 'destroy';
   }
}

Step 3 - Добавьте следующую строку кода в app/Http/routes.php файл.

app/Http/routes.php

Route::resource('my','MyController');

Step 4- Сейчас мы регистрируем все методы MyController, регистрируя контроллер с ресурсом. Ниже приведена таблица действий, выполняемых контроллером ресурсов.

Глагол Путь Действие Название маршрута
ПОЛУЧИТЬ / мой индекс my.index
ПОЛУЧИТЬ / мой / создать Создайте my.create
ПОСЛЕ / мой хранить my.store
ПОЛУЧИТЬ /мой мой} Показать my.show
ПОЛУЧИТЬ / my / {my} / edit редактировать my.edit
PUT / PATCH /мой мой} Обновить my.update
УДАЛЯТЬ /мой мой} уничтожить my.destroy

Step 5 - Попробуйте выполнить URL-адреса, указанные в следующей таблице.

URL Описание Выходное изображение
http: // локальный: 8000 / мой Выполняет индексный метод MyController.php индекс
http: // локальный: 8000 / мой / создать Выполняет метод create MyController.php Создайте
http: // локальный: 8000 / мой / 1 Выполняет метод show MyController.php Показать
http: // локальный: 8000 / мой / 1 / редактировать Выполняет метод редактирования MyController.php редактировать

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

Неявные контроллеры позволяют вам определять один маршрут для обработки каждого действия в контроллере. Вы можете определить его в файле route.php с помощьюRoute:controller метод, как показано ниже.

Route::controller(‘base URI’,’<class-name-of-the-controller>’);

Замените <имя-класса-контроллера-контроллера> именем класса, которое вы дали своему контроллеру.

Имя метода контроллера должно начинаться с HTTP-глагола, например, get или post. Если вы запустите его с помощью get, он будет обрабатывать только запрос на получение, а если он начинается с post, он будет обрабатывать запрос post. После HTTP-команды вы можете дать методу любое имя, но оно должно соответствовать версии заголовка URI.

пример

Step 1- Выполните команду ниже, чтобы создать контроллер. Мы сохранили название классаImplicitController. Вы можете дать классу любое имя по вашему выбору.

php artisan make:controller ImplicitController --plain

Step 2 - После успешного выполнения шага 1 вы получите следующий результат -

Step 3 - Скопируйте следующий код в

app/Http/Controllers/ImplicitController.php файл.

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   /**
      * Responds to requests to GET /test
   */
   public function getIndex() {
      echo 'index method';
   }
   
   /**
      * Responds to requests to GET /test/show/1
   */
   public function getShow($id) {
      echo 'show method';
   }
   
   /**
      * Responds to requests to GET /test/admin-profile
   */
   public function getAdminProfile() {
      echo 'admin profile method';
   }
   
   /**
      * Responds to requests to POST /test/profile
   */
   public function postProfile() {
      echo 'profile method';
   }
}

Step 4 - Добавьте следующую строку в app/Http/routes.php файл для маршрутизации запросов к указанному контроллеру.

app/Http/routes.php

Route::controller('test','ImplicitController');

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

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

пример

Step 1 - Добавьте следующий код в app/Http/routes.php файл.

app/Http/routes.php

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

Step 2 - Добавьте следующий код в

app/Http/Controllers/ImplicitController.php файл.

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   private $myclass;
   
   public function __construct(\MyClass $myclass) {
      $this->myclass = $myclass;
   }
   public function index() {
      dd($this->myclass);
   }
}

Step 3 - Посетите следующий URL-адрес, чтобы протестировать внедрение конструктора.

http://localhost:8000/myclass

Step 4 - Результат будет таким, как показано на следующем изображении.

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

Помимо внедрения конструктора, вы также можете ввести зависимости от методов действий вашего контроллера.

пример

Step 1 - Добавьте следующий код в app/Http/routes.php файл.

app/Http/routes.php

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

Step 2 - Добавьте следующий код в

app/Http/Controllers/ImplicitController.php файл.

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   public function index(\MyClass $myclass) {
      dd($myclass);
   }
}

Step 3 - Посетите следующий URL-адрес, чтобы протестировать внедрение конструктора.

http://localhost:8000/myclass

Он выдаст следующий результат -