Основы Laravel 5
Как вы помните при создании контроллера Laravel нам создал множество различных методов. По-умолчанию Laravel намекает нам придерживаться метода REST. И именно этой архитектуры мы и будем придерживаться.
Для создании новой записи нам потребуются два метода - create() и store().
С помощью create() мы создаем страницу добавления записи. И по нажатию на кнопку Create данные отправятся в метод store(). (А как практиковалось в давние времена? Кто помнит? Создавали один метод в котором была проверка - если пришли пост данные - значит сохраняем, если не пришли - значит показываем страницу для добавления записи.... бррр.. ))) ).
Для каждого действия (не только создания, но и редактирования данных и тп) нам надо создавать новый маршрут.
Например основываясь на уже имеющихся знаниях мы могли бы записать примерно так -
get('post/create', ['as' => 'post.create', 'uses' => 'PostController@create']); post('post', ['as' => 'post.store', 'uses' => 'PostController@store']); get('post/{post}', ['as' => 'post.show', 'uses' => 'PostController@show']); get('post/{post}/edit', ['as' => 'post.edit', 'uses' => 'PostController@edit']); post('post/{post}', ['as' => 'post.update', 'uses' => 'PostController@update']);
get() мы уже изучали, ну а post() работает аналогично за тем исключением что подразумевается POST запрос.
Такой способ инициализации маршрета удобен - он прост и читабелен. Но так как нам сейчас для обучения нужны все возможности REST, то есть надо в любом случае реализовывать все маршруты, то этоможно записать короче -
$router->resource('post', 'PostController');
Переменную $router мы не создавали, за нас это сделал Laravel ("Ты и есть за меня будешь? - Ага ))))").
Такой подход нам создаст все REST маршруты. Убедиться в этом мы можем выполнив в терминале команду
php artisan route:list
После выполнения этой команды мы получим таблицу всех зарегистрированных маршрутов.
Создадим ссылку на страницу добавления новой записи. Для этого откроем index.blade.php и добавим (дополним) строку -
<div> {!! link_to_route('posts', 'published') !!} {!! link_to_route('posts.unpublished', 'unpublished') !!} {!! link_to_route('post.create', 'new') !!} div>
Создадим шаблон для страницы добавления записи - файл /resouces/views/post/create.blade.php
@extends('app') @section('content') <h1>Createh1> {!! Form::open(['route' => 'post.store']) !!} @include('post._form') {!! Form::close()!!} @endsection
Здесь мы создали типовую страницу и с помощью хелпера подключенного в прошлом уроке создали форму.
Для формы указываем маршрут post.store - туда и будут отправлены данные.
Содержимое формы мы вынесем в отдельный файл (так как форма для добавления статьи будет нами использована и для редактирования статьи) /resouces/views/post/_form.blade.php
Нижнее подчеркивание в названии файла я использовал по аналогии с private методами в php oop. То есть таким образом мы говорим что файл _form.blade.php будет нами использоваться в других шаблонах, но никак это не шаблон для какого-либо экшена.
Создадим шаблон _form.blade.php
<div class="form-group"> {!! Form::label('slug') !!} {!! Form::text('slug', null, ['class'=>'form-control'] ) !!} div> <div class="form-group"> {!! Form::label('title') !!} {!! Form::text('title', null, ['class'=>'form-control'] ) !!} div> <div class="form-group"> {!! Form::label('excerpt') !!} {!! Form::textarea('excerpt', null, ['class'=>'form-control'] ) !!} div> <div class="form-group"> {!! Form::label('content') !!} {!! Form::textarea('content', null, ['class'=>'form-control'] ) !!} div> <div class="form-group"> {!! Form::label('published') !!} {!! Form::checkbox('published', null, false) !!} div> <div class="form-group"> {!! Form::label('published_at') !!} {!! Form::input('date', 'published_at', date('Y-m-d'), ['class'=>'form-control'] ) !!} div> <div class="form-group"> {!! Form::submit('Create', ['class'=>'btn btn-primary']) !!} div>
Тут из кода должно быть все понятно. Поясню лишь для поля даты -
<div class="form-group"> {!! Form::label('published_at') !!} {!! Form::input('date', 'published_at', date('Y-m-d'), ['class'=>'form-control'] ) !!} div>
В хелпере нет Form::date(); По этому мы создаем простой инпут и указываем ему HTML5 тип - date. Третьим параметром задаем значение по-умолчанию. Далее можем передать массив настроек - в данном случае указываем класс для элемента.
Обновляем метод create() -
public function create() { return view('post.create'); }
Проверяем в браузере страницу http://laravel.local/post/create и если все правильно и без ошибок записали, то увидим страницу с формой для ввода новой статьи.
Теперь создадим функционал сохранения записи -
public function store(Post $postModel, Request $request) { $postModel->create($request->all()); return redirect()->route('posts'); }
Расширяем метод store двумя параметрами. $postModel - экземпляр класса Post с помощью которого мы будем сохранять запись. $request - экземпляр класса Request с помощью которого мы получим POST данные в виде массива. В каком порядке размещать переменные - не важно - Ларавел сам разберется.
По завершению добавления записи мы редиректимся по маршруту posts - то есть на главную страницу сайта.