Theme
SD MILIEU

2018-10-2

Laravelメモ

Eloquentallはメモリ消費量が多いので注意

大量のレコードを処理する場合はchunkを使おう。

Laravel(Eloquent): chunk() vs cursor() - Qiita

作った関数とか処理を手軽に試したい

tinkerを利用する。

php artisan tinker

where で OR 検索したい

同一カラムならwhereInを使う。

$users = DB::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();

データベース:クエリビルダ 5.6 Laravel(※「Where 節を参照」)

Laravel で常に特定のレスポンスヘッダーを設定したい

ミドルウェア 5.6 Laravel

ミドルウェアで指定すればいい。

例えば、CORS に対応するためにAccess-Control-Allow系のヘッダーを指定する場合以下のようになる。

public function handle($request, Closure $next)
{
    return $next($request)
            ->header("Access-Control-Allow-Origin", config("app.allow-origin"))
            ->header("Access-Control-Allow-Credentials", "true")
            ->header("Access-Control-Allow-Methods", "POST, GET")
            ->header("Access-Control-Allow-Headers", "Content-Type");
}

Laravel はクッキーが暗号化されている

デフォルトで、ミドルウェアのEncryptCookiesでクッキーが暗号化されている。

なので、DevTools で表示されているクッキー情報(暗号化されている)と、Laravel 内のクッキー情報(復号後)は異なっているので注意。

最初に timezone 設定をしておく

デフォルトでは UTC のため、DB に保存する TimeStamp 等も UTC として保存されてしまう。

JST として保存したい場合は timezone 設定をしておくこと。

Laravel の timezone をデフォルトの UTC から JST(日本標準時)へ変更する

old ヘルパーのデフォルト値

Laravel で、バリデーション後フォームの入力値にバリデーション前と同じ値を入力させておきたい場合、oldヘルパーを使用するが、old にはデフォルト値を設定できる

old("title", $post->title)

入れ子形式のリクエスト

  "post" => array:2 [▼
    "title" => "heah"
    "content" => "ahe"
  ]

こんな形のリクエストが欲しい場合、

<div><input type="text" name="post[title]" value="{{ $values["title"] }}"></div>
<div><textarea name="post[content]">{{ $values["content"] }}</textarea></div>

こう。

多次元配列のバリデーション

<form method="post" action="{{ $actionUrl }}">
    @csrf
    <div><input type="text" name="post[title]" value="{{ $values["title"] }}"></div>
    <ul>
        <li><input type="text" name="tags[0][name]"></li>
        <li><input type="text" name="tags[1][name]"></li>
    </ul>
    <div><textarea name="post[content]">{{ $values["content"] }}</textarea></div>
    <div><button type="submit">submit</button></div>

    <input name="_method" type="hidden" value="{{ $method }}">
</form>

これのバリデーションは

public function rules()
{
    return [
        "post.title" => "required",
        "post.content" => "required",
        "tags.*.name" => "required",
    ];
}

こう

バリデーションで min/max が働かない

min/max によるバリデーションをしたい場合、以下のように integer 等も指定して数値として認識させる必要がある。

public function rules()
{
    return [
        "num" => "required|integer|min:3",
    ];
}

マイグレーションファイルでカラムの変更をしたい

公式の「カラム属性の変更」を参照

.htaccess を使用せず常時 SSL 化対応

Middleware で対応

Laravel5 で.htaccess を使用せず常時 SSL 化対応する方法

テスト関連

現在時刻を任意の値にしたい

テスト対象の関数内でCarbon::now()とか使っていた時、テスト毎に状態が変化してしまい微妙。

なので、テスト中に現在時刻を任意の値にするために、Carbon::setTestNow()を使用する。

test から始まらない関数をテスト関数として認識させたい

@testと関数の直前に記述すればいい。

/*
 * @test
 */
public function 有効期限が正常に判定されていることの確認()
{
  ~
}

ちなみに、テストの関数名は日本語にしておくとわかりやすい。