過去の投稿LaravelのMiddlewareについてコメントをどうぞアプリケーションを試しに作っているのだが、過去の「結局Laravelに戻って、ぼちぼち始める」で認証の仕組みが簡単に組み込めるよ、てなことを書いて、確かに認証ができていた。この認証は、未ログイン時に自分を登録するとアカウントが自動的に作成される、ということを想定したものだった。そこで、ログインした際にのみ登録画面を表示させようと、app/Http/route.phpに以下のように書いてみたのだった。'Auth\AuthController@register']);すると、確かにログインする前に「/register」で登録画面を出そうとすると、ログイン画面にリダイレクトされる。‘auth’」というのの意味がわからず、「これを書けば認証が必要になるんだな」の程度しか思ってなかった。ユーザー登録に認証が必要になったので良かった。思って、今度は認証後に登録させようと、ログイン後のプルダウンメニューに登録を追加するため、resources/views/layouts/app.blade.phpに以下のように書き換えた。}}">Register</a></li></ul>そしていざ、ログイン後に登録画面を表示しようとすると、あれ、トップ画面にリダイレクトされちゃう。あれれ、と思って探していたら、これがミドルウェアという仕組みでそうなっているのであった。ミドルウェアとはコントローラーにアクセスする前や後に必ず実施するフィルタみたいなものらしい。app/Http/Middlewareを見たところ、「RedirectIfAuthenticated.php」というそのもののリストがあり、リダイレクトしているのはここであることがわかった。どこでこれを呼び出すように定義されているのか、というと、app/Kernel.phpのrouteMiddlewareというマップで定義しているらしい。同じファイルにmiddlewareというのもがあるが、これは必ず実施するミドルウェアで、middlewareGroupsはミドルウェアをグループ分けできるものらしい。‘auth’」の’auth’だったのだ。登録時に「RedirectIfAuthenticated」ミドルウェアを通るときにリダイレクトされてしまっていたので、これは’guest’というキーにしたがって動いていることがわかった。今度はコントローラー「app\Http\Controllers\Auth\AuthController.php」を見てみたところ、コンストラクタにそれらしきものがあった。'logout']);}‘except’って「除く」ってことらしいから、logoutはログイン中の’guest’ミドルウェアからは除きますよ、って定義をしてあるようだ。route:listで、「Middleware」でどのミドルウェアを経由するかを見られるようで、routeMiddlewareに定義されたマップのキーがここに書かれている。|のようになっていればOKだと思う。dewclaLaravelのフォームのチェックボックスコメントをどうぞ前回、モデルについてモデルの属性はどこにかくのだ、とか書いていたが、いろいろやっている間に、フォームでチェックボックスを実現するときどうするのだろう、ということになったのでその覚え。フォームをLaravelCollectiveというモジュールを使って実現する、っていうのをララ帳などで確認して作業していたが、私の案件では、チェックボックスをたくさんつけて、複数選択をさせる、という必要があった。ララ帳では触れていなかった(ような)ので、最初は、以下のように書いていた。!!}DBのほうは、booleanで指定するのもいいけど、項目数の変動が想定されるので、そのたびにマイグレーションしたくないな、と思って、選択肢を各ビットと見立て、DBには1つのカラムにOR演算した結果(合計値)を数値として入れておく、ビットでフラグを表現してカラムを1つにすることを想定した。当初、コントローラークラスで、都度各ラベルの合算をして、とやっていたのだが、どうも腑に落ちない。なんかミューテータとか使えそうじゃないの?と思っていたけど選択肢の名前とDBに書き込む名前が違うので、そのままでは使えなさそう。まいっか、と他の部分をいろいろ実装していたが、解決のきっかけとなったのは以外にもバリデーションだった。バリデーションをやろうとしたとき、「どれか1つ以上を選択してください」というやつをこの書き方では簡単には実現できないことに気づき、いろいろ調べることとなる。チェックボックスや、ラジオボタンなどのグループ化をどうやってるんだろう、とかいろいろ探していたら、以下のように書いて配列で実現できるとの情報を見つけた。!!}こうすると、choiceという配列1つでチェックボックスの選択肢が表現できる。1つ以上のチェックをつけてねというバリデーションチェックは、以下のように簡単に実現できるようになった(FormRequestという機能で、Requestクラスの拡張クラスを使っています)。$c;}$this->attributes["choice"]=$all;}}こんな感じで実現できた!途中いろいろはしょっている、とにかくララ帳がすばらしいのでララ帳でわかんなかったところのみをメモとして残している。dewclaLaravelのMVCのモデルコメントをどうぞ前回、データベースの1対多について悩んだことをメモ書きしておいたが、ただ、そもそもMVCのモデルをどう定義すりゃいいのよ、ということを全く考えていなかった。Javaのクラス的な考え方で、make:modelで作った時に作られる、appディレクトリ直下に作られるモデル名のPHPファイルで、クラス変数として定義しなきゃなんないんだろうな、と思い込んでいて、それらしい記事を探すけどどこにもない。モデルの要素をどこに定義すればいいのよ、と探していたが、実際は少なくともクラス変数として定義する必要はなかった。モデルを作った時に、make:modelで作った時に「-m」オプションをつけると、database/migrationsディレクトリにマイグレーション用のファイルができる。ここに定義したテーブル名が、そのままモデルの要素と考えていいような印象を受けた。appディレクトリ直下に置かれるモデル名のPHPファイルは何をするのか、というので、前回はDBのテーブル名の定義などをやってたが、何かDBとPHPの変数の間をコンバートする必要があるときに、それを定義できる「ミューテータ」という機能があることがわかった。update_atなどの日付のデータはテキストになってしまいますが、これをPHPのCarbonというDateTimeを扱うクラスのインスタンスに変更してくれる、など。['limit'];あとは、マスアサインメントといって、登録できるカラム名を定義しておき、それを配列で渡すことでレコードを操作できるような仕組みがあって、それの定義をここでやるみたいです。['campus','title','body','limit'];ここらへんの知識の大半は、「ララ帳」というすごくわかりやすいホームページが参考になっている。対象バージョンが5.1ではあるのだが、最初から進め方がきちんと押さえられているので、とても理解がし易い。昨年7月から更新が止まっているので残念なんですが、とても助かっている。QuietComfort20を買った」で買ったQuietComfort20、今日修理に出してきました。なったのか、というまえに、実際2年以上はちゃんと使っていましたよ。計算すると、買ったのが2013年8月26日発売日当日なので、修理に出したのが今日なので、1013日、おおよそ2年と10ヶ月ですね。1日あたりの料金は約37円です。ま、どうでもいいです。最初に異常に気づいたのは、私は使っていない機能だったのですが、このQuietComfort20には、通常のノイズキャンセリングモードと違い、「Awareモード」という別のモードがあります。通常のノイズキャンセリングだと外の音が聞こえ「なさ」すぎるんで、ノイズキャンセリングを聞かせつつ人の話す声を聞きやすくするモードなのですが、これらのモードを切り替える「ボタン」がついています。このボタンが効きづらくなって、おそらく内部断線だろうな。この時点で修理に出すという選択肢もあったが、気づいた時点で1年以上が経過していたため、どのみち修理代がかかってしまう。ノイズキャンセリング機能はそのままだったので、使い続けることにした。使い続けた結果どうなったか、というと、私の場合は断線ではなく、被服がはげてしまって、いつブチッと切れてもおかしくない状態になってしまいました(ノイズキャンセリング機能はきちんと使えています)。私の使い方では、大きなユニットの両端のいずれかが断線するのではと思っていたんですが、左側の耳栓側の付け根部分という意外な場所でした。私が住む福岡には、実はBOSEの直営店がありません。数年前までは天神のIMSビルにあったのですが、いつのまにか撤退していました。調べたら一番近いのは佐賀の、鳥栖プレミアムアウトレットだそうなので、車でそのためだけに行ってきました。店員に現象を説明して、故障機を渡したら、「新品が送られてきますので、修理代15120円を代引きでお支払いください」と言われ、さらにイヤーチップとクリップを外してもらって「新品についていますけど、予備品として使ってください」とわざわざ返却してくれました。クリップは、ケーブルの途中につけることができるクリップで、これでシャツなどにケーブルの一部を留めることができるのですが、このクリップが意外に重宝してるんですよねー。これから2週間は、ノイズキャンセリングなしのインナーイヤホンを使うことになるんですが、修理から帰ってきたときにまた「やっぱ違うな」と思えることを楽しみにして待ちます。1つ後悔しているのは、今週出張で飛行機乗るんだったなー、ということだけです。飛行機ノイズにすごく効くんで、飛行機で寝られない私はすごく助けられていたんですよねー。出張から帰ってきてから出せば良かったかな・・・。ORMというものをいろいろ探って試行錯誤してみていたけど、よくわかっていない。やったことを書き残す。前回、troubleというモデルをartisanコマンドでひな形を作ったところで終わった。私の設計上、このtroubleというモデルは、自らに対して1対nの関連性を持つような想定だ。親のtroubleに、複数のtroubleがぶらさがる、ツリー構造のようなイメージだ。troubleがもつカラムとしては、長文のテキスト「document」の1つのみとした。いろいろなドキュメントを見よう見まねで修正した。因みにupメソッドが作成するとき、downメソッドが元に戻すときのことを書くらしい。{$table->increments('id');$table->longText('document');$table->integer('trouble_id')->unsigned()->nullable();$table->timestamps();$table->foreign('trouble_id')->references('id')->on('t_troubles')->onDelete('cascade');});}この5行目でdocumentカラムの定義だが、6行目では、自分の親のidを納めるtrouble_idカラムを定義している。9行目で、外部キー束縛を定義している。これでマイグレーションをし直す。migrate:refreshすると、MySQLのデータベースを見ると、テーブルに「document」と「trouble_id」のカラムが追加されている。今度は、App\Trouble.phpを以下のように修正した。$this->belongsTo('App\Trouble');}}ここでテーブル間の相関関係を定義するらしい。便宜上ツリーに見立てて1を親、nを子として説明するが、hasManyが、子クラス(App\Trouble)と親のApp\Trouble間には、子のtrouble_idに親のidをもつ形で複数の関係あるよ、ということになって、belongsToは、その逆、子から1つの親があるよ、ということになるらしい。Seederっていって、データベースの初期状態を定義できる仕組みを使って、操作方法を確かめてみる。databases\seeda\DatabaseSeeder.phpを以下のように修正した。db:seedそしてt_troubleテーブルを見ると、「ぶらさがります」と「こっちもぶらさがり」のtrouble_idに、「こんにちは世界」のidが入っているのがわかる。うまくいっているようですねー。親を先にsaveでDBに格納しておかないと、親のIDがわからないので、当然うまくいかないようだ。trb1のtroublesで関連づけたくてtrb2を書き込むときは、「$trb1->troubles()->save($trb2)」って書くところがなかなか思いつかないのねー。Trouble::find('1')->troubls;とやると、idが1のレコードにぶら下がるレコード群をdata変数へ得ることができるようです。dewcla結局Laravelに戻って、ぼちぼち始める。2件の返信PHPixieでいろいろやってたけど、私の読解力不足で、なんともならなかったので、結局Laravelに戻ってきた。Laravelに戻ってきた理由はいろいろあるけど、英語が苦手な私も日本語ドキュメントや日本人によるユーザー事例(ブログなど)が充実していたことが一番大きい。最新版を使うのなら、結局英語のドキュメントを参照せざるを得なくなるのだけれど。これはフレームワーク全般に関する不安だろうが、マイナーバージョンアップでも結構な変更点がありそうなところだ。セキュリティサポートのパッチが同一バージョンで2年?3年リリースされるようなので、とりあえず大丈夫だろう。フレームワークを使おうとした一番の理由は、セキュリティの問題だ。開発者が考慮していなければならないのは変わらないが、フルスクラッチで組むよりは遙かに考慮点が少なくなる(のではないかという希望を与えてくれる)ということだ。ユーザー認証の仕組みなども、フレームワークで考慮されていれば、とりあえず導入するのもフルスクラッチに比べれば手間はかからない(のではないかという希望を与えてくれる)ということもある。いうことで、ぼちぼち作り始める。List」をやっていきながら、同じような目的のことをやっていくことにした。「Laravelの続き。quickstart-basic-masterをやってみる。」でやったように、プロジェクトの作成およびhttp.confでAliasの設定、そして.htaccessファイルの修正を行った。そのまえに、ユーザー認証の機構を使うので、ユーザー認証の仕組みはあらかじめ追加しておいた。make:authこれだけで認証の仕組みができるんだから、フレームワークはありがたいね。最初に、モデルを作成してみる。モデルは、Eloquentという仕組みを使うらしい。解説ページを見ながら、とりあえずやってみた。Troubleこれでいいのかな?結果、app直下に各クラス定義のphpファイルが、database/migrationsにマイグレーション用と思われるファイルが生成されていた。最初にDBのテーブル名を定義する。クラス変数「$table」に定義しておくと大丈夫らしい。't_troubles';}のように。dewcla今度はPHPixieを試してみるコメントをどうぞフレームワーク行脚の旅、というか、PHPも初心者、フレームワークもそんなに使ったことない、という私が、どんなものがあるのだろうと探し回っている中、初心者にお勧めだというフレームワーク「PHPixie」を見つけたので試しにXAMPP環境でちょっと使ってみた。データベースがMongoDBというオブジェクト指向DBというのが気になるけど、ま、最悪DB操作は直接PHPで書けばいいわけだし。あ、ユーザー認証どうしよう。プロジェクトの作成と最初のページの表示までまずはLaravelと同様、XAMPPのhtdocsのディレクトリに行き、composerを使ってプロジェクトを作成する。phpixieとりあえずそれらしいファイル群はできたようだ。クイックスタートのページにあるように、まず、プロジェクトルートファイルに「.htaccess」を以下のように作っておく。[Lそして、ApacheのDocumentRootをプロジェクトルートに向ければ、「http://localhost/」でテストページが表示された。tutorial」という文字が表示された。うまくいっているようだ。仕組みはあとで考えよう...RoutingそんでもってRoutingをこれもまたページの内容そのままで進めてみる。QuickStart.phpにviewActionメソッドを追加するところまでは良かったが、「config」フォルダ内の「routeResolver.php」の追加が、どこに追加するのかよくわかんなかったので、結局以下のようにしてみた。));そうしたところ、うまく「http://localhost/quickstart/view/5」で「5」って表示されたから、大丈夫なのだろう。仕組みは後で考えよう。dewclaLaravelの続き。quickstart-basic-masterをやってみる。コメントをどうぞあれからちょっと間が開いたが、公式のドキュメントを読んで、チュートリアル的な物をやってみようと思った。5.2だということを知った。私が見ていたドキュメントは日本語版の5.1までのやつだったので、どうせなら新しいのを見てやろうということで、5.2のドキュメントを見始めた。そこでチュートリアル的なものを探していたら、「クイックスタート」があったのでやってみることに。タスクを追加したり削除したりするだけの単純なアプリケーションらしい。指示に従い、GitHibからソースをダウンロードし、xamppのApacheのhtdocsにフォルダ(laravel)を作ってコピーした。その後、以下のようにしてLaravelのコンポーネントをインストールする。installそして、XAMPPのMySQLで、PHPMyAdminからデータベースを新規作成し、「.env」ファイルでデータベースの設定を上書きしたあと、マイグレーションを実施してみた。migrateとりあえずテーブルができたようで、実行してみた。ルートに前回見つけた「.htaccess」を置いてみたところ、とりあえず最初の画面の表示がされたが、タスクを追加しようとするとエラーに...どうやらリダイレクトがうまくいっていないようで、リダイレクトの無限ループを起こしているらしい。いうことでリダイレクトの仕組みをやり替える。最初に置いた「.htaccess」を消して、わかりやすいAliasを使ってみる。httpd.confの、alias_moduleのくだりで、以下のように書いてみた。<Directory></IfModule>やってみたが、やはりトップ画面のみ表示されて、追加しても同じエラーに。ググってみると、publicフォルダの「.htaccess」ファイルを修正しなければならないことが判明。On」の下に、以下を追加した。/laravelとりあえずこれでタスクの追加まではうまく動いた。今度はタスクを削除させようとクリックすると、アプリケーション名が消えてしまう。生成されたソースを見ると、追加のformタグのactionは「http://localhost/laravel/task/」となっているのに、削除のformタグのactionは「/task/1」などとなっている。これはビューを書き換えればなんとかなりそうなので、以下のように書き換えてみた。method="POST">とりあえず動いてくれた。dewclaxamppとlaravelの覚え(PHP初心者)コメントをどうぞNetBeansインストール私は昔Javaをやってましたが、今回はPHPの環境のみを選んでインストール。昔に比べてずいぶん軽くなっていますね。xamppインストールOK。MySQLのrootパスワードを変えたらPHPMyAdminが起動できなくなる。xampp\phpMyAdmin\config.inc.phpの接続情報を書き換えて解決。取得しインストールOK。チュートリアルを参考にやってみた。xamppのコントロールパネルからShellを起動しそこで実施。"laravel/installer=~1/1"インストール完了。