пятница, 23 июня 2017 г.

Миникурс по Laravel. Урок 5.

Реализуем механизм добавления статьи.

В routes/web.php
Route::get('page/add', 'IndexController@add');
Route::post('page/add', 'IndexController@store')->name('articleStore'); // сохранение статьи

Статья добавляется методом post.

Идем в App\Http\Controllers\Index.Controller.php

// Метод добавления статьи должен отразить страницу с формой.
public function
add() {
return view('add-content')->with(['message' => $this->message, // теперь мы
используем не переменные, а свойства
'header' => $this->header
]);
}

Создадим макет add-content.blade.php в \resources\views

@extends('layouts.site') <!-- наследует шаблон -->
@section('content') <!-- директива секции контента -->

<div class="jumbotron">
<div class="container">
<h1>{{$header}}</h1>
<p>{{$message}}</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more &raquo;</a></p>
</div>
</div>

<div class="container">
<!-- Example row of columns -->
<div class="row">
<div class="form">
<form method="POST" action="{{route('articleStore')}}">
<div class="form-group">
<label for="title">Заголовок</label>
<input type="text" class="form-control" id="title" name="title" placeholder="Заголовок">
</div>
<div class="form-group">
<label for="alias">Псевдоним</label>
<input type="text" class="form-control" id="alias" name="alias" placeholder="Псевдоним">
</div>
<div class="form-group">
<label for="exampleInputFile">Краткое описание</label>
<textarea class="form-control" name="desc"></textarea>
</div>
<div class="form-group">
<label for="exampleInputFile">Полный текст</label>
<textarea class="form-control" name="text"></textarea>
</div>
<button type="submit" class="btn btn-default">Submit</button>
{{ csrf_field() }} <!-- реализует защиту от межсайтовых подделок запросов -->
<!-- CSRF - вредоносные атаки, когда несанкционированные команды выполняются от имени зарегестрированного пользователя -->
<!-- <input type="hidden" name="_token" value="ssddlmv какой-то ключ"/>
Проверяется соответствует ли строка отправленная с формой строке, которая содержится в сессии.
И если строки равны, то запрос обрабатывается дальше.
Если не равны, то генерируется исключение и работа проекта останавливается.
-->
</form>
</div>
<hr>

<footer>
<p>&copy; 2016 Company, Inc.</p>
</footer>

@endsection <!-- закрываем директиву секции контента →

Посмотрим, что получилось на странице: http://minilaravel.loc/page/add


Сохраним статью.
Идем в App\Http\Controllers\Index.Controller.php

////
dump($request->all()); // метод all() вернет все данные из объекта Request
Вывод данных
array:5 [▼
  "title" => "Заголовок"
  "alias" => "Псевдоним"
  "desc" => "Краткое описание"
  "text" => "Полный текст"
  "_token" => "q8hY4KuDhWKI3bTm7lkDcwynCFLThRCaL8nPzyxX"
]
////

To obtain an instance of the current HTTP request via dependency injection, you should type-hint the Illuminate\Http\Request class on your controller method. The incoming request instance will automatically be injected by the service container:

Чтобы получить экземпляр текущего HTTP-запроса через инъекцию зависимостей, вы должны наследовать класс Illuminate \ Http \ Request на свой метод контроллера. Экземпляр входящего запроса будет автоматически вводиться контейнером службы:


// Метод сохранения статьи в БД
// $request - объект глобального класса Request
public function store(Request $request) {
// dump($request->all()); // метод all() вернет все данные из объекта Request

// Нам нужно провалидировать данные. Передаем запрос и набор правил валидации.
// 'поле отправляемой формы' => 'правила валидации'
$this->validate($request, [
'title' => 'required|max:255', // максимальный заголовок 255 символов
'alias' => 'required|unique:articles,alias', // уникальный алиас, который проверяется на уникальность в таблице articles
// Также указываем имя поля таблицы. Но если имя поля таблицы совпадает с именем поля формы, то мы можем опустить этот параметр.
'text' => 'required'
]);

// Сохраним информацию в БД
$data = $request->all();

$article = new Article; // это пустая модель объекта Article
// dump($article); // выводится пустая модель, а не выборка из БД

// Заполним данную модель информацией, которая хранится в переменной $data
$article->fill($data); // fill() испоьзуется для заполнения модели информацией
// dump($article); // теперь модель заполнена данными из формы.

// Сохраним данное состояние модели. То есть сохраним информацию в БД.
$article->save();

// Перенаправим пользователя на главную страницу.
return redirect('/');
}

В самой модели нужно указать список полей, для которых разрешено массовое заполнение.
Переходим в \app\Article.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
// Определяем массив со списком тех полей, которые разрешены к массовому заполнению
protected $fillable = ['title', 'alias', 'desc', 'text'];

}

Откроем \resources\views\layouts файл site.blade.php
Добавим информацию для отображения ошибок валидации.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">

<title>Jumbotron Template for Bootstrap</title>

<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('css/jumbotron.css') }}" rel="stylesheet">

</head>

<body>

<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">Project name</a>
</div>
<ul id="navbar" class="menu">
<li><a href="https://laravel.com/docs">Documentation</a></li>
<li><a href="https://laracasts.com">Laracasts</a></li>
<li><a href="https://laravel-news.com">News</a></li>
<li><a href="https://forge.laravel.com">Forge</a></li>
<li><a href="https://github.com/laravel/laravel">GitHub</a></li>
</ul><!--/.navbar-collapse -->
</div>
</nav>
@if(count($errors) > 0) <!-- если есть ошибка -->
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@yield('content') <!-- будет подгружаться -->
</div> <!-- /container -->

</body>

</html>

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

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

Materialize-css. Футер

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