最近 Laravelで学んでること
最近 Laravelでお仕事させてもらっていて、その中で学んだこと、疑問に思ったこと、調べてみたこと、コードレビューで指摘受けて気づけたことなどを書きます。Laravelでどういうことをやってるときの話なのかって部分をもう少しいうと、ざっくりですが「ユーザーを招待して登録する」みたいな機能を作ってる時の話。(書いてることは、あまり関係なさそう。とりあえず、最近やってることです。)
(1)Laravelでパスワードを二回入れて確認する confirmed validation
同じ値を確認用で2回入力する際のバリーデーションについて。パスワードじゃなくても、xxxx_confirmationフィールドでチェックしてくれる。Postする際の処理をのバリデーションをフォームリクエストに定義する。(フォームリクエストで、バリデーションを作るの、なぜかよく忘れてしまう)
公式ドキュメント バリデーション 5.5 Laravel
confirmed フィールドがそのフィールド名+_confirmationフィールドと同じ値であることをバリデートします。例えば、バリデーションするフィールドがpasswordであれば、同じ値のpassword_confirmationフィールドが入力に存在していなければなりません。
class StoreRequest extends Request { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'password' => 'required|confirmed|max:60', ]; } /** * 定義済みバリデーションルールのエラーメッセージ取得 * * @return array */ public function messages() { return [ 'password.required' => 'パスワードの入力は必須です', 'password.confirmed' => 'パスワードが異なります', ]; } }
(2)viewのデザインのために<br>
使ったら負け。bootstrapだと mt-2 mb-2 とかのmargin増やすutilityあるのでそれ使うと良い。
(3)既にログイン済みだったら〇〇するって処理を、guest middleware(Laravel標準で準備されてるmiddleware)を参考にかく
ログイン済みかログイン済みじゃないかの場合で、処理を分けたいとき、例えば、ユーザー登録で、既にログイン済みだったら、〇〇へリダイレクトして欲しい、という処理が書きたい。Laravel標準で、認証済みかどうか判定し、認証済みの場合は/homeにリダイレクトする、guestというミドルウェアが用意されるので、これを参考にした。独自のミドルウェアを作るときは、
こういう流れだと思っているんだけど、Http/Kernel.phpに登録する、ルーティングに登録する、あたりをちゃんと整理できていないので、ミドルウェアについては、改めて整理したい。登録したミドルウェアをどの処理に適用させるのかっていうあたりを特に整理したい。
(4)コントローラー側のコードで、POSTの処理後に、viewを返すのか、redirectするのか、ちょっと悩んでる。
例えば、「ユーザー登録して、登録完了しました」というページを表示したい場合、POSTのリクエストを処理するアクションがviewを返してくれるように書くのか、完了しました表示してくれるページを返すアクションを別途作って、そこにリダイレクトしてくれる方が良いのかっていうところで悩んだ。今回は、POSTの処理で完了しましたのviewを返すようにしたけど、こういう部分で迷った場合の判断基準がわかっていないので、調べてみる。また、ちょっと話がずれるかもしれないけど、今回この処理を最初redirectするように書いていて、その場合に、例えば、POSTの処理で持っている情報(変数)をredirect先に引き継ぐには、どうしたら良いかってところですごく悩んだりした。sessionに投入して、取り出すみたいな感じでその場合はやったけど、sessionをむやみやたらに使うのはバグの温床なので慎重にしないといけないということだった。postの処理で使ったデータをそのままviewで使いたい場合に、postアクションでviewを返すようにするって感じなのかな。
(5)Sessionにデータを突っ込むのは慎重にする
sessionにデータを突っ込むのは慎重にしないとバグの温床になるので、注意する。バグの温床になる、理由をちゃんと理解できていない気がするので、この部分をもう少し勉強する。sessionに定義される変数を追うのが難しいというか、他の人がコード書くときに、sessionに変数が定義されてることを想定してコード書かないだろうから、影響する可能性があってあまりよくない、ってことかな?それで、sessionを使う場合については、flashを使って、次回1回切りでsessionにデータを突っ込むようにするのが良い(消えるのが保証されている)
例 e$request->session()->flash('user', $user);
公式ドキュメント HTTPセッション 5.5 Laravel
フラッシュデータ
次のリクエスト間だけセッションにアイテムを保存したいことは良くあります。flashメソッドを使ってください。flashメソッドは直後のHTTPリクエストの間だけセッションにデータを保存します。それ以降は削除されます。フラッシュデータは主にステータスメッセージなど継続しない情報に便利です。
(6)ランダムな値の生成方法
ググって見つけたやつ。メモ
substr(base64_encode(md5( mt_rand() )), 0, 30);
(7)Scope
where('xxx', 'yy') みたいに書いてるのを、モデル側でメソッド書くようにして、それを呼び出すようにして、コード読みやすい感じにする
(8)バリデーション(FormRequest)
バリデーションを書く場所いつもどこだっけってなるけど、基本的にPOSTのリクエストするときは、フォームリクエストを作ってバリデーションするようにする。
(9)self::creating データ登録時に自動的にデータを登録するようにする
Railsでいうbefore_createみたいなのを作る。(コントローラー側の責務を減らす)
まとめ
基本的なことばかりっぽいけど、すぐ忘れちゃうので、自分の理解の整理のために書いた。もっとちゃんと理解したいやつがまだまだあるので、次は以下の内容を整理したやつ書く。
CODEBASE βhackathon に参加した話
11/22-11/24の3日間 CODEBASEの βhackathon というイベントに参加してきました。
第2回β版ハッカソンを開催しています!
— CODE BASE@プログラミング教室5期生募集中 (@CODEBASE098) 2018年11月22日
プログラミング教室卒業生で2泊3日でベータ版のWebサービスを作っていきます!
今回は@puremoru0315 君のビジネスモデルを開発していきます!
サービスの紹介、開発の流れを説明した後、開発スタートです😁😁😁
明日は恩納村のペンションを借りて合宿します!! pic.twitter.com/4UfcbndyYf
βhackathon とは
βhackathon とは、プロダクトの設計やワイヤーフレームなどの準備ができていて実際に動く試作品を作りたいと思ってる人と、CODEBASEのプログラミング講座卒業生(学習時間500-800h)が、一緒になって動くものを作っていくイベントです。アイディアを持っている人は動くものが手に入り、プログラミング初学者はより実践的に開発を学べるという趣旨のイベントです。
全体流れ
3日間でざっくり20時間ぐらいの作業
22日19時~22時 オリエンテーション&開発@CODE BASE
今回作るアプリの説明、チーム分け、タスクを洗い出した後、各チームに分かれて開発に取り組みました。チームは3チームに分かれて、ざっくりとした役割分担だと、フロントのデザインを作るチーム、作りたい機能を実現するのに少し調査が必要なタスクをこなすチーム、Scaffold&リレーションを作って基本的な機能を作っていくチーム、というような感じ。
23日10時~20時 開発@ペンション
ペンションに到着後、ひたすら開発。優先度が高いissueから消化していく感じ。夜はBBQ
24日10時〜20時 発表&BBQ@ペンション
起床後、ひたすら開発。優先度が高いissueから消化していく感じ。夜は成果発表&寿司&ピザ
やってみての感想/振り返り
今回のハッカソンで、久しぶりにRailsを触って、忘れているところがめちゃめちゃ多かったので、改めてRails勉強し直したいなという気持ちになった。(もともとが、Railsチュートリアルを2周とオリジナルアプリ制作に取り組んでいたぐらいだったので、しばらく触ってないと、ほんとすごく忘れちゃうなーってのを実感した。。。最近出たRailsの本をとりあえずサクッと読んで思い出したい)プラスに考えると、自分がどれぐらい忘れてるか把握できてよかった。
gitの使い方がすごく勉強になった。3チームで作業していて、conflictがめちゃめちゃ起きたので、conflictを解消する方法を学べてよかった。(単純にgit rebaseするだけならいいけど、conflict起きた際に、複数のcommitを一つにして、更にrebaseして....、みたいなことが何回か起きて、そのあたりのgitの使い方がちゃんと理解できてないので、キャッチアップする。以下、よく使ったコマンドメモ)
# これで、直近のコミット4つを一つのコミットにする(このコマンド叩いた後、コミットでpickになってるのをfに変更する) git rebase -i HEAD~4 # ログをみる git log --one-line --graph --all # 強制的にpush git push --force-with-lease origin feature/xxxxx
- 最終的に今回作ったアプリは、ユーザー登録(devices)、このアプリで使う各データの基本的なCRUDの処理、チャット機能(Action Cable)、フロントのデザインもある程度いい感じに仕上げれた、というような感じで各チームがいい感じにまとまって、とりあえずベータ版を作るのを仕上げられたのでよかったのではないかと思います。とはいえ、細かいところ、荒いところがまだまだたくさんあると思いますし、issueも全体でみると14/46の消化だったので、今回取り組めなかったところや、時間がかかったところなどは、新ためて整理して、次回にいかしていきたいと思います。
まとめ
今回のハッカソンは、ローケーションがほんとに凄く良くて最高でした。みんなでワイワイしながら開発して、サービス作って、BBQしてと、凄くよかったです。運営や事前準備をしてくださった皆さんほんとにありがとうございました!!!凄く良いイベントだったので、次回もぜひ参加したいです。
β版ハッカソン2日目!
— CODE BASE@プログラミング教室5期生募集中 (@CODEBASE098) 2018年11月23日
今日は恩納村のコンドミニアムをお借りして開発合宿を行っています!
ビーチまで徒歩1分とリゾートな環境です🏝
楽しみながら開発しましょー😁#β版ハッカソン#開発合宿 pic.twitter.com/fxKLbEyRJE
海です!!!!! pic.twitter.com/59iC7Q3DAk
— りゅう (@Ryu1__1uyR) 2018年11月23日
無事終わったってことで、、、
— CODE BASE@プログラミング教室5期生募集中 (@CODEBASE098) 2018年11月24日
おつかれ会ということでお寿司とピザをご用意👏👏👏
みんなお腹減ってたのか、もくもく食べていきます!笑 pic.twitter.com/d9B6Y0dpOn
最後にCODEBASEのプログラミング講座の5期生を募集してるとのことです。プログラミングに限った話じゃないけど、みんなでワイワイしながら一緒に学ぶ体験ってめちゃめちゃ良いなあと思うので、webが好きで気になっている人がいたらぜひ見てみてください!!!
【プログラミング教室5期生募集開始!!】
— CODE BASE@プログラミング教室5期生募集中 (@CODEBASE098) 2018年11月8日
ご好評いただいていることもありプログラミング教室5期生を来年1月から開始するにあったって、本日より募集を開始することになりました!
ご応募お待ちしております!!https://t.co/9b6ZYIHXNN
Laravel admin 作業メモ
やったこと
この記事を参考にLarave-adminでCRUDの処理をできるようにする。
エラー発生
Productsのリソースを扱うサンプルのところで、次のエラーが出た。
Config error. Disk [admin] not configured, please add a disk config in `config/filesystems.php`.
エラーへの対策
エラーメッセージを見るに設定ファイルがおかしそう。Laravel Adminの公式ページにある Upload to local するときの config/filesystems.php: の設定をそのままコピーするとなおった。
公式ページ
修正箇所(config/filesystems.php)
動作確認
laravel を立ち上げ直して、改めてアクセスする
ちゃんと登録できた。
めっちゃ便利だ
読書メモ Laravel ミドルウェアとは?からの認証処理を追ってみる
Twitterで認証させようとしたらうまくいかなくて、いろいろ調べながら、ミドルウェアってなんだっけ?って気持ちになったので、整理メモ
Laravel の認証、コマンド叩けばすぐできて便利と思ってたけど、OAuthクライアント(Twitter)で認証しようとしたらよくわからんエラーでてきたので、やっぱ認証の仕組みちゃんとわかってないのよくない。Laravel本読んでキャッチアップする! pic.twitter.com/1KyeDPf63w
— 島袋恵 (@20092014) 2018年10月14日
ミドルウェアとは
Laravel で提供してるミドルウェア
例
作成中のアプリのコード例。コントローラのアクションが実行される前に、authミドルウェアが、認証済みユーザーかどうかを判定してる
authミドルウェアクラス
Illuminate\Auth\Middleware\Authenticate
- Illuminate\Auth\Middleware\Authenticate クラス
- Illuminate\Contracts\Auth\Factory
- 認証処理の仕組みでいうとこの辺り、
- Illuminate\Contracts\Auth\Factory を実装してるのが、
Illuminate\Contracts\Auth\Factory\AuthManager
読書メモ Laravel 認証処理
twitter認証したくてやってみた。
この記事を参考にした。ちゃんとTwiterのユーザー情報をとってこれてるのにテンション上がる!笑
email の情報がnull で登録は失敗。Twitter側で利用規約的なやつを登録しないとメールの情報は取れないっぽい
Illuminate \ Database \ QueryException (23000) SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'email' cannot be null (SQL: insert into `users` (`email`, `name`, `updated_at`, `created_at`) values (, 島袋恵😘, 2018-10-14 01:07:39, 2018-10-14 01:07:39))
うまくいったと思ってたけど、実はうまくできてなかった件
ログイン時に以下のエラーが出る。(初回ログイン時のみ出るっぽい?)
Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, null given, called in /app/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 292
補足としてマルチ認証を使う場合は、デフォルト設定のガード以外を利用する局面では、ガード名の指定が必要です。また、一つのLaravelアプリではセッションを共有する都合上、別々の認証設定アカウントを使う操作者がいる場合はログオフして使わないと競合してしまいます。
なるほどー。認証の処理がよくわかってないことがわかったので調べる。ガード?
読書メモ Laravel 認可処理
Laravel で用意されてる認可処理は2つあって、
- 1つの認可処理に名前をつけて利用の可否を決定づけるゲート(Gate)
- 複数の認可処理を記述するポリシー(Policy)
ゲートには、例えば、ブログの口コミなど投稿コンテンツに対して、コンテンツを投稿者飲みに編集ボタンを表示したりコンテンツ更新の許可をしたりする、(中略)文字通り「ゲート」としての処理を、クロージャとして定義する
ポリシーは特定のモデルやリソースに関する認可ロジックを系統立てるクラスです。たとえば、ブログアプリケーションの場合、Postモデルとそれに対応する、ポストを作成/更新するなどのユーザーアクションを認可するPostPolicyを持つことになるでしょう。
例. ゲート
- AuthServiceProviderクラス
- コントローラー側
個人的新出メソッド
intval
intval — 変数の整数としての値を取得する
__invoke() メソッド
- シングルアクションコントローラ
- アクションを一つだけ含むコントローラを定義したい場合は、そのコントローラに__invokeメソッドを設置してください。
Githubの草っぽいグラフを表示させたくて vue-heatmap を使ってみた
LaravelでVue.jsを使って、vue-heatmapのライブラリを使って、見た目だけだけど、Githubの草っぽいやつを表示できるようにした。
やったこと
vuejs-heatmap ライブラリインストール
docker-compose run --rm yarn add vuejs-heatmap
yarnの使い方わかんなかったので以下の記事で勉強した
この後、何やればいいか全然わからなかったので、いったん vue-heatmapのリポジトリをローカルに持ってきてサンプルを動かしてみた
ghq get https://github.com/DominikAngerer/vue-heatmap.git
サンプル動かすためには、main.js をちょっと修正する
修正したら npm run devする
npm run dev
そうすると、勝手にブラウザが開いてグラフが表示される
これをLaravelで作ってるアプリにどうやって載せるのか、よくわからんかったけど、トライアンドエラーでいろいろと試してみると、ちゃんと表示されるようになった。以下、やったこと
まずファイル配置と追記した
そしてコマンドを叩いて終わり
docker-compose run --rm yarn run dev
感想
やっと見た目だけだけど vue-heatmap を導入して表示できるようになった。次は、Laravel側データを取ってくる。vuejs-heatmap コンポーネント側の entries にベタ書きされてるからこれをいい感じに取ってくるようにする。勉強するぞー
Vue.jsは本読んでて、超基本的なところはわかったけど、全体的によくわからないことが多いので、時間あるとき引き続き勉強しよ。むずい。むずいけど、ライブラリ使いこなせると、UI自由に扱えてめっちゃたのしそう。