More Related Content
Similar to CakePHP3.x での各種実装例 ~| PHP Tech Bash 20171121 ~ (20)
CakePHP3.x での各種実装例 ~| PHP Tech Bash 20171121 ~
- 1. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
ランサーズ株式会社
エンジニア / 上野諒一
CakePHP3.5における各種実装例
〜 LancersTopの開発現場からTipsを喋り倒す 〜
- 3. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
自己紹介 3
上野諒一
Github: ryoichi-u
Twitter: @waldo0515
略歴
大学時代は北海道で機械/触媒
ランサーズには2014年に新卒入社
2016年 ランサーズストア 立ち上げ
2017年 Lancers Top 立ち上げ
- 4. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
目次 4
はじめに
CakePHPについて
実装例を交えた各種知見の紹介
① 初期開発時はDBを簡単にリセットする手段を作ると楽ちん
② FixtureとSeedは共通化できる
③ Sessionは3箇所の設定値を注意する
④ emailバリデーションはひらがな通るので差し替えとくのが無難
⑤ 設定値は.envに寄せてapp.phpをgit管理にすると楽になった
⑥ CIにPHPMD, PHPCS, phpunit載せるときの設定
今日のTipsたち
ちなみに喋りきれなかったAppendixも6つあります
- 7. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
提供しているサービス(一部抜粋) 7
デジタルマーケティングクラウドソーシング
シェアリングエコノミー
スキルマーケット
エンジニア向け案件紹介
- 9. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
LancersTop について 9
実力を可視化するLancers Topのスキルテストについて
トップタレント
三次審査:スキルテスト(3段階)
二次審査:面談
一次審査:レジュメ
タレント
■応用/プログラムテスト合格者:
最低保証額700,000円〜
■実践/記述式テスト合格者:
最低保証額600,000円〜
■知識/選択式テスト合格者:
最低保証額500,000円〜
- 11. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
プロジェクトメンバー 11
企画戦略段階(上野 + 取締役)
立ち上げ開発(eng x3人 + des x1人 + テスト作成 x1人)
事業開始(eng x2人 + des x1人 + 営業 x3人)
2017 / 2
2017 / 6
開発開始
2017 / 8
closed βリリース
2017 / 10
一般リリース
- 12. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Lancers Top サーバー構成 12
skill test
EC2
App
S3
ELB
Route53
ErastiCache
Memcached
Aurora
Reader
Aurora
Writer
EC2
instance
Batch
EC2
instance
Log
SES
S3
- 15. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CakePHP3系について 15
2015 に3.0がリリース、クラウドソーシングランサーズでは1.3系をサービス初期から利用
半年に一度程のペースでマイナーバージョンアップを重ねて 2017/11/20 現在で最新は 3.5.6
3.x 系はORM周りが大きく変化
Model => Entity, Tableの分離(+ Query, CollectionTraitによる各種インターフェイス変更)
https://cakephp.org
- 17. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CakePHP3 導入の背景 17
LancersのCakePHPバージョンアップ施策について
PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
PJ推進する自分自身が慣れていてスピードを出せる
別途進行中のバージョンアップ対応への橋頭堡を担う
業務レベルで使った経験あるメンバーなし
javascript, css, imageファイルの管理どうしよう
レンダリングページとwebAPI呼び出しのエラー表示
routing / counroller構成どうしよう
etc...
とは言え導入にあたり悩みはつきない
今日はLancers Top 開発でのTips話します
なのでカッコイイ解決というより一つでも活かせる実装があれば嬉しいです
- 18. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
実装例を交えて各種知見を紹介
~ 時間ある限りTips 話します ~
- 19. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
目次 19
はじめに
CakePHPについて
実装例を交えた各種知見の紹介
① 初期開発時はDBを簡単にリセットする手段を作ると楽ちん
② FixtureとSeedは共通化できる
③ Sessionは3箇所の設定値を注意する
④ emailバリデーションはひらがな通るので差し替えとくのが無難
⑤ 設定値は.envに寄せてapp.phpをgit管理にすると楽になった
⑥ CIにPHPMD, PHPCS, phpunit載せるときの設定
今日のTipsたち
- 20. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
① 初期開発時はDBを簡単にリセット
② seedsとtests/fixturesの共通化
migrationでの工夫
- 21. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CakePHPにはmigrationツールが付属されています 21
実行時間を管理してくれてSQLの実行順が… と行ったことから解放され
migrationの状態確認や巻き戻しなどが楽にできます。
CakeにはPhinxをラップしたプラグインを標準装備 ( https://phinx.org/ )
- 22. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その① ~ 環境リセット ~ 22
• 常に同一のDB環境で開発したい
• dockerのmysqlコンテナは他のプロジェクトとも共用
背景
新しいブランチ取り込んだら
DBでエラーになります
デザイナー
なんかエラーになりました
データ変になっている...
エンジニア
表示が変になります
毎回毎回対応するの大変だな
エンジニア
- 23. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その① ~ 環境リセット ~ 23
とりあえずこのコマンド打っ
てください
新しいブランチ取り込んだら
DBでエラーになります
デザイナー エンジニア
泥臭いですが、数行で幸せに
実際のコード例
- 24. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その① ~ 環境リセット ~ 24
他のアプローチ
まともにmigrationに乗っかると
• 201706200001_CreateUsers.php
• 201706230001_ChangeUsers.php
• 201706270001_ChangeUsers.php
• …
リリース後はこれでいい。
初期開発には向かない
rollbackの仕組み使うと
• 同じファイル内容でrollbackしないとエラーになる
• developmentでrollback => 開発ブランチでmigration
めんどくさい
dockerコンテナの再作成
• 別プロジェクトのデータリセットしたくない DBコンテナ独立してたら楽
- 25. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
① 初期開発時はDBを簡単にリセット
② seedsとtests/fixturesの共通化
migrationでの工夫
- 26. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その② ~ tests/fixturesとの共通化 ~ 26
• phpunitでテストを作っているとfixtureとしてほしいデータが同一
• メンテナンスがめんどくさい
背景
調べてみると…
• fixture と seed で使っているテーブルの配列が一緒
• fixtureのスキーマはmigration => bakeにより一致を保証
エンジニア
新しいテーブル作る
- 27. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その② ~ tests/fixturesとの共通化 ~ 27
背景
エンジニア
新しいテーブル作るから開
発環境用にseed作る
新しいテーブルに関係する
テスト作ろう
スキーマ変更したから
seed作り変えよう
エンジニア
fixtureも変えなきゃだよ。もはや同じ
ような記述何回もしてる。
なんとかならんかね
CIが落ちています !!!!!
- 28. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その② ~ tests/fixturesとの共通化 ~ 28
実際のコード例 Seed側
insertが要求する配列が同じことを利用
調べてみると…
• fixture と seed で使っているテーブルの配列が一緒
• fixtureのスキーマはmigration => bakeにより一致を保証
- 29. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
migrationの工夫 その② ~ tests/fixturesとの共通化 ~ 29
実際のコード例 Fixture側
- 30. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
③ Session(memcached)のexpire設定
④ app.php はgit管理に入れて .envを活用
設定値に関わるTips
- 31. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Session(memcached)のexpire設定 31
Lancers Top ではsessionストレージとしてmemcachedを採用
しかし、意図しないタイミングでログインが切れてしまう
なんかセッション切れる…
cookie, memcache両方ともexpire
は想定通り入っている
それが数十分で突然消えます
ね
- 32. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Session(memcached)のexpire設定 32
app.phpのSession設定でストレージとcookieのexpireを設定
app.phpのCache設定でmemcachedのexpireを設定
php.iniのsession.gc_maxlifetime (アプリケーション全体影響あり)
- 33. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
③ Session(memcached)のexpire設定
④ app.php はgit管理に入れて .envを活用
設定値に関わるTips
- 34. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
config/app.php はgit管理に入れて .envを活用 34
こことあそこと…
ん〜うまく動かない
設定ファイル変えました
差分はxxxxです
ごめん、yyyyの配列構造を少
し変更しています
config/app.php のみで管理していた時代
ようやく動いた
私の環境動かないです
それ、app.php.20171002の変
更取り込んでる?
取り込んでませんでした
- 35. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
app.php はgit管理に入れて .envを活用 35
Cakephp3.5から.envはスケルトンにも導入された
CircleCI でも環境変数設定ができるので管理がしやすい
git管理外の情報は必要最低限にしたい(差分がわかりにくい!)
背景
Cakeデフォルトのapp.phpの役割
構成設定の配列構造 + 設定値
分離後の役割
config/app.php : 構成設定の配列構造 => git管理可能な情報
config/.env : 設定値
- 36. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
app.php はgit管理に入れて .envを活用 36
実際のコード例 config/bootstrap.php
実際のコード例 config/.env
- 37. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
app.php はgit管理に入れて .envを活用 37
実際のコード例 config/app.php
環境によって異なるもの
gitで管理されてはまずいもの
- 38. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
⑤ ひらがなメールアドレスは true
バリデーションここは注意!
- 39. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
ひらがなメールアドレスは true 39
さらっとメールアドレスのエラーテストしようとしました
なんとこれが通らない。。。エラーにならない?
どういうこと?
- 40. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
ひらがなメールアドレスは true 40
PHP標準のemailフィルターを使用 (Laravelに合わせています)
cakephp/tests/TestCase/Validation/ValidationTest.php
Unicodeなら行けそうな雰囲気のテストになっている
- 41. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
⑥ CI によるコード品質の担保
~ CakePHPバージョン追従に向けて ~
- 42. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CircleCI によるコード品質の担保 42
phpunitによる単体テスト ~ 簡単なコントローラーの振る舞いチェック
PHPMDによるコードの複雑度や規約違反の警告
php_cs_fixerによるインデント等の自動修正
LancersTopではCircleCIを用いています
- 43. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CircleCI によるコード品質の担保 43
php_cs_fixer.sh
phpmd.sh
- 44. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CircleCI によるコード品質の担保 44
この他、TestCafeによるE2Eテストを主要フローにおいて記述
バージョンアップ時の検証は以下2つで今のところ問題なく非常にスムーズ
変更箇所を翻訳して調査
githubにpush して各種ビルドとテストが通過しているか
手元でTestCafe実行してエラーにならないか
3.4.6
3.4.11
3.5.2
3.5.6 <= ブランチで動作確認ずみ
サービスリリース
3.4.9
3.4.8
プロトタイプ作成
- 46. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
まとめ 46
① 初期開発時はDBを簡単にリセットする手段を作ると楽ちん
② FixtureとSeedは共通化できる
③ Sessionは3箇所の設定値を注意する
④ 設定値は.envに寄せてapp.phpをgit管理にすると楽になった
⑤ emailバリデーションはひらがな通るので差し替えとくのが無難
⑥ CIにPHPMD, PHPCS, phpunit載せるときの設定
今日のTipsたち
話しきれなかったものはAppendixつけました。
この他、ここでは話しきれませんでしたが、
docs系の管理
jsの管理
cssの管理
プロジェクト推進など
色々と工夫してきた点あるので懇親会などで話しましょう!
- 48. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
絶賛、募集中
ランサーズではエンジニアを募集中です が
● 弊社HP、Wantedly等
ご応募お待ちしてます
48
- 49. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
CakePHP3.x のクックブックリーディグ来ませんか
毎週木曜日にCakePHP3.xの
クックブックリーディングを行っています
49
https://lancers-engineer.connpass.com/お気軽に遊びに来てください!!
- 52. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Appemdix目次 52
① 静的ファイルのバージョン付与
② エラー表示 viewとapiで共通化
③ Elementのcacheでハマった話
④ PHP7.0の型指定は使っていったほうがいいよ
⑤ utf8mb4でのmigration (未解決)
⑥ その他作った便利クラス/便利メソッドたち
時間なくて省略したスライドたち
- 54. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
静的ファイルのバージョン付与 54
• よくある話ですが、、、
• リリース時ブラウザキャッシュによってcssやjsが正常に動作しない
• => リリース毎にキャッシュをクリアしたい
背景
外部CDNからの読み込みはなくパッケージ管理済み
• js => webpackで管理
• css => gulpで管理
• それぞれHtmlHelper経由でタグ出力
- 55. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
静的ファイルのバージョン付与 55
実際のコード例 オーバーライド箇所
バージョン文字列を後ろに付与
- 56. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
静的ファイルのバージョン付与 56
実際のコード例 出力
- 58. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
エラー表示 viewとapiで共通化 58
• Apiによる非同期処理が多くなりそうだった
• エラーフィールド出力のルール理解が厄介
背景
どのように解決しているか
• 配列のルールを決め、エラー解析用javascriptモジュールを用意しておく
• 形式はCakePHPの Validator::_errors の形式に揃える
• => APIでもレンダリングでも同じ形の配列を返すようにする
• => document.ready() と APIリクエストのコールバックで実行
FormHelperのエラー表示は非常に強力ですが、Lancers Topでは未使用です
- 59. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
エラー表示 viewとapiで共通化 59
errorMessages (常にconfigより出力)
errors (ControllerでSet)
テンプレートレンダリング時の処理
=> それぞれjson_encode()してjsに渡す
API呼び出し時の処理
errorMessages (すでに定数に存在)
errors (Response Bodyで受け取る)
errorListとしてエラー表示用に変換 {field: name, message: 入力してください}
エラー表示各種モジュール
エラー項目表示
エラーがあったら上部にアラート表示など
- 60. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
エラー表示 viewとapiで共通化 60
実際のコード例 webAPIとしてControllerで返すレスポンス
error はエラー配列が入っていることを示す識別子
table_nameはcontrollerで指定
Entity::getErrors()で出力される配列
- 61. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
エラー表示 viewとapiで共通化 61
実際のコード例 config/validation.phpでの設定
ネストされていないのはdefault設定値(table, field関係なくerrorのキーのみ)
controllerでsetしたものと同様の形式(優先)
- 62. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
エラー表示 viewとapiで共通化 62
実際のコード例 jsの処理の一つ
- 63. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Element の cache設定
~ ハマったのが恥ずかしい落とし穴 ~
- 64. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Element の cache設定 64
Element は キャッシュできます。
最初はこのようにcacheしていました
動的な処理が入ってきたのでcacheを無効にしました (したつもりでした)
中身変更しても消えない 。。。
- 65. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Element の cache設定 65
正解はキー指定そのものを消すこと
早くソースコード見ればよかった View::element()
- 66. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
PHP7系の型指定はできるだけ使う
~ 考えられる可能性を減らす ~
- 67. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
PHP7系の型指定はできるだけ使う 67
PHP7.0から型宣言が大幅に増えました。戻り値の指定も可能です
LancersTopの開発でも基本的につけるようにしています
falseと配列を返すのではなく何も
ないときは空配列返そう
効果
実装者が型を統一するようになる
関数の中で型チェックやキャストしないですむ
間違ったら瞬時にエラーになるので気づきやすい
フレームワークの関数の返り値を意識するようになり理解が深まる
find()のときってどんな型で返って
くる可能性があるんだ?
http://sssslide.com/speakerdeck.com/twada/php-conference-2016
このあたりは@t_wadaさんのスライドのほうが説得力があるのでそちらを
- 68. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
utf8mb4でのmigration (未解決)
~ どこかでPhnix側にPR出したい ~
- 69. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
utf8mb4でのmigration (未解決) 69
MySQLで4バイト文字(絵文字など)を取り扱えるようにutf8mb4にしたい
この場合varchar, textなどでindexを作成しようとすると
カラムのキープレフィックス上限の最大値767byteに達しエラーになる
この解決法はfile_formatを変更して圧縮すること
- 70. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
utf8mb4でのmigration (未解決) 70
PhnixではROW_FORMATの指定が未対応
オプションの充実はこれから
MysqlAdapter::createTable()
- 72. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
loadModels ~ 複数のTableをloadする ~ 72
- 74. PHP Tech Bash!!! 2017/11/21 #tech_eight_ #ランサーズ
Controllerテストでは常にCSRFトークンONにする 74
Editor's Notes
- いつでも、どこでも、個人と企業がマッチング。 クラウドソーシングで「働く」を変える。
- 2年ぐらい前に?
2年ぐらいはかかるからリソースは割けない