月別アーカイブ: 2016年6月

LaravelのMiddlewareについて

アプリケーションを試しに作っているのだが、過去の「結局Laravelに戻って、ぼちぼち始める」で認証の仕組みが簡単に組み込めるよ、てなことを書いて、確かに認証ができていた。しかし、この認証は、未ログイン時に自分を登録するとアカウントが自動的に作成される、ということを想定したものだった。

そこで、ログインした際にのみ登録画面を表示させようと、app/Http/route.phpに以下のように書いてみたのだった。

すると、確かにログインする前に「/register」で登録画面を出そうとすると、ログイン画面にリダイレクトされる。よしよし。と思っていたが、書き足した「’middleware’ => ‘auth’」というのの意味がわからず、「これを書けば認証が必要になるんだな」の程度しか思ってなかった。

さてさて、ユーザー登録に認証が必要になったので良かった。と思って、今度は認証後に登録させようと、ログイン後のプルダウンメニューに登録を追加するため、resources/views/layouts/app.blade.phpに以下のように書き換えた。

そしていざ、ログイン後に登録画面を表示しようとすると、あれ、トップ画面にリダイレクトされちゃう。あれれ、と思って探していたら、これがミドルウェアという仕組みでそうなっているのであった。ミドルウェアとはコントローラーにアクセスする前や後に必ず実施するフィルタみたいなものらしい。

app/Http/Middlewareを見たところ、「RedirectIfAuthenticated.php」というそのもののリストがあり、リダイレクトしているのはここであることがわかった。じゃあどこでこれを呼び出すように定義されているのか、というと、app/Kernel.phpのrouteMiddlewareというマップで定義しているらしい。同じファイルにmiddlewareというのもがあるが、これは必ず実施するミドルウェアで、middlewareGroupsはミドルウェアをグループ分けできるものらしい。routeMiddlewareで定義されたキーと値のペアは、値はミドルウェアの実装クラスで、キーをどう使うか、というところで、route.phpのさっきの

の「’middleware’ => ‘auth’」の’auth’だったのだ。なーるほど。

で、登録時に「RedirectIfAuthenticated」ミドルウェアを通るときにリダイレクトされてしまっていたので、これは’guest’というキーにしたがって動いていることがわかった。んで、今度はコントローラー「app\Http\Controllers\Auth\AuthController.php」を見てみたところ、コンストラクタにそれらしきものがあった。

‘except’って「除く」ってことらしいから、logoutはログイン中の’guest’ミドルウェアからは除きますよ、って定義をしてあるようだ。だからログイン中にログアウトできるということだから、ここを

ってやってみたら(ここはメソッド名を書くようです)、想定通りログイン画面でユーザー登録フォームが出てきた!やった!

で、このミドルウェアって、artisanコマンドで

で、「Middleware」でどのミドルウェアを経由するかを見られるようで、routeMiddlewareに定義されたマップのキーがここに書かれている。「auth」が未認証時に認証画面に飛ばされるミドルウェア、「guest」が認証時にルート画面に飛ばされるミドルウェアであるようで、

のようになっていればOKだと思う。

Laravelのフォームのチェックボックス

前回、モデルについてモデルの属性はどこにかくのだ、とか書いていたが、いろいろやっている間に、フォームでチェックボックスを実現するときどうするのだろう、ということになったのでその覚え。

フォームをLaravelCollectiveというモジュールを使って実現する、っていうのをララ帳などで確認して作業していたが、私の案件では、チェックボックスをたくさんつけて、複数選択をさせる、という必要があった。ララ帳では触れていなかった(ような)ので、最初は、以下のように書いていた。

DBのほうは、booleanで指定するのもいいけど、項目数の変動が想定されるので、そのたびにマイグレーションしたくないな、と思って、選択肢を各ビットと見立て、DBには1つのカラムにOR演算した結果(合計値)を数値として入れておく、ビットでフラグを表現してカラムを1つにすることを想定した。

当初、コントローラークラスで、都度各ラベルの合算をして、とやっていたのだが、どうも腑に落ちない。なんかミューテータとか使えそうじゃないの?と思っていたけど選択肢の名前とDBに書き込む名前が違うので、そのままでは使えなさそう。

まいっか、と他の部分をいろいろ実装していたが、解決のきっかけとなったのは以外にもバリデーションだった。バリデーションをやろうとしたとき、「どれか1つ以上を選択してください」というやつをこの書き方では簡単には実現できないことに気づき、いろいろ調べることとなる。

チェックボックスや、ラジオボタンなどのグループ化をどうやってるんだろう、とかいろいろ探していたら、以下のように書いて配列で実現できるとの情報を見つけた。

こうすると、choiceという配列1つでチェックボックスの選択肢が表現できる。そして1つ以上のチェックをつけてねというバリデーションチェックは、以下のように簡単に実現できるようになった(FormRequestという機能で、Requestクラスの拡張クラスを使っています)。

また、こうすると、複数のチェックボックスが1つの変数で表現できるので、ああミューテーターが使える!

こんな感じで実現できた!途中いろいろはしょっている、とにかくララ帳がすばらしいのでララ帳でわかんなかったところのみをメモとして残している。

LaravelのMVCのモデル

前回、データベースの1対多について悩んだことをメモ書きしておいたが、ただ、そもそもMVCのモデルをどう定義すりゃいいのよ、ということを全く考えていなかった。

Javaのクラス的な考え方で、make:modelで作った時に作られる、appディレクトリ直下に作られるモデル名のPHPファイルで、クラス変数として定義しなきゃなんないんだろうな、と思い込んでいて、それらしい記事を探すけどどこにもない。モデルの要素をどこに定義すればいいのよ、と探していたが、実際は少なくともクラス変数として定義する必要はなかった。

モデルを作った時に、make:modelで作った時に「-m」オプションをつけると、database/migrationsディレクトリにマイグレーション用のファイルができる。どうやらここに定義したテーブル名が、そのままモデルの要素と考えていいような印象を受けた。

ではappディレクトリ直下に置かれるモデル名のPHPファイルは何をするのか、というので、前回はDBのテーブル名の定義などをやってたが、何かDBとPHPの変数の間をコンバートする必要があるときに、それを定義できる「ミューテータ」という機能があることがわかった。たとえupdate_atなどの日付のデータはテキストになってしまいますが、これをPHPのCarbonというDateTimeを扱うクラスのインスタンスに変更してくれる、など。

あとは、マスアサインメントといって、登録できるカラム名を定義しておき、それを配列で渡すことでレコードを操作できるような仕組みがあって、それの定義をここでやるみたいです。

ここらへんの知識の大半は、「ララ帳」というすごくわかりやすいホームページが参考になっている。対象バージョンが5.1ではあるのだが、最初から進め方がきちんと押さえられているので、とても理解がし易い。昨年7月から更新が止まっているので残念なんですが、とても助かっている。

でも、私がJavaから先に入っているので、どうしてもモデル名のphpファイルに定義されたモデル名のクラスに、クラス変数を定義しなきゃいけないんじゃないの?と思ってしまうのって、誰もわかってくれないか・・・

QuietComfort20を修理に出した

BOSE QuietComfort20を買った」で買ったQuietComfort20、今日修理に出してきました。

どうなったのか、というまえに、実際2年以上はちゃんと使っていましたよ。きちんと計算すると、買ったのが2013年8月26日発売日当日なので、修理に出したのが今日なので、1013日、おおよそ2年と10ヶ月ですね。1日あたりの料金は約37円です。ま、どうでもいいです。

最初に異常に気づいたのは、私は使っていない機能だったのですが、このQuietComfort20には、通常のノイズキャンセリングモードと違い、「Awareモード」という別のモードがあります。通常のノイズキャンセリングだと外の音が聞こえ「なさ」すぎるんで、ノイズキャンセリングを聞かせつつ人の話す声を聞きやすくするモードなのですが、これらのモードを切り替える「ボタン」がついています。このボタンが効きづらくなって、おそらく内部断線だろうな。ということ。

この時点で修理に出すという選択肢もあったが、気づいた時点で1年以上が経過していたため、どのみち修理代がかかってしまう。ノイズキャンセリング機能はそのままだったので、使い続けることにした。

使い続けた結果どうなったか、というと、私の場合は断線ではなく、被服がはげてしまって、いつブチッと切れてもおかしくない状態になってしまいました(ノイズキャンセリング機能はきちんと使えています)。私の使い方では、大きなユニットの両端のいずれかが断線するのではと思っていたんですが、左側の耳栓側の付け根部分という意外な場所でした。

私が住む福岡には、実はBOSEの直営店がありません。数年前までは天神のIMSビルにあったのですが、いつのまにか撤退していました。調べたら一番近いのは佐賀の、鳥栖プレミアムアウトレットだそうなので、車でそのためだけに行ってきました。

店員に現象を説明して、故障機を渡したら、「新品が送られてきますので、修理代15120円を代引きでお支払いください」と言われ、さらにイヤーチップとクリップを外してもらって「新品についていますけど、予備品として使ってください」とわざわざ返却してくれました。すばらしい。クリップは、ケーブルの途中につけることができるクリップで、これでシャツなどにケーブルの一部を留めることができるのですが、このクリップが意外に重宝してるんですよねー。

これから2週間は、ノイズキャンセリングなしのインナーイヤホンを使うことになるんですが、修理から帰ってきたときにまた「やっぱ違うな」と思えることを楽しみにして待ちます。ただ1つ後悔しているのは、今週出張で飛行機乗るんだったなー、ということだけです。飛行機ノイズにすごく効くんで、飛行機で寝られない私はすごく助けられていたんですよねー。出張から帰ってきてから出せば良かったかな・・・。