вторник, 27 июня 2017 г.

LARAVEL. МЕТОДЫ РЕГИСТРАЦИИ МАРШРУТОВ

Машрутизация - получение части запроса пользователя, который следует после базового 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;
});

Распечатаем массив переменных окружения, которые находятся в файле .env
Route::get('/page', function () {
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

Мы можем установить значение настройки методом set.
Route::get('/page', function () {
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

Опишем маршрут для метода post.

Route::post('/comments', function () {
print_r($_POST);
});

При обращении к http://tlaravel.loc/comments у нас возникает ошибка, т.к ищется метод GET.

Метод match обрабатывает различные виды запросов.

Route::match(['get', 'post'], '/comments', function () {
print_r($_POST);
});

При обращении к http://tlaravel.loc/comments отображается пустой запрос. Array ( )

Создадим маршрут для всех видов запроса.
Route::any('/comments', function () {
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');
});

Параметр можно получить из функции обработчика, просто передав его в качестве параметра функции.
Route::get('/page/{id}', function($id) {
echo $id;
});

Наберем в строке: http://tlaravel.loc/page/10
На экран выведется: 10.

Можно передавать 2 параметра:
Route::get('/page/{id}/{cat}', function($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
На экран выведется: hello|10

В этом примере параметры обязательны. Но часто бывает, что параметры не являются обязательными.
Знак ? Говорит о том, что параметр является необязательным. При этом в функции нужно написать $var1 = null

Route::get('/page/{id?}', function($var1 = null) {
echo $var1;
});

На экран выведется: 10.

На экран ничего не выведется.


Если вы напишем так:
Route::get('/page/{id?}', function($var1 = 50) {
echo $var1;
});

И наберем: http://tlaravel.loc/page
На экран выведется: 50. Это значение по умолчанию.


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

Route::get('/page/{id?}', function($var1) {
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]+']);

Мы набираем: 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();
}

Запрашиваем: 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();
}

Запрашиваем: 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(['prefix' => 'admin'], function() {

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('/', ['as' => 'home', function () {
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() {
// Отобразим ссылку на главную страницу:
return redirect()->route('home');
});

Route::get('page/edit', function() {
echo 'page/edit';
});
});

Передадим параметр для формирования ссылки:

Route::get('/article/{id}', ['as' => 'article', function ($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';
});
});

Нас перенаправит: 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';
});
});

Перейдем: 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::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';
});
});

Получим: Array ( [id] => 10 [var] => 50 )


Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html