じろう

2019年11月02日に参加

学習履歴詳細

[Laravel]メンターさんとMTGしながらDockerのエラー解決。カスタムエラーページが表示されないバグ修正。ArticleRepositoryのメソッドのユニットテストを書く。

今日のYWT

やったこと

Travelog

Dockerのエラーの解決

  • docker-compose updocker-compose buildのときは、使うコンテナを指定する
phpの設定
  • 本番環境でのPostTooLargeExceptionエラーをローカルで再現するため、post_max_sizemax_file_uploadsの値を書き換えて本番と同じ数値にした

独自エラーページを表示する

  • 作った独自エラーページが本番環境で表示できなかったのを直す
    • nginxのnginx.confを書き換えて解決

UnitTestを書く

  • ArticleRepositorygetAllArticleをテストするUnittestを書いた
  • そのタイミングで、getAllArticlecreated_atの降順にArticle全件取得するコードについて見直した
  • また、getAllArticleで全件取得しようとするも、1件も無い時のテストも書いた

わかったこと

Laradockでのphpの設定をどこから見るか

今までは、docker-compose exec workspace bashでコンテナに入ったつもりになっていたが、ローカル環境で使われている設定を見るにはdocker-compose exec php-fpm bashで入る必要がある
また、laradockのphp-fpmディレクトリ内にあるlaravel.iniを書き換えたら、docker-compose downしてdocker-compose build php-fpmしないと、書き直したところが反映されない。
そのあとに、起動したいコンテナを指定する形でdocker-compose up -d workspace php-fpm postgres nginxでコンテナ再起動をかける

phpの設定を見る

phpinfo();を適当なコントローラ(ログインが必要じゃないindexとか)に書くだけ

本番環境で独自エラーページが表示できなかった理由

nginxが、laravelに処理行く前にnginx側の処理で404ページを表示させていた→laravelの処理が走らないのでカスタマイズエラーページも表示されない
これは、該当するコードをすべてコメントアウトすることで解決

#        error_page 404 /404.html;
#
#        error_page 500 502 503 504 /50x.html;

UnitTest

今まで書いていたのはfeatureTestだったが、ユニットテスト(クラスやメソッド単位のテスト)を書く
対象はRepositoryに切り出したメソッド等

assertEqualは型まで見る。 assertSameは型は見ない

Collectionにも種類がある

Illuminate\Database\Eloquent\CollectionがEloquentのCollection
Illuminate\Support\Collectionは上の継承元のCollection

テストで検証するとき、この二つの型は違うものとみなされるので、toArray()などとして変換をして型を揃えてあげる必要がある

getAllArticleのリファクタリング

        // $articles = Article::all()
        //     ->sortByDesc('created_at')
        //     ->load(['user', 'likes', 'tags', 'photos']);

        $articles = Article::query()
            ->with(['user', 'likes', 'tags', 'photos'])
            ->orderBy('created_at', 'desc')
            ->get();

上のコメントアウトしたコードではCollectionに対する操作で、sortByDescやloadなども結局foreachで回しているので処理が遅い。
下のコードはDBでの処理。クエリを発行しているので処理が早い。

次やること

  • CircleCIにかけてどうなるか見る……
Docker
Laravel

2020年12月01日(火)

4.6時間