Laravel 5.5 - Study

lavarel5.5
https://readouble.com/laravel/5.5/ja/installation.html

Laravelで日付時刻の処理を書くならCarbon(カーボン)を使え
https://apecell.com/2016/02/08/id/219

【5.5対応】Laravel の Collection を使い倒してみたくなった 〜 サンプルコード 115 連発
https://qiita.com/nunulk/items/9e0c4a371e94d763aed6

php composer.phar create-project laravel/laravel --prefer-dist night 5.5

記事詳細表示

Route::get('/posts/{id}', 'PostsController@show');

コントローラ

public function show($id) {
    $post = Post::findOrFail($id);
    return view('posts.show')->with('post', $post);
}

HTML

{!! nl2br(e($post->body)) !!}

HTML(導線)

<a href="{{ url('posts', $post->id) }}"></a>

<a href="{{ action('PostsController@show', $post->id) }}"></a>

// URL Encode
{{ urldecode(URL::route('press')) }}

暗黙的データひも付け(Implicit Binding)

Route::get('/posts/{post}', 'PostsController@show');

public function show(Post $post) {
    return view('posts.show')->with('post', $post);
}
<a href="{{ action('PostsController@show', $post) }}"></a>

記事新規作成

HTML 入力フォーム エラー表示

<form method="post" action="{{ url('/posts') }}">
    {{ csrf_field() }}

    <p><input type="text" name="title" placeholder="enter title" value="{{ old('title') }}"></p>
    @if($errors->has('title'))
    <span class="error">{{ $errors->first('title') }}</span>
    @endif

    <p><textarea name="body" placeholder="enter body">{{ old('body') }}</textarea></p>
    @if($errors->has('body'))
    <span class="error">{{ $errors->first('body') }}</span>
    @endif
</form>
@if (count($erros) > 0)
<div><ul>
@forach ($errors->all as $error
    <li>{{ $error }}</li>
@endforeach
</ul></dev>
@endif

ルーティング

Route::get('/posts/create', 'PostsController@create');
Route::post('/posts', 'PostsController@store'); // doPost

バリデート

$this->validate($request, [
    'title' => 'required|min:3',
    'body' => 'required',
]);

DB保存

$post = new Post();
$post->title = $request->title;
$post->body = $request->body;
$post->save();
return redirect('/');

記事編集

HTML(導線)

// コントローラに Post モデルを渡せる
<a href="{{ acton('PostsController@edit', $post) }}" class="edit">[Edit]</a>

HTML

<form method="post" action="{{ url('/posts', $post->id) }}">
    {{ csrf_field() }}
    {{ method_field('patch') }}

    <p><input type="text" name="title" placeholder="enter title" value="{{ old('title', $post->title) }}"></p>
    @if($errors->has('title'))
    <span class="error">{{ $errors->first('title') }}</span>
    @endif

    <p><textarea name="body" placeholder="enter body">{{ old('body', $post->body) }}</textarea></p>
    @if($errors->has('body'))
    <span class="error">{{ $errors->first('body') }}</span>
    @endif

    <p><input type="submit" value="SUBMIT"></p>
</form>

ルーティング

Route::get('/posts/{post}/edit', 'PostsController@edit');
Route::patch('/posts/{post}', 'PostsController@update');

コントローラ

public function edit(Post $post) {
    retur view('post.edit')->with('post', $post);
}

public function update(Request $request, Post $post) {
    $this->validate($request, [
        'title' => 'required|min:3',
        'body' => 'required',
    ]);

    // DB更新
    $post->title = $request->title;
    $post->body = $request->body;
    $post->save();
    return redirect('/');
}

独自リクエストクラス

php artisan make:request PostRequest

→ app/Http/Requests/PostRequest.php

public function authorize() {
    return true; // 認証なし
}

public function rules() {
    return [
        'title' => 'required|min:3',
        'body' => 'required',
    ];
}

public function messages() {
    'title.required' => 'タイトル入れなさい',
}

コントローラー

use App\Http\Requests\PostRequest;

public function update(PostRequest $request, Post $post) {
    // DB更新
    $post->title = $request->title;
    $post->body = $request->body;
    $post->save();
    return redirect('/');
}

追記めも

ディレクトリパーミッション

Laravelをインストールした後に、多少のパーミッションの設定が必要です。storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてください

chmod 777 storage
chmod 777 bootstrap/cache

seed追加等でオートロードの更新が必要

php composer.phar dump-autoload