2017年1月1日日曜日

PHP / laravel入門3

引き続きドットインストールのお世話になります。
今回も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>を表示させて見たら、
ちゃんと「&lt:script&gt」と表示された

{{-- --}}
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'は
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)) !!}
安全に文字列を埋め込むには、これだと覚えるしかないですかね。。。
  1. e()でエスケープ
  2. 改行を<br>タグに置き換える
  3. エスケープなしで出力(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();
}
一応onclickでJS自体は呼び出せてたので紛らわしかったです。
仕様はちゃんと確認できていないですが、
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 件のコメント:

コメントを投稿