Laravel

Laravelの例外処理で最低限知っておきたいこと

例外をレンダリング・出力する機能と、ロギングする機能の2つに分かれる デフォルトの例外処理クラスApp\Exceptions\Handlerが継承する親クラスIlluminate\Foundation\Exceptions\Handlerには、render(), report()というメソッドがあり、これらがそれぞれレ…

LaravelのRefreshDatabaseはいつ実行されるか、なにを実行しているか

いつ実行されるか 前提として、PHPUnitでのsetUp()等の実行タイミングから。 setUpBeforeClass()がテストクラスごとに、最初のテストメソッドの実行前に。 setUp()がテストメソッドごとに、テストメソッド実行前に。 tearDown()がテストメソッドごとに、テス…

Laravelのファサードとはなにか

ずっと使っているけど十分に理解できなかったので調べた。 ファサードとはなにか 結論から言うと、ファサードは、対応したサービスのインスタンスのメソッドを、静的にコールできる仕組み、のようだ。 GoFのデザインパターンのFacadeパターンとはちょっと違…

Laravelのフォームリクエストのジレンマ

Laravelにはフォームリクエストという便利な機能がある。コントローラに適切なフォームリクエストをインジェクションさせると、リクエストがフォームリクエスト内のルールでバリデーションされた上でインジェクションされる。 ['string'], 'email' => ['ema…

Laravel Deployerで変な落ち方してロックが残ってしまった場合の対処法

最近とても忙しい。つらい。 とっても便利なDeployerをLaravel向けにさらに手軽にしたLaravel Deployerですが、この間こんなメッセージが出た。 Deploy locked. Execute "dep deploy:unlock " to unlock. 書いてある通り、ロックされちゃったっぽい。 通信環…

LaravelでHTTPS対応する正しいやり方

正しいやり方 HTTPSを強制する場合はWebサーバ側で対処する。HTTPから強制リダイレクトしてもいいし、HTTPは閉じてしまってもいい。 HTTPSを強制する場合、もしくはHTTPSをデフォルトにしたい場合はAPP_URLをhttps://...にする。 リバースプロキシ下で動かす…

Laravelの設定ファイル(config/*.php)のキャッシュ関係の仕様を簡単に

php artisan config:cacheでデフォルトではbootstrap/cache/config.phpにconfig/*.phpから読み込まれた設定のキャッシュが生成される。 config:cacheは最初にconfig:clearするため、再実行した場合はキャッシュが再生成される。 config:clearは単純にbootstr…

Laravelでドキュメントルートに静的ファイルを混在させる方法

作ったシステムに後から静的ページを追加したい、みたいな要望にどう対応すればいいだろうか。「有料です」で済ませたいところだが、なかなかそうも行かない場合も多い。 古のCGI/PHP環境でやってきたクライアントにとっては、既存のファイルと無関係なとこ…

LaravelでAuth系のコントローラが最初から存在するのはなぜか

ご存知の通りLaravelではartisan make:authすることでいくつかのファイルが生成・変更され、デフォルトの認証関係の機能を有効にできる。 だが、じつはこれを実行しなくとも、最初からApp\Http\Controllers\Auth\LoginControllerをはじめとする各種コントロ…

Eloquentのwhen()で、偽になる可能性のある値の存在を条件に検索する

Eloquentというかクエリビルダ側の機能だけどまあ。 when()はこのように使うことができ、条件分岐を何度も何度も書かなくて済む。 when($condition['cond_1'] ?? false, function ($query, $cond_1) { $query->where('cond_1', $cond_1); }); }…

Laravelのartisanのzsh補完書いた

サブコマンドの補完はあったんだけど、ちゃんとオプションの補完までしてくれるのがないので自分で書いてみた。zshわからんしcompsysわからんし、そもそもシェルスクリプトさっぱりなので大変苦労したが、まあ使えるものになってきたので公開。 サブコマンド…

Laravelでinput:checkboxのデフォルトでのチェックを実装する

ご存知の通りHTMLの仕様バグによりinput:checkboxは未チェック時、nameも送ってくれない。通常なら以下のようにして、フォームエラー時の再チェックを実装する。 <input type="checkbox" name="example" value="1" {!! old('example') == 1 ? 'checked="checked" : '' !!}> デフォルトが未チェックであればこれで問題ないが、デフォルトでチェック状態にしたい場合は…

Laravel Mixというかwebpackのコンパイルが、productionで重い件メモ

前提として、CSSはデフォルトにプラスα程度でデフォルトで入ってるBootstrapが重いく らい、JavaScriptが、Bootstrap入ってるファイルが別々に2つあってこっちが割と重い。 初回で13秒程度、変更検知でのコンパイルが6秒ほど。 一応developmentだと4秒未満、…

LaravelのViewのキャッシュの仕様

前の記事でBlade::setEchoFormat()の挙動を確認していたときに、思うように反映されず、キャッシュかなあと思ったらキャッシュが原因だったということがあったので、Viewのキャッシュ周りの仕様を簡単に調べてみた。 結論から書くと、Viewのキャッシュは設定…

LaravelのBladeで{{ csrf_field() }}が通る理由

なにかの間違えで、{{ csrf_field() }}と書いていたんだけどそれが通るということがあって、{{ ... }}の仕様どうなってるのかなと思い確認した。 {{ ... }}は紆余曲折を経て、に変換されていた。e()はPHPerなら予想がつくだろう通りhtmlspecialchars()のラッ…

Laravel Mixというかwebpackでconsole.log()が消えないようにする

追記 Laravel Mixとwebpackのどっちが犯人なのか探ってたら、Laravel Mixが犯人であること、さらにじつはもうdrop_consoleがデフォルトで無効になっていることに気付いた。 Remove drop_console option · JeffreyWay/laravel-mix@a9d2646 · GitHub というこ…

Laravel 5.6.27以降でログアウト後のリダイレクト先を変更したいなら、logout()ではなくloggedOut()をオーバーライドする

5.7で開発中なんだが、ログアウト後のリダイレクト先を変更するのどうしたらいいか調べてたら、ソースコードを読む感じIlluminate\Foundation\Auth\AuthenticatesUsersのloggedOut()をオーバーライドするのがよさそうだったのだが、ググると同じクラスのlogo…

LaravelのAuth::routes()で一部機能(ルート)を無効にする

Auth::routes()の本体である、Illuminate\Routing\Router::auth()を確認してて気付いたのでメモ。 false, 'reset' => false, ]); # ... これで新規登録とパスワードリセットが無効にできる。管理者だけが扱うようなアプリケーションでは使いそう。 まあ、ド…

Composerのディレクトリが~/.config/composer以下になる場合

CentOS 7環境で、新規案件のためにLaravel入れたのだがlaravelコマンドが入ってない。~/.composer/vendor/binにパスは通ってるのになあ、とよく見てみると、~/.composer/vendor/bin自体がなかった。 もうちょっと調べてみると、~/.config/composerというのが…

EloquentでのNULLABLEな日付の扱いでoptional()ヘルパ関数が便利

アクセサの値を普通に表示するだけなら、?:演算子だけでいい。PHPはnullをechoしても特に問題ないので。 created_at ?: 'default'; ただ、フォーマットしたい場合はちょっとやっかい。以下はcreated_atがNULLの場合、nullのメソッドを呼び出してエラーになる…

LaravelやRailsでcollationをデフォルトのまま使ってしまった時は

utf8mb4_unicode_ciは「か」と「が」を同一視したりするので、日本語アプリケーションでは使えない。のだが、日本語対応が十分でないフレームワークなどではよくデフォルトになっている。 最初からちゃんと設定しておけばいいのだが、忘れたまましばらくして…

Eloquentのモデルのイベントをリスニングする

ドキュメントにも一応書いてあるけどなんか半端なので。 https://laravel.com/docs/5.6/eloquent#events https://readouble.com/laravel/5.5/ja/eloquent.html#events モデルの$dispatchesEventsに、['イベント名' => イベントクラス::class, ...]の形の配列…