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

LARAVEL. КЛАСС REQUEST

Класс Request - абстракция отправляемого запроса пользователя.


Создадим страницу контактов.
Откроем routes\web.php
Route::match(['get', 'post'], '/contact', ['uses'=>'Admin\ContactController@show', 'as'=>'contact']);
Создадим контроллер: app\Http\Controllers\Admin\ContactController.php

<?php

namespace App\Http\Controllers\Admin;

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

class ContactController extends Controller
{
public function show() {
return view('default.contact', ['title'=>'Contacts']);
}
}

Создадим вид в resources\views\default\contact.blade.php
@extends('default.layouts.layout')

@section('content')

<div class="col-md-9">

<pre>
{{ print_r(Session::all()) }}
</pre>
<div class="">
<h2>Contact us!</h2>
</div>

<p>
This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.
</p>

<form method="post" action="{{ route('contact') }}">
{{ csrf_field() }}
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" id="name" name="name" value="{{ old('name') }}" placeholder="Jane Doe">
</div>
<div class="form-group">
<label for="email">Email address</label>
<input type="email" class="form-control" id="email" value="{{ old('email') }}" name="email" placeholder="Email">
</div>
<div class="form-group">
<label for="site">Site</label>
<input type="text" class="form-control" id="site" value="{{ old('site') }}" name="site" placeholder="Site">
</div>
<div class="form-group">
<label for="text">Text</label>
<textarea class="form-control" id="text" name="text" rows="3">{{ old('text') }}</textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
@endsection

Откроем public\index.php
Обработка запроса пользователя:
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);

Здесь описаны все методы \vendor\laravel\framework\src\Illuminate\Http\Request.php



В контроллере в качестве параметра передается объект запроса пользователя.
Переменная $request — это объект класса Request.

public function show(Request $request) {
print_r($request->all());
return view('default.contact', ['title'=>'Contacts']);
}

Идем на страницу http://tlaravel.loc/contact
Заполняем контактную форму.

Смотрим исходный код страницы и получаем массив:
Array
(
[_token] => liFmiRNwyC0z3t6StjPfOSqVrm2jNroQzUfi4739
[name] => aaa
[email] => cosmetici@mail.ru
[site] => http://tlaravel.loc/contact
[text] => dddd
)

Формирование и получение доступа к объекту Request можно вынести в конструктор контроллера.

<?php

namespace App\Http\Controllers\Admin;

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

class ContactController extends Controller
{
protected $request;

public function __construct(Request $request) {
$this->request = $request;
}

// В метод show не передаем параметром Request $request
public function show() {
print_r($this->request->all());
return view('default.contact', ['title'=>'Contacts']);
}
}


Допустим, в маршруте передаются параметры:
Например, id? Знак ? Говорит о том, что этот параметр необязательный.

Route::match(['get', 'post'], '/contact/{id?}', ['uses'=>'Admin\ContactController@show', 'as'=>'contact']);

В app\Http\Controllers\Admin\ContactController.php , точнее в метод обработчик будут передаваться все параметры.

public function show(Request $request, $id=FALSE) {
print_r($request->all());
echo '<h1>'.$id.'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

Если мы обратимся: http://tlaravel.loc/contact/69
У нас выведется: 69

Метод input() позволяет получить отдельно доступ к каждой ячейке массива.

Получим доступ к ячейке name:
public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->input('name').'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}


В качестве второго аргумента для input мы можем передать значение по умолчанию.
public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->input('name', 'Default').'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}
}
Метод has() объекта request возвращает истину, если ячейка, которая передается в качестве первого параметра присутствует в массиве передаваемых данных в запросе и при этом значение данной ячейки не пустое.

Если ячейка с именем заполнена, то у нас выведется имя этой ячейки:
public function show(Request $request, $id=FALSE) {
print_r($request->all());
if($request->has('name')) {
echo '<h1 style="margin-top:100px">'.$request->input('name', 'Default').'</h1>';
}
return view('default.contact', ['title'=>'Contacts']);
}
}

Метод only() позволяет указать какие именно параметры запроса вас интересуют.
Получим доступ к ячейкам имя и сайт:
public function show(Request $request, $id=FALSE) {
$array = $request->only('name', 'site');
print_r($array);
return view('default.contact', ['title'=>'Contacts']);
}

Метод except() позволяет указать те ячейки, которые нас не интересуют.
public function show(Request $request, $id=FALSE) {
$array = $request->except('name', 'site');
print_r($array);
return view('default.contact', ['title'=>'Contacts']);
}

И в методе only(), и в except() мы можем передать массив: except(['name', 'site']);

Доступ к интересующим ячейкам массива с передаваемыми данными в запросе, можно получить, используя свойства объекта Request.

public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.
$request->name.'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

Если мы используем параметр для запроса name, который укажем в маршруте и данный параметр укажем в запросе, то значение для параметра name будет записано в свойства объекта Request.

Пример:
Route::match(['get', 'post'], '/contact/{name?}', ['uses'=>'Admin\ContactController@show', 'as'=>'contact']);
Если наберем http://tlaravel.loc/contact/Admin
То у нас выведется Admin

В шаблоне напишем:
<form method="post" action="{{ route('contact', array('name'=>'hello')) }}">

Заполним форму и у нас отобразится имя из формы.
Так происходит, потому что Laravel для записи свойств объекта Request использует данные, передаваемые в запросе, а если их нет, то обращается к параметрам запроса.

Методы для работы с адресной строкой
Метод path() - возвращает часть URI и в данной части содержится запрос.

public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->path().'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

В браузере наберем: http://tlaravel.loc/contact/hello
Выводится: contact/hello

Метод is() - проверяет соответствие адреса с определенным шаблоном, который передается в качестве первого параметра. Возвращает истину, если запрос совпадает с шаблоном.

Проверим соответствует ли запрос шаблону:
public function show(Request $request, $id=FALSE) {

if($request->is('contact/*')) {
echo '<h1 style="margin-top:100px">'.$request->path().'</h1>';
}
return view('default.contact', ['title'=>'Contacts']);
}
В браузере наберем: http://tlaravel.loc/contact/hello
Выводится: contact/hello

Если набрать: http://tlaravel.loc/contact
То в браузере ничего не выводится.

Метод url() возвращает путь, который находится в адресной строке, но без get-параметров.

public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->url().'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

Если набрать: http://tlaravel.loc/contact
Выводится: http://tlaravel.loc/contact

Если нужен полный url, то используем метод fullurl().
public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->fullurl().'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}
}

Если набрать: http://tlaravel.loc/contact?option=t

Работа с разными типами запросов.
Чтобы узнать какой тип запроса использует пользователь применяется метод method().

public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'
.$request->method().'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

Если набрать: http://tlaravel.loc/contact?option=t
Выводится: GET

Если мы отправляем форму, то выводится POST.

Метод isMethod() позволяет узнать какой метод использует пользователь.

Если пользователь использует метод post, то отобразим на экране имя данного метода:
public function show(Request $request, $id=FALSE) {
if($request->isMethod('post')) {
echo '<h1 style="margin-top:100px">'.$request->method().'</h1>';
}
return view('default.contact', ['title'=>'Contacts']);
}

Формируем механизм по обработке данных.
СЕССИИ.
В файле \app\Http\Kernel.php необходимо подключить сессии.

Находим в группе web строку: \Illuminate\Session\Middleware\StartSession::class,
и подключаем ее в массив со свойствами $middleware.

protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\Illuminate\Session\Middleware\StartSession::class,
// \App\Http\Middleware\Mymiddleware::class
];

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

Получим доступ к данным из сессии с помощью метода flash().

Откроем шаблон contact.blade.php и вернем всю информацию из сессии:
<pre>
{{ print_r(Session::all()) }}
</pre>

В ContactController.php

public function show(Request $request, $id=FALSE) {
if($request->isMethod('post')) {
$request->flash();
}
return view('default.contact', ['title'=>'Contacts']);
}

Заполним и отправим форму:
Array
(
    [_token] => oHak3FA4u7WFcYWMk8bVb4wa6pY7trbOqEhEvqeq
    [_previous] => Array
        (
            [url] => http://tlaravel.loc/contact?option=t
        )

    [_flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                    [0] => _old_input
                )

        )

    [_old_input] => Array
        (
            [_token] => oHak3FA4u7WFcYWMk8bVb4wa6pY7trbOqEhEvqeq
            [name] => Jane
            [email] => cosmetici@mail.ru
            [site] => g.ru
            [text] => Text
        )

)
1
token – ключ для безопасности сайта.

В шаблон в форму в каждый value добавим old:

<form method="post" action="{{ route('contact', array('name'=>'hello')) }}">
{{ csrf_field() }}
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" id="name" name="name" value="{{ old('name') }}" placeholder="Jane Doe">
</div>
<div class="form-group">
<label for="email">Email address</label>
<input type="email" class="form-control" id="email" value="{{ old('email') }}" name="email" placeholder="Email">
</div>
<div class="form-group">
<label for="site">Site</label>
<input type="text" class="form-control" id="site" value="{{ old('site') }}" name="site" placeholder="Site">
</div>
<div class="form-group">
<label for="text">Text</label>
<textarea class="form-control" id="text" name="text" rows="3">{{ old('text') }}</textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>

old возвращает данные, хранящиеся в сессии. В форму добавляются данные, указанные в предыдущем сеансе.

Flash() добавляет все данные.

Метод flashOnly() позволяет перечислить только нужные ячейки.
public function show(Request $request, $id=FALSE) {
if($request->isMethod('post')) {
$request->
flashOnly('name', 'site');
}
return view('default.contact', ['title'=>'Contacts']);
}

Метод flashExcept() позволяет указать, какие ячейки нас не интересуют.

public function show(Request $request, $id=FALSE) {
if($request->isMethod('post')) {
$request->flashExcept('name', 'site');
}
return view('default.contact', ['title'=>'Contacts']);
}

Возвращает:
[_old_input] => Array
        (
            [_token] => oHak3FA4u7WFcYWMk8bVb4wa6pY7trbOqEhEvqeq
            [email] => dd@d.g
            [text] => vvvv
        )


Записав информацию в сессию, мы можем вызвать redirect()
public function show(Request $request, $id=FALSE) {
if($request->isMethod('post')) {
$request->flashExcept('name', 'site');
return redirect()->route('contact');
}
return view('default.contact', ['title'=>'Contacts']);
}
Редирект обнуляет данные запроса.

Еще один метод сохранения данных в сессию — это метод withInput()

public function show(Request $request, $id=FALSE) {
if($request->isMethod('post')) {
return redirect()->route('contact')->withInput();
}
return view('default.contact', ['title'=>'Contacts']);
}

Метод root() возвращает домен сайта.

public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->root().'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

При обращении: http://tlaravel.loc/contact
Выводит: http://tlaravel.loc

Метод exists() возвращает истину, если в массиве передаваемых в запросе данных присутствует ячейка, имя которой передается в качестве первого параметра.

Метод query() возвращает определенный параметр из передаваемый get-параметров.
Если вызывается query() без параметров, то возвращается массив со всех передаваемых get-параметров.

public function show(Request $request, $id=FALSE) {
echo '<h1 style="margin-top:100px">'.$request->query('option').'</h1>';
return view('default.contact', ['title'=>'Contacts']);
}

При обращении: http://tlaravel.loc/contact?option=hello
Выводит: hello

Метод header() возвращает в виде массива отправленные вместе с запросом заголовки.

public function show(Request $request, $id=FALSE) {
print_r($request->header());
return view('default.contact', ['title'=>'Contacts']);
}

Метод server() возвращает массив аналогичный массиву $_SERVER.
public function show(Request $request, $id=FALSE) {
print_r($request->server());
return view('default.contact', ['title'=>'Contacts']);
}

Метод segments() возвращает в виде массива те сегменты, на которые будет разделен запрос без учета домена.

public function show(Request $request, $id=FALSE) {
print_r($request->segments());
return view('default.contact', ['title'=>'Contacts']);
}
При обращении: http://tlaravel.loc/contact?option=hello
Выводит: Array
(
    [0] => contact
)
Метод flush() очищает данные, которые были записаны в сессию.

public function show(Request $request, $id=FALSE) {
$request->flash();
$request->flush();
return view('default.contact', ['title'=>'Contacts']);
}

Метод old() возвращает ранее сохраненные в сессию данные.

public function show(Request $request, $id=FALSE) {
$request->flash();
$request->old('name');
return view('default.contact', ['title'=>'Contacts']);
}




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

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

Materialize-css. Футер

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