引き続きドットインストールのお世話になります。
今回もlaravelフレームワークのメモを残していきます。
version info
- PHP 5.6.29
- Laravel Framework version 5.3.28
メモ
- @yeild('xxx')
-
セクション名(?)を決める。
ここに埋め込む内容を@sectionブロックに書く。 - @extends('layouts.default')
- テンプレートの指定
-
@section('xxx')
hoge @endsection - セクションに埋め込む内容を記述
- @section('xxx' ,'hoge')
- 埋め込む内容を第2引数にして1行で書くこともできる。
- php artisan make:controller Controller
-
artisanコマンドでコントローラーの作成
app/Http/Controllersディレクトリ配下にController.phpが作成されます。 - dd($posts->toArray());
-
Dump & Die
オブジェクトを出力して、廃棄する?
改めて調べます。 - 途中のコントローラ
-
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class PostController extends Controller { // public function index() { // $posts = \App\Post::all(); $posts = App\Post::all(); dd($posts->toArray()); return view('posts.index'); } }
- Post::orderBy('created_at', 'desc')->get();
- オブジェクトの取得、指定したカラムの降順
- $posts = Post::latest('created_at')->get();
- 同じく、オブジェクトの取得、指定したカラムの降順
- return view('posts.index', ['applicants' => $applicants]);
-
ビューに値・オブジェクトを渡す。
この例だと、applicantsというキーで、$applicantsを渡している。 - return view('posts.index')->with('posts' ,$posts);
- 上の例と同じ。書き方のバリエーションありすぎ困る。。。
-
@foreach ( $posts as $post ) <li><a href="">{{ $post->title }}</a></li> @endforeach
-
bladeでのforeachの埋め込み。
foreachのオルタネイティブな書き方とにている。
{{ }} によるhtml encode(エスケープ)してくれる
試しに<script>を表示させて見たら、
ちゃんと「<:script>」と表示された - {{-- --}}
-
bladeのコメント
パースしてあげれば消える - foreach・オブジェクトが空の時の分岐付き
-
<ul> @forelse ( $posts as $post ) <li><a href="">{{ $post->title }}</a></li> @empty <li>empty</li> @endforelse </ul>
これイイすね。
Thymeleafだと一回リストが空か判定をいれるから、
ネストが深くなって読みづらくなります。forelseだとスッキリしますね。 - URLの埋め込み方いろいろ
-
- /comment/{{ $comment->id }}
- {{ url('/comment', $comment->id }}
- {{ action('CommentController@show', $comment->id) }}
CommentControllerのshowメソッドを実行 - $comments = Comment::findOrFail($id) ;
- 該当するidのレコードが見つからない場合は、例外を返す
- "{!! !!}" と "{{ }}"
-
"{!! !!}" :HTMLエスケープしない
"{{ }}" :HTMLエスケープする(PHPのhtmlentities関数を通す) - nl2br(string [,bool = true] )
-
PHPの関数
string内の改行コードを<br>(false時)または<br />(true時)に置き換える 改行 - laravelのe()関数(ヘルパー関数)
- PHPのhtmlentites関数を実行する
- {!! nl2br(e($comment->body)) !!}
-
安全に文字列を埋め込むには、これだと覚えるしかないですかね。。。
- e()でエスケープ
- 改行を<br>タグに置き換える
- エスケープなしで出力(e()でエスケープ済み)
- ルーティングの注意
-
上から見ていって先にマッチしたマッピングが動作する
ファイル指定のルーティングをパラメータ指定のルーティングより先に書く - CSS: input [type=text] { }
-
textのinputのブロック
最近全然CSS書いてなかったのでメモ_φ(・_・ - MethodNotAllowedHttpException
- ルーティングしていないURLにアクセスすると、この例外がでる
- public function store(Request $request )
-
Illuminate\Http\Requestクラスを引数に取ることで、
HTTPリクエストのインスタンスを取得できる。 - laravel Eloquentのsaveメソッド
- データベースに結びついているオブジェクトを更新する
- TokenMismatchException
-
laravel5の標準でPostのHTTPリクエストを受けると、
TokenMismatchExceptionを投げる。 - SQLの失敗例外
-
QueryException in Connection.php line 770: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'body' cannot be null (SQL: insert into `posts` (`title`, `body`, `updated_at`, `created_at`) values (fasdf, , 2016-12-31 15:32:15, 2016-12-31 15:32:15))
フォームのnameが間違っていて、not null例外が発生したもの - {{ csrf_field() }}
-
このトークンをpostを投げるform内に配置することで、
TokenMismatchExceptionを回避できる。
<form method="post" action="{{ url('/') }}"> {{ csrf_field() }}
- フラッシュデータを出力する
- return redirect('/')->with('msg', 'You did it!');
- session('msg')
- セッションの要素を取り出す。
- onclick="this.classList.add('hidden')"
- DOMの操作。onclickを書いた要素にhiddenクラスを追加
- laravel validation
-
コントローラでvalidateメソッドを呼ぶ
バリデートに失敗すると、エラーメッセージとともに元のページに帰る$this->validate($request, [ 'title' => 'required|min:5', 'body' => 'required' ]);
- 今時な(?)バリデーションエラーメッセージの表示箇所
-
上にまとめてとかではなく、該当箇所の横か下が良い。
ただ、入力項目が多いと微妙ですね。
エラーの時にクラスつけて表示をイイ感じにすることなどの方が大事な気がした。 - 今時な(?)バリデーションエラーメッセージの表示箇所
-
上にまとめてとかではなく、該当箇所の横か下が良い。
ただ、入力項目が多いと微妙ですね。
エラーの時にクラスつけて表示をイイ感じにすることなどの方が大事な気がした。 - The title must be at least 3 characters.
- "min:n"のバリデートに失敗した時のデフォルトメッセージ
- The body field is required.
- "required"のバリデートに失敗した時のデフォルトメッセージ
- oldヘルパー関数
-
直前のリクエストの際の属性の値を取得する
入力フォームで便利
- old('column' [, xxx ] )
-
old(フラッシュデータ)がない時は、
第二引数を返す - $errors->has('colum')
- バリデートエラーの際に、columにエラーがあったかを判別
- $errors->first('column')
- エラーオブジェクトが持つ、要素のうち、最初のcolumnの値を返す
- $errors->all()
-
バリデートエラーを全件取得。
foreachでぐるぐるするという使い方ができる - {{ method_field('patch') }}
- ルーティングでpathcメソッドを使えるようにする
- プレースホルダー
-
input:textはplaceholder属性
textareaは要素で挟んだ文字列
よく忘れる!特にtextarea!! - php artisan make:request name
-
Requestクラスを作成するartisanコマンド
app/Http/Requests/配下に作成されます。 - Requestクラスの認証
-
public function authorize() { return false; }
認証をしない(全部通す)場合は、 return true; - useの指定
-
use App\Http\Requests\PostRequest;
とクラス名まで指定(この例では、PostRequestはクラス) - a要素のhref="#" とhref=""は異なる
-
少しはまっていたので、メモ
「Re:href="#" onclick の悪習」という記事を参考にさせてもらいました。a要素のhref属性に値が入ってるとonclick属性の内容を実行後にhref属性の値を参照しようとする。
逆にいうと、href=""だとdatasetに値を渡せないみたいでした。php:: <form id="form_{{$comment->id}}" > <a href="#" data-id="{{ $comment->id }}" onclick="delete(this);" >hoge</a> </form> JS:: function delete(e) { document.getElementById('form_' + e.dataset.id).submit();
}
仕様はちゃんと確認できていないですが、
href=""では動かず、href="#"でgetElementできていました。 - php artisan make:model Comment --migration
-
Modelクラスとmigrationを作成する
migrationは、database/migrations/配下
Modelクラスは、app/配下にできます。 - belongsTo()
- hasMany()
- php artisan migrate
-
マイグレートの実行
間違えても親切なエラーが出る[Symfony\Component\Console\Exception\CommandNotFoundException] Command "migration" is not defined. Did you mean one of these? migrate migrate:refresh migrate:status migrate:reset migrate:rollback migrate:install make:migration
- show variables ;
-
SQLの環境変数の表示
ただ、数が多いので、
show variables like 'port';
show variables where Variable_name = 'port';
のように絞るとイイ。 -
[Illuminate\Database\QueryException]
Connection refused -
vagrantでPHP/MySQL動かしていたのに、Host OSでphp artisan migrateしていた。
Guest OS上で実行して、問題なくDBにアクセスできた。 - php artisan migrate:status
- migrateの個々の実行状況を出力
- php artisan make:migration <マイグレーション名> --table=<変更対象テーブル>
-
既存テーブル変更のマイグレーション作成
database/migrations/配下にできます。
0 件のコメント:
コメントを投稿