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