вопросы пишите мне в телеграмм +375298176892
можно скачать офлайн версию сайта: code.mu old.code.mu

Работа с контроллерами

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

Укажем, к примеру, что по обращению к URI 'test/show' выполнится действие show, контроллера TestController:

<?php Route::get('test/show', 'TestController@show'); ?>

Как вы видите, теперь при указании маршрута вместо анонимной функции написано имя контроллера, затем символ @, а затем название действия контроллера.

Давайте теперь сделаем наш контроллер TestController.

Контроллеры размещаются в папке App/Http/Controllers. Перейдем в эту папку и сделаем в ней файл TestController.php и в этом файле разместим следующий код:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { }

Как вы видите, в нашем файле мы описали класс TestController, принадлежащий пространству имен App\Http\Controllers и наследующий от класса App\Http\Controllers\Controller

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

Давайте теперь создадим действие, то есть метод нашего контроллера:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { public function show() { return 'TestController'; } }

Вот и все. Теперь при обращении к URI 'test/show' в браузер выведется то, что возвращает через return наше действие, то есть в нашем случае строка 'TestController'.

Сделайте контроллер Page.

В контроллере Page сделайте действие showOne. Сделайте так, чтобы данное действие было доступно по адресу /pages/show/. По обращению к данному действию выведите на экран какую-нибудь строку.

В контроллере Page сделайте действие showAll. Сделайте так, чтобы данное действие было доступно по адресу /pages/all/. По обращению к данному действию выведите на экран какую-нибудь строку.

С параметрами

Давайте теперь добавим к нашему маршруту параметр:

<?php Route::get('test/show/{param}', 'TestController@show'); ?>

Теперь к нашему действию нужно будет обращаться не через адрес 'test/show', а через адрес вида 'test/show/параметр', где вместо слова параметр может быть любая строка.

Переданный параметр будет попадать в параметр метода нашего действия:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { public function show($param) // получаем переданный параметр { // в переменной $param будет переданный параметр } }

Давайте, например, сразу выведем переданный параметр на экран как результат действия:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { public function show($param) { return $param; // выводим параметр в браузер } }

Теперь при обращении, например, к такому адресу - test/show/1 - на экран выведется число 1, а к такому - test/show/2 - на экран выведется число 2 и так далее.

Модифицируйте действие showOne контроллера Page. Сделайте так, чтобы данное действие было доступно по адресу /pages/show/:id/, где вместо :id будет какое-нибудь число. По обращению к данному действию выведите на экран переданное число.

Модифицируйте предыдущую задачу так, чтобы на экран выводился квадрат переданного числа.

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

Сделайте в действии showOne следующий массив:

<?php $pages = [ 1 => 'страница 1', 2 => 'страница 2', 3 => 'страница 3', 4 => 'страница 4', 5 => 'страница 5', ] ?>

Выведите на экран элемент массива, номер которого соответствует переданному параметру. Если страницы с таким номером нет - выведите сообщение об этом.

Несколько параметров

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

<?php Route::get('test/show/{param1}/{param2}', 'TestController@show'); ?>

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

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { public function show($param1, $param2) // задаем параметры { } }

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

То есть первый параметр маршрута попадает в первый аргумент метода, второй параметр маршрута попадает во второй аргумент метода и так далее.

Давайте выведем на экран переданные параметры:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { public function show($param1, $param2) { return $param1 . ' ' . $param2; } }

Создайте контроллер Test, а в нем действие sum. Сделайте так, чтобы данное действие было доступно по адресу /test/sum/:num1/:num2/, где где вместо :num1 и :num2 будут какие-нибудь числа. Пусть по обращению к данному действию на экран выводится сумма переданных чисел.

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

Практика

Создайте контроллер Employee (работник). В конструкторе класса запишите в свойство $this->employees массив с работниками:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class TestController extends Controller { private $employees; public function __construct() { $this->employees = [ 1 => [ 'name' => 'user1', 'surname' => 'surname1', 'salary' => 1000, ], 2 => [ 'name' => 'user2', 'surname' => 'surname2', 'salary' => 2000, ], 3 => [ 'name' => 'user3', 'surname' => 'surname3', 'salary' => 3000, ], 4 => [ 'name' => 'user4', 'surname' => 'surname4', 'salary' => 4000, ], 5 => [ 'name' => 'user5', 'surname' => 'surname5', 'salary' => 5000, ], ]; } } ?>

В контроллере Employee сделайте действие showOne. Параметром оно должно принимать номер работника в массиве $this->employees и выводить на экран строку с именем, фамилией и зарплатой работника.

В контроллере Employee сделайте действие showField. Параметрами оно должно принимать номер работника в массиве $this->employees и название одного из полей ('name', 'surname' или 'salary'). Действие выводить на экран значение соответствующего поля соответствующего работника.

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