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

LaravelのEloquentで悩む

前回から、モデルを定義して、モデルと密接に関係しているデータベースとの関わり合いをうまいところやってくれるらしいEloquent ORMというものをいろいろ探って試行錯誤してみていたけど、よくわかっていない。とりあえずやったことを書き残す。

前回、troubleというモデルをartisanコマンドでひな形を作ったところで終わった。で、私の設計上、このtroubleというモデルは、自らに対して1対nの関連性を持つような想定だ。親のtroubleに、複数のtroubleがぶらさがる、ツリー構造のようなイメージだ。

で、troubleがもつカラムとしては、長文のテキスト「document」の1つのみとした。

まずは前回atrisanコマンドで作ってもらったマイグレーション用のファイルdatabase/migrations/~create_troubles.php をいろいろなドキュメントを見よう見まねで修正した。因みにupメソッドが作成するとき、downメソッドが元に戻すときのことを書くらしい。

この5行目でdocumentカラムの定義だが、6行目では、自分の親のidを納めるtrouble_idカラムを定義している。そして、9行目で、外部キー束縛を定義している。これでマイグレーションをし直す。

> php artisan migrate:refresh

すると、MySQLのデータベースを見ると、テーブルに「document」と「trouble_id」のカラムが追加されている。よしよし。

そして、今度は、App\Trouble.phpを以下のように修正した。

ここでテーブル間の相関関係を定義するらしい。便宜上ツリーに見立てて1を親、nを子として説明するが、hasManyが、子クラス(App\Trouble)と親のApp\Trouble間には、子のtrouble_idに親のidをもつ形で複数の関係あるよ、ということになって、belongsToは、その逆、子から1つの親があるよ、ということになるらしい。

さらに、Seederっていって、データベースの初期状態を定義できる仕組みを使って、操作方法を確かめてみる。databases\seeda\DatabaseSeeder.phpを以下のように修正した。

で、artisanにてseedを実行!

> php artisan db:seed

そしてt_troubleテーブルを見ると、「ぶらさがります」と「こっちもぶらさがり」のtrouble_idに、「こんにちは世界」のidが入っているのがわかる。うまくいっているようですねー。

親を先にsaveでDBに格納しておかないと、親のIDがわからないので、当然うまくいかないようだ。そしてtrb1のtroublesで関連づけたくてtrb2を書き込むときは、「$trb1->troubles()->save($trb2)」って書くところがなかなか思いつかないのねー。

この状態で、

とやると、idが1のレコードにぶら下がるレコード群をdata変数へ得ることができるようです。

今日はここまで…

結局Laravelに戻って、ぼちぼち始める。

PHPixieでいろいろやってたけど、私の読解力不足で、なんともならなかったので、結局Laravelに戻ってきた。Laravelに戻ってきた理由はいろいろあるけど、英語が苦手な私も日本語ドキュメントや日本人によるユーザー事例(ブログなど)が充実していたことが一番大きい。でも、最新版を使うのなら、結局英語のドキュメントを参照せざるを得なくなるのだけれど。

不安もある。これはフレームワーク全般に関する不安だろうが、マイナーバージョンアップでも結構な変更点がありそうなところだ。でもセキュリティサポートのパッチが同一バージョンで2年?3年リリースされるようなので、とりあえず大丈夫だろう。

フレームワークを使おうとした一番の理由は、セキュリティの問題だ。もちろん開発者が考慮していなければならないのは変わらないが、フルスクラッチで組むよりは遙かに考慮点が少なくなる(のではないかという希望を与えてくれる)ということだ。また、ユーザー認証の仕組みなども、フレームワークで考慮されていれば、とりあえず導入するのもフルスクラッチに比べれば手間はかからない(のではないかという希望を与えてくれる)ということもある。

ということで、ぼちぼち作り始める。手順はLaravelのサイトにあるDocumentの中にあるチュートリアルの、「Basic Task List」をやっていきながら、同じような目的のことをやっていくことにした。

とりあえず「Laravelの続き。quickstart-basic-masterをやってみる。」でやったように、プロジェクトの作成およびhttp.confでAliasの設定、そして.htaccessファイルの修正を行った。

そのまえに、ユーザー認証の機構を使うので、ユーザー認証の仕組みはあらかじめ追加しておいた。

> php artisan make:auth

これだけで認証の仕組みができるんだから、フレームワークはありがたいね。

最初に、モデルを作成してみる。モデルは、Eloquentという仕組みを使うらしい。解説ページを見ながら、とりあえずやってみた。

> php artisan make:model -m Trouble

これでいいのかな?結果、app直下に各クラス定義のphpファイルが、database/migrationsにマイグレーション用と思われるファイルが生成されていた。

最初にDBのテーブル名を定義する。クラス変数「$table」に定義しておくと大丈夫らしい。たとえば

のように。

今日はここまで・・・

今度はPHPixieを試してみる

フレームワーク行脚の旅、というか、PHPも初心者、フレームワークもそんなに使ったことない、という私が、どんなものがあるのだろうと探し回っている中、初心者にお勧めだというフレームワーク「PHPixie」を見つけたので試しにXAMPP環境でちょっと使ってみた。

データベースがMongoDBというオブジェクト指向DBというのが気になるけど、ま、最悪DB操作は直接PHPで書けばいいわけだし。あ、ユーザー認証どうしよう。

プロジェクトの作成と最初のページの表示まで

まずはLaravelと同様、XAMPPのhtdocsのディレクトリに行き、composerを使ってプロジェクトを作成する。

> composer create-project phpixie/project phpixie

とりあえずそれらしいファイル群はできたようだ。で、クイックスタートのページにあるように、まず、プロジェクトルートファイルに「.htaccess」を以下のように作っておく。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !web/
RewriteRule (.*) /web/$1 [L

そして、ApacheのDocumentRootをプロジェクトルートに向ければ、「http://localhost/」でテストページが表示された。

Processor

次の節、Processorをページの内容そのままで進めて、「HTTPProcessors」フォルダ直下に「Quickstart.php」を作成してQuickstartクラスを定義したあと、「App」フォルダ直下の「HTTPProcessor.php」にbuildQuickstartProcessorメソッドを定義して、再実行してみたところ、ちゃんと「http://localhost/quickstart」で「Quickstart tutorial」という文字が表示された。

うまくいっているようだ。仕組みはあとで考えよう…

Routing

そんでもってRoutingをこれもまたページの内容そのままで進めてみる。QuickStart.phpにviewActionメソッドを追加するところまでは良かったが、「config」フォルダ内の「routeResolver.php」の追加が、どこに追加するのかよくわかんなかったので、結局以下のようにしてみた。

<?php

return array(
    'type'      => 'group',
    'resolvers' => array(
        
        'default' => array(
            'type'     => 'pattern',
            'path'     => '(<processor>(/<action>))',
            'defaults' => array(
                'processor' => 'greet',
                'action'    => 'default'
            )
        ),
        'view' => array(
            'type'  =>  'pattern',
            'path'  =>  'quickstart/view/<id>',
            'defaults'  => array(
                'processor' => 'quickstart',
                'action'    =>  'view'
            )
        )
        
    )
);

そうしたところ、うまく「http://localhost/quickstart/view/5」で「5」って表示されたから、大丈夫なのだろう。仕組みは後で考えよう。

とりあえず今日はここまで。

Laravelの続き。quickstart-basic-masterをやってみる。

あれからちょっと間が開いたが、公式のドキュメントを読んで、チュートリアル的な物をやってみようと思った。

コマンドプロンプトで「php artisan」とやってみて、ヘルプを表示させたら、頭に「Laravel Framework version 5.2.20」と表示されて、Laravel 5.2だということを知った。私が見ていたドキュメントは日本語版の5.1までのやつだったので、どうせなら新しいのを見てやろうということで、5.2のドキュメントを見始めた。そこでチュートリアル的なものを探していたら、「クイックスタート」があったのでやってみることに。どうやらタスクを追加したり削除したりするだけの単純なアプリケーションらしい。

指示に従い、GitHibからソースをダウンロードし、xamppのApacheのhtdocsにフォルダ(laravel)を作ってコピーした。その後、以下のようにしてLaravelのコンポーネントをインストールする。

> cd laravel
> composer install

そして、XAMPPのMySQLで、PHPMyAdminからデータベースを新規作成し、「.env」ファイルでデータベースの設定を上書きしたあと、マイグレーションを実施してみた。

> php artisan migrate

とりあえずテーブルができたようで、実行してみた。ルートに前回見つけた「.htaccess」を置いてみたところ、とりあえず最初の画面の表示がされたが、タスクを追加しようとするとエラーに…

どうやらリダイレクトがうまくいっていないようで、リダイレクトの無限ループを起こしているらしい。ということでリダイレクトの仕組みをやり替える。まず、最初に置いた「.htaccess」を消して、わかりやすいAliasを使ってみる。httpd.confの、alias_moduleのくだりで、以下のように書いてみた。

<IfModule alias_module>
…
  Alias /laravel "C:\xampp\htdocs\laravel\public"
  <Directory "C:\sampp\htdocs\laravel\public">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride all
      Order allow,deny
    Allow from all
  <Directory>
</IfModule>

やってみたが、やはりトップ画面のみ表示されて、追加しても同じエラーに。いろいろググってみると、publicフォルダの「.htaccess」ファイルを修正しなければならないことが判明。「RewiteEngine On」の下に、以下を追加した。

RewriteRule ^(.*)/$ /laravel/$1 [L,R=301]
RewriteBase /laravel

とりあえずこれでタスクの追加まではうまく動いた。で、今度はタスクを削除させようとクリックすると、アプリケーション名が消えてしまう。生成されたソースを見ると、追加のformタグのactionは「http://localhost/laravel/task/」となっているのに、削除のformタグのactionは「/task/1」などとなっている。これはビューを書き換えればなんとかなりそうなので、以下のように書き換えてみた。

<!-- Task Delete Button -->
<td>
  <form action="{{ url('task')}}/{{ $task->id }}" method="POST">

とりあえず動いてくれた。今日はここまで・・・