いまさらlaravel4に触って、MVC的に理解してみた。
【序章】
PHPには、laravelというフレームワークがあって、この頃流行ってきた感があるので試しに触ってみた。
laravelは、もともと英語圏で人気があったのだが、今年になって本が出たり最新版のlaravel5が出たりして、日本でも徐々に普及期に入ってきた感じがある。
ただし、新しいLAMPフレームワークなのでPHPバージョンが新しくないと動作しない。
Laravel4 = PHP5.4以上
Laravel5 = PHP5.5.9以上
最新版の5は、2015年2月に出たばっかりなので、ネットや本では4と混在して説明されていて非常に混乱する…。
なので、自分はlaravel4からやってみる事にした。
現在の日本で唯一のlaravel本。
読んでみた感想としては、書いている人や対象レベルがバラバラで、説明も分かりづらいので正直、あんまりオススメじゃない…。
【動作環境・インストール】
laravelはPHPのフレームワークなので、xamppなどWordPressなんかのWebアプリと同じような感じでインストールする。
ただしlaravelでは、Compozerというバージョン管理アプリ(コマンドラインツール)を使ってダウンロードしてくる。
覚える事その1、Composer
英語で「指揮者」という意味で、パッケージの依存管理(バージョンとかを気にしなくても良くなる)してくれるソフトです。
Laravelのインストールも、自分でブラウザからバージョンを選択→ローカルにダウンロード→解凍→しなくてもOK!
※逆に言うと、そういうのを全然理解しなくても使えるようになる危険性が…。
xamppがインストールされていれば、Setup.exeをクリックしてNextを押してればインストール完了!
Laravelのインストールも、コマンド一発!(フォルダを作って指定したバージョンのlaravelをダウンロードしてくれる)
cd C:\xampp\htdocs
composer create-project “laravel/laravel=~4.2” laravel4
http://localhost/laravel4/public/ にブラウザでアクセスできればOK!
【MVCモデル】
Webアプリの構造を分解すると、以下の3要素に分けられる。
Model = データベース(情報を蓄積する)
View = 情報を表示したり、入力を受け付けたりする画面
Controller = 入力や条件により、ModelやViewを制御する
こうやって要素に分けると、どのパスのどのファイルが何をやっているのか見通しがよくなるので、昨今のフレームワークでは、ほぼ採用されている考え方です。当然laravelでも採用されている。
【Hell, World!】
どんなプログラミングでも、最初に実行するhello, worldプログラミング。もっとも単純なだけに各言語や動作環境がどれだけそぎ落とせるか?という事で、特徴がよく現れる。
C:\xampp\htdocs\laravel4\app\routes.phpの最初の方に、以下のコードを追加してみる。
1 2 3 |
Route::get('/hello', function() { return "hello, world"; }); |
http://localhost/laravel4/public/hello にアクセスすると、hello, worldという文字列がブラウザに表示される。
問題なく表示されれば、君も今日からLaravel使いだ!(笑)
ここで重要なのは、ModelやViewは必須ではないが、Controllerは絶対に必要だ!という事。
画面にHello, Worldと表示しているからViewを使っているのでは?と思うかもしれないが、それは間違いだ。
なぜなら、デザインや配置が出来ずにただ文字列を出力しているだけだから。Viewは受け取った情報を、どう表示するか?を受け持つ。
もちろん、ここでHTMLタグやCSSなどの文字列を出力しても可能は可能だが、MVCモデルに反するやり方です。
※逆説的に言うと、すごく単純な表示だけでOKなら、Viewは不要。サンプルのようなControllerの文字列出力だけでもなんとかなる。
【Viewとbladeテンプレート】
それじゃあ、Viewの使い方を見てみよう。以下のパスにbladeファイルを作る。(bladeは、laravelのテンプレート)
C:\xampp\htdocs\laravel4\app\views\hello.blade.php
hello.blade.phpの中身
1 |
Hello <?php echo $name ?> ! |
1 2 3 4 5 |
// routes.phpも変更する Route::get('/hello', function() { // View(Bladeファイル)を指定して、値を渡す return View::make('hello')->with('name', 'jack'); }); |
http://localhost/laravel4/public/hello
Hello, jack !と表示されたはずだ。これで見た目を変更したい時には、hello.blade.phpを修正するだけだ!とWebデザイナに画面を作ってもらう事が出来る。
※自分で作るときにも、デザイン部分とルーティング部分を切り分けて作業できる。
【ルーティングとControllerの違い】
ルーティング=URL引数によって、どんな処理(関数)を行うか?という一種の対応表
Controller=ルーティングを含んだ制御全般
せっかくなので、URL引数によって表示が変わるように修正してみる。
1 2 3 4 |
Route::get('/hello/{arg_name}', function($arg_name) { // View(Bladeファイル)を指定して、値を渡す return View::make('hello')->with('name', $arg_name); }); |
http://localhost/laravel4/public/hello/laravel にアクセスするとHello laravel !と表示されるはず。
最後のlaravelの部分を変更すると、表示が同じ文字列になります。
【データベースとModelの違い】
データベース=いわゆるMySQLやPostgreなど、SQLクエリで操作するデータベース。
Model = Controllerとデータベースの仲介役となる存在。Controllerは直接SQL実行せずに、Modelのオブジェクトを操作してデータ入出力を行う(O/Rマッパー)
ちょっと分かりづらいので、具体例を上げてみる。
メンバーテーブルに「生年月日」があったとして、そこから「現在年齢」や「M1・F1層」などを計算する処理は、ControllerではなくModelが行う
簡単に言うと、データベースをクラス化した物がModel。Controllerは制御に徹するべきで、データ操作はModelにやらせるべき。
【Modelの操作方法】
まず、laravelにデータベースへの接続情報を書く。
C:\xampp\htdocs\laravel4\app\config\database.php
1 2 3 4 5 6 7 8 9 10 11 12 |
'default' => 'mysql', 'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'laravel4', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_general_ci', 'prefix' => '', ), |
次にテーブルを作る。laravelではSQL文(create table)ではなく、PHPでクラス設計的に記述する。
これによって、SQLを分離せずにPHPで統合的に書ける(もちろんSQLの理解は必要だが)
ここで急に、artisan(英語で熟練工)というコマンドラインを使います
※本来はControllerやViewもartisanで生成するけど、ファイル一つだけだったので使わなかった。Modelは使った方が楽
コマンドプロンプトでlaravelルートまで移動して、テーブル作成コマンドを入力する!
1 2 |
cd C:\xampp\htdocs\laravel4 php artisan migrate:make create_members_table |
以下のテーブル定義ファイルが生成される。
C:\xampp\htdocs\laravel4\app\database\migrations\本日の年月日_create_members_table
中身には
upメソッド(Create Table)
downメソッド(drop Table)
が実装されたクラス(extends Migration)が生成されています。
upメソッドの中にテーブル定義を実装して下さい。
1 2 3 4 5 6 7 8 9 |
Schema::create('members', function($table) { $table->increments('id'); // 識別用ID $table->string('name'); // 名前 $table->string('mail'); // メールアドレス $table->integer('age'); // 年齢 $table->timestamps(); // 作成日時 $table->softDeletes(); // 論理削除日付(初期値:NULL) }); |
実際にMySQLにテーブルを作成します。この時点でphpMyAdminでSQL操作出来るようにはなっています。
php artisan migrate
ただし、これだけだとモデルを実装していないので、laravelからレコード操作が出来ません。
なので、このテーブル操作専用のControllerクラスとModelクラスとを作成します。
1 2 3 4 5 6 7 8 9 10 |
php artisan controller:make MemberController Controller created successfully! public function index() public function create() public function store() public function show($id) public function edit($id) public function update($id) public function destroy($id) |
app/model/Members.phpの方は、artisanコマンドで作れないのかな?
こんな感じのファイル内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // C:\xampp\htdocs\laravel4\app\models use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletingTrait; class Member extends Model { // 識別IDフィールドを指定する protected $guarded = ['id']; // 作成時間を自動設定 public $timestamps = true; // 論理削除をクラスに追加する use SoftDeletingTrait; // 削除時間を自動設定 protected $dates = ['deleted_at']; } |
長くなってきたので、データベース操作は次の投稿へ続く!