Машрутизация
- получение части запроса пользователя,
который следует после базового url и ее
разложения на параметры для определения
того, какой контроллер и какое действие
данного контроллера должны выполнить
поставленный запрос. И передача управления
определенному контроллеру.
Это
процесс разбора части URI
и поиска совпадения с описанным ранее
маршрутом или роутером.
И
последующим вызовом на исполнение
обработчика найденного маршрута.
URI =
http://domen.ru/articels/internet/articale.html
URL =
http://domen.ru
URN =
/articels/internet/articale.html
Uniform
Resource Identifier — унифицированный
(единообразный) идентификатор ресурса.
Ресурс
- любой элемент, к которому возможно
обращение пользователя (страница сайта,
скрипты, стили, изображения).
URI —
имя и адрес ресурса в сети.
URL и
URN — составляющие URI.
Uniform
Resource Locator - единообразный указатель
ресурса. Это домен и проокол.
Uniform
Resource Name — единообразный указатель
имени.
Типы http запросов.
Протокол
http описывает взаимодействие между 2-мя
компьютерами, т.е клиентом и сервером.
При этом данное взаимодействие строится
на базе сообщений, называемых запрос
(request) и ответ (response).
Каждое
сообщение состоит из 3 частей: стартовая
строка, заголовки и тело сообщения.
Обязательной является только стартовая
строка.
METHOD
URI HTTP/VERSION
METHOD
- тип http запроса
URI -
идентификатор ресурса
VERSION
- версия протокола http, сейчас актуальная
версия 1.1
Заголовки
- набор пар: имя и значение, которые
разделяются двоеточием.
В
заголовках передается различная
служебная информация: кодировка
сообщения, название и версия браузера,
адрес, с которого пришел клиент и т. д.
Тело
сообщения - это передаваемые данные.
В
ответе сервера - это страница, которую
запросил браузер. Как правило, тело
сообщения в запросе вообще отсутствует.
Иногда
бывает очень полезно проверить, какими
заголовками обмениваются клиент и
сервер на каком-либо сайте. Это делается
довольно просто, если установить в свой
браузер специальное дополнение. Одним
из таких дополнений является Live HTTP
Headers для Mozilla FireFox.
Вызывается:
Инструменты — просмотр HTTP-заголовков.
Тип
или метод http-запроса указывает серверу
на то, какое действие мы хотим произвести
с тем или иным ресурсом.
Для
разграничения действий на уровне http
были придуманы: GET (получение ресурса),
POST (создание ресурса), PUT (обновление
ресурса), DELETE (удаление ресурса).
При
этом http не обязывает сервер понимать
все типы запросов. Обязателен только
GET.
А
также протокол http не указывает серверу,
что он должен делать при получении
запроса с тем или иным методом.
Сервер
на запрос DELETE не обязан удалять страницу.
Это уже мы должны описать соответствующий
функционал.
Данные
типы запросов активно используют в
приложениях типа REST. Приложения данного
типа выполняют действия, используя
соответствующие типы запросов.
Удаление
ресурса выполняется только при обращении
http метода delete, отображение - при обращении
к ресурсу запросом GET.
Все
о маршрутизаторе: https://laravel.com/docs/5.4/routing
В /routes/web.php
Этот
файл загружается специальным
сервис-провайдером
app\Providers\RouteServiceProvider.php
В
/routes/web.php создадим маршрут
Фасад
- специальный класс, который предоставляет
доступ к определенному элементу
фреймворка Laravel. Он предоставляет
упрощенный доступ к другому классу.
Обращаемся
к фасаду и вызываем определенный метод.
Route::get
Route::post
Route::put
Доступные
методы:
Route::get($uri,
$callback);
Route::post($uri,
$callback);
Route::put($uri,
$callback);
Route::patch($uri,
$callback);
Route::delete($uri,
$callback);
Route::options($uri,
$callback);
Первым
параметром передаем шаблон, т.е запрос,
который будет обработан текущим
маршрутом.
Второй
параметр: массив, функция-обработчик,
метод контроллера.
Route::get('/page',
function () {
echo 'Hello';
return;
});
echo 'Hello';
return;
});
Распечатаем
массив переменных окружения, которые
находятся в файле .env
Route::get('/page',
function () {
echo '<pre>';
print_r($_ENV);
echo '</pre>';
});
echo '<pre>';
print_r($_ENV);
echo '</pre>';
});
Отображается:
Array
(
[APP_NAME] => Laravel
[APP_ENV] => local
[APP_KEY] => base64:G4cwsjCCB9TvBaGDqLr9+WH3wkS1PgFYkhm6DA5NqKQ=
[APP_DEBUG] => true
[APP_LOG_LEVEL] => debug
[APP_URL] => http://localhost
[DB_CONNECTION] => mysql
[DB_HOST] => 127.0.0.1
[DB_PORT] => 3306
[DB_DATABASE] => homestead
[DB_USERNAME] => homestead
[DB_PASSWORD] => secret
[BROADCAST_DRIVER] => log
[CACHE_DRIVER] => file
[SESSION_DRIVER] => file
[QUEUE_DRIVER] => sync
[REDIS_HOST] => 127.0.0.1
[REDIS_PASSWORD] => null
[REDIS_PORT] => 6379
[MAIL_DRIVER] => smtp
[MAIL_HOST] => smtp.mailtrap.io
[MAIL_PORT] => 2525
[MAIL_USERNAME] => null
[MAIL_PASSWORD] => null
[MAIL_ENCRYPTION] => null
[PUSHER_APP_ID] =>
[PUSHER_APP_KEY] =>
[PUSHER_APP_SECRET] =>
)
Обратимся к
конфигурации нашего фреймворка через
фасад:
Route::get('/page',
function () {
echo '<pre>';
echo Config::get('app.locale');
echo '</pre>';
});
// en
echo '<pre>';
echo Config::get('app.locale');
echo '</pre>';
});
// en
Мы можем
установить значение настройки методом
set.
Route::get('/page',
function () {
echo '<pre>';
echo Config::set('app.locale', 'ru');
echo Config::get('app.locale');
echo '</pre>';
});
echo '<pre>';
echo Config::set('app.locale', 'ru');
echo Config::get('app.locale');
echo '</pre>';
});
// ru
Доступ к
переменным окружения мы можем получить,
используя функцию env()
Route::get('/page',
function () {
echo env('APP_ENV');
});
// local
echo env('APP_ENV');
});
// local
Опишем маршрут
для метода post.
Route::post('/comments',
function () {
print_r($_POST);
});
print_r($_POST);
});
При
обращении к http://tlaravel.loc/comments
у нас возникает ошибка, т.к ищется метод
GET.
Метод match
обрабатывает различные виды запросов.
Route::match(['get',
'post'], '/comments', function () {
print_r($_POST);
});
print_r($_POST);
});
Создадим
маршрут для всех видов запроса.
Route::any('/comments',
function () {
print_r($_POST);
});
print_r($_POST);
});
При
отправке запросов типа PUT в
форму добавляем строку:\
<input
type="hidden"name="_method" value="PUT"/>
Фасад
Route описан config\app.php
В
/routes/web.php создадим маршрут
Помимо
статический свойств в запросе могут
передаваться динамические параметры.
Например, id-статьи.
Параметр
— это переменная.
Route::get('/page/{id_cat}/{id}',
function () {
return view('page');
});
return view('page');
});
Параметр
можно получить из функции обработчика,
просто передав его в качестве параметра
функции.
Route::get('/page/{id}',
function($id) {
echo $id;
});
echo $id;
});
Наберем
в строке: http://tlaravel.loc/page/10
На
экран выведется: 10.
Можно
передавать 2 параметра:
Route::get('/page/{id}/{cat}',
function($id, $cat) {
echo $id.'|'.$cat;
});
echo $id.'|'.$cat;
});
http://tlaravel.loc/page/10/hello
На
экран выведется: 10|hello
Параметры передаются
по порядку, а не по имени!!!
Route::get('/page/{cat}/{id}',
function($cat, $id) {
echo $id.'|'.$cat;
});
http://tlaravel.loc/page/10/hello
echo $id.'|'.$cat;
});
http://tlaravel.loc/page/10/hello
На
экран выведется: hello|10
В
этом примере параметры обязательны. Но
часто бывает, что параметры не являются
обязательными.
Знак
? Говорит о том, что параметр является
необязательным. При этом в функции нужно
написать $var1 = null
Route::get('/page/{id?}',
function($var1 = null) {
echo $var1;
});
echo $var1;
});
На
экран выведется: 10.
На
экран ничего не выведется.
Если
вы напишем так:
Route::get('/page/{id?}',
function($var1 = 50) {
echo $var1;
});
echo $var1;
});
И
наберем: http://tlaravel.loc/page
На
экран выведется: 50. Это значение по
умолчанию.
Мы
можем определить условия, которые
соответствуют регулярным выражениям,
которым обязательно должен удовлетворять
параметр.
Мы
можем сформировать фильтрацию или
проверку на соответствие параметра
заданному условию.
Route::get('/page/{id?}',
function($var1) {
echo $var1;
})->where('id', '[0-9]+');
// В where вторым параметром передаем регулярное выражение, которое означает, что числа от 0 до 9 могут повторятся сколько угодно раз
В where параметром идет только id, т.е значение должно совпадать с шаблоном.
echo $var1;
})->where('id', '[0-9]+');
// В where вторым параметром передаем регулярное выражение, которое означает, что числа от 0 до 9 могут повторятся сколько угодно раз
В where параметром идет только id, т.е значение должно совпадать с шаблоном.
Если
мы работаем с несколькими параметрами
и для каждого нужно определить условие.
Route::get('/page/{cat}/{id}',
function($var1) {
echo $var1;
})->where(['id' => '[0-9]+', 'cat' => '[A-Za-z]+']);
echo $var1;
})->where(['id' => '[0-9]+', 'cat' => '[A-Za-z]+']);
Мы
набираем: http://tlaravel.loc/page/cat/1
Так будет ошибка:
http://tlaravel.loc/page/cat/p
Это условие для
конкретного роутера. Иногда нужно
определить условия для всех роутеров
приложения.
Для глобальных настроек
нужно использовать
app\Providers\RouteServiceProvider.php
и его метод
boot().
pattern
- метод для определения глобальных
параметров всех описаннах роутеров.
public
function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
Запрашиваем:
http://tlaravel.loc/page/10/10
Получаем:
10.
Это
выдаст ошибку: http://tlaravel.loc/page/10/hello
Справка:
void
pattern(string $key, string $pattern)
Если
нужно определить несколько глобальных
условий для наших параметров маршрутов:
public function boot()
{
Route::patterns(['id' => '[0-9]+', 'cat' => '[A-Za-z]+']);
parent::boot();
}
{
Route::patterns(['id' => '[0-9]+', 'cat' => '[A-Za-z]+']);
parent::boot();
}
Запрашиваем:
http://tlaravel.loc/page/cat/10
Получаем:
10.
Группировка
роутеров
Часто
нужно применять одни и те же классы-посредники
к набору различных маршрутов.
Чтобы
не прописывать для каждого маршрута
применение того или иного посредника,
мы можем один раз определить группу.
Для нее определить класс-посредник.
Данный класс-посредник будет отрабатывать
для каждого маршрута, входящего в состав
группы.
Это
удобно при формировании отдельного
раздела сайта, адрес которого начинается
с постоянного префикса. Например
админ-панели: http://tlaravel.loc/page/admin/edit/page
Создадим
маршруты для
//
Определим группу маршрутов:
Route::group([], function() {
Route::get('page/create', function() {
echo 'page/create';
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::group([], function() {
Route::get('page/create', function() {
echo 'page/create';
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Добавим
префикс:
Route::group(['prefix'
=> 'admin'], function() {
Route::get('page/create', function() {
echo 'page/create';
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create', function() {
echo 'page/create';
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Выводит:
Передадим
префикс с параметром:
Route::group(['prefix'
=> 'admin/{id}'], function() {
Route::get('page/create', function() {
echo 'page/create';
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create', function() {
echo 'page/create';
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Формирование
ссылок.
Route::get('/',
['as' => 'home', function () {
return view('welcome');
}]);
return view('welcome');
}]);
Теперь
мы можем создать ссылку на текущий
роутер:
//
Определим группу маршрутов:
Route::group(['prefix' => 'admin/{id}'], function() {
Route::get('page/create', function() {
// Отобразим ссылку на главную страницу:
echo route('home');
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::group(['prefix' => 'admin/{id}'], function() {
Route::get('page/create', function() {
// Отобразим ссылку на главную страницу:
echo route('home');
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Сделаем
редирект:
Route::group(['prefix'
=> 'admin/{id}'], function() {
Route::get('page/create', function() {
// Отобразим ссылку на главную страницу:
return redirect()->route('home');
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create', function() {
// Отобразим ссылку на главную страницу:
return redirect()->route('home');
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Передадим
параметр для формирования ссылки:
Route::get('/article/{id}',
['as' => 'article', function ($id) {
echo $id;
}]);
echo $id;
}]);
Route::group(['prefix'
=> 'admin/{id}'], function() {
Route::get('page/create', function() {
// Отобразим ссылку на главную страницу:
return redirect()->route('article', array('id'=>25));
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create', function() {
// Отобразим ссылку на главную страницу:
return redirect()->route('article', array('id'=>25));
});
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Перейдем:
http://tlaravel.loc/admin/page/create
Нас
перенаправит: http://tlaravel.loc/article/25
Метод Route
Route::group(['prefix'
=> 'admin/{id}'], function() {
Route::get('page/create', function() {
$route = Route::current();
echo $route->getName(); // отобразим имя маршрута
})->name('createpage'); // определим имя маршрута
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create', function() {
$route = Route::current();
echo $route->getName(); // отобразим имя маршрута
})->name('createpage'); // определим имя маршрута
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Перейдем:
http://tlaravel.loc/admin/10/page/create
Выведет:
createpage
Если передаются
параметры:
Route::group(['prefix'
=> 'admin/{id}'], function() {
Route::get('page/create/{var}', function($id) {
$route = Route::current();
echo $route->forgetParameter('var', 24); // отобразим имя маршрута
})->name('createpage'); // определим имя маршрута
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create/{var}', function($id) {
$route = Route::current();
echo $route->forgetParameter('var', 24); // отобразим имя маршрута
})->name('createpage'); // определим имя маршрута
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Получим массив
параметров:
Route::group(['prefix'
=> 'admin/{id}'], function() {
Route::get('page/create/{var}', function($id) {
$route = Route::current();
print_r($route->parameters());
})->name('createpage'); // определим имя маршрута
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Route::get('page/create/{var}', function($id) {
$route = Route::current();
print_r($route->parameters());
})->name('createpage'); // определим имя маршрута
Route::get('page/edit', function() {
echo 'page/edit';
});
});
Получим:
Array ( [id] => 10 [var] => 50 )
Комментариев нет:
Отправить комментарий