Реализуем
механизм добавления статьи.
В
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
]);
}
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 »</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>© 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('/');
}
// $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'];
}
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>
Комментариев нет:
Отправить комментарий