#11 Laravel 5: Create - Добавление записи

Основы 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 - то есть на главную страницу сайта.

 

Добавить отзыв (пожелание, комментарий)

Дмитрий
Это плагин форматирования кода съедает теги (((
Анатолий, Ставрополь
Дима, очередной раз Спасибо за классные бесплатные видео уроки! -------------------------- Теги ты нарочно не закрываешь :-) для самостоятельного изучения - https://yadi.sk/i/7HoOPn7-giYMt