「オープンソース」を使ってみよう (第35回 phpフレームワーク Laravel)

No Comments
このエントリーをはてなブックマークに追加

phpフレームワーク Laravel

—————————————–
Laravel jp ユーザーグループ
竹澤 有貴
—————————————–
1.はじめに
2.セットアップ
3.設定ファイルについて
4.ルーターについて
5.コントローラーについて
6.モデルについて
7.ビューについて
8.Iocコンテナ
9.その他

1.はじめに

PHPには多くのフレームワークがあるのをご存知でしょうか?
昨今、cakePHP、Symfony2、Zend Framework、codeigniterやFuelPHPなど、
様々な種類のPHPフレームワークが多数存在しています。

今回ご紹介する「Laravel」は、その中でも最新鋭のフレームワークであり、
これまで多くのユーザーが使用してきたライブラリ提供サービスの「PEAR」ではなく、
「composer」というライブラリ管理ツールを利用したモダンなフレームワークです。
FuelPHPやKohanaのような、CodeIgniterの開発者がフォークして産み出されたフレームワークではなく、マイクロソフトの.NETの開発に関わっていたTaylor Otwell氏によって
開発されています。
Laravelは、最新のバージョン4からcomposerによるライブラリ管理とSymfonyコンポーネントを採用したことで、海外ユーザーの間で非常に話題になりました。
また、この時期にcodeigniterがライセンスを変更したことにより、海外ユーザーの多くが
LaravelやPhalconといった新しいフレームワークを使うようになりました。
さらに、現在GitHubでの評価もStar9880以上となり、
それまでトップだったSymfonyを引き離し、あっという間に首位に立ちました。
このことからも多くのPHPユーザーから注目されていることがうかがえます。

現在では日本語ドキュメントなども多数インターネット上で公開されるようになり、
海外でリリースされているLaravel関連の電子書籍の多くが日本語訳でリリースされ
ています。
その他、国内外問わず多くのユーザーによるLaravelパッケージが公開・提供され、
フレームワークのコミュニティとしてもかなり大きな規模となっています。
(主に英語が多いですが、日本ユーザーによるフォーラムも開設されています。)
情報量も豊富ですので、この機会にぜひチャレンジしてみてください。


Laravel 4 ドキュメント+
Laravel: Code Bright (JP)
Laravel 4 Cookbook 日本語版
Laravel: From Apprentice To Artisan 日本語版
Laravel Testing Decoded 日本語版
Implementing Laravel 日本語版
Laravel4でこなすプログラム術 Getting Stuff Done


動作に必要な環境は、
php 5.4以上(laravel4.2 以前のバージョンは5.3.7以上)
mcryptが必須となります。
またライブラリをダウンロードするのに必要なgitコマンドを
使用できるようにしておく必要があります。

2.セットアップ

それでは早速ダウンロードしてみましょう。
前述の通りcomposerが必須となっているので、まずはcomposerをインストールします。
composer
インストールコマンドは下記のコマンドです。

$ php -r "readfile('https://getcomposer.org/installer');" | php

*phpへパスを通していない場合はphpのパスを指定してください。
composer
windowsユーザーの方はインストーラーも配布されているので、
そちらを利用していただいてもかまいません。
composer.pharがディレクトリに作成されますので、

$ php composer.phar

でcomposerの動作確認ができます。
composer_confirm
*php composer.pharをcomposerで実行できるように、パスを通しておくのを
お勧めします。
composerがインストールされたのを確認したら、
次はLaravelをダウンロードします。
ダウンロードのコマンドは下記になります。

$ composer create-project laravel/laravel 作成したいプロジェクト名 --prefer-dist

ここでは例としてtest.projectとして作成します。

$ composer create-project laravel/laravel test.project --prefer-dist

ライブラリやLaravelのインストールが終わりましたら、
cache等に使用される app/storage/ フォルダの権限を変更します。
作成したプロジェクトのディレクトリで実行します。

$ chmod -R 777 app/storage/

次にapacheやNginx等を利用せずに、php5.4以降で使用できるようになった
phpのビルトインウェブサーバーで動かしてみましょう。
同様に作成したプロジェクトのディレクトリで下記コマンドを実行します。
$ php artisan serve
artisan_serve
デフォルトでhttp://localhost:8000で起動しますが、
任意のポートで起動させたい場合は

$ php artisan serve --port=8888

と指定します。
起動したurlに早速アクセスします。

laravel_confirm

この様な画面が表示されれば完了です。
この他現在では、Vagrantでbox add laravel/homesteadすることで
より簡単に環境構築できるようになりました。
詳しくは公式サイトをご覧ください。
homestead

3.設定ファイルについて

設定関連のファイルはapp/config配下です。
app.phpはアプリケーション自体の設定関連、
cache.phpはキャッシュ関連、
database.phpはデータベース関連等、
それぞれの機能によって分割されています。
また本番環境とテスト環境、開発環境等それぞれの環境で設定を変更したい場合は、
bootstrap/start.phpのdetectEnvironment内で指定します。
推奨の変更方法は、それぞれの環境のhostnameを配列のキーと対応させて指定し、
それぞれの配列キー名をapp/configの中に作成、
変更したい設定ファイル(またはその内容の一部)をその中に設置するだけで
それぞれの環境の設定内容で上書きしてくれます。
指定していない環境の場合はapp/config配下で実行されます。
下図の様に指定した場合は、

bootstrap_start

*.local環境の場合はapp/config/local配下に設置しているファイルがあればそれらで
上書き、staging01、staging02の場合は同様にapp/config/staging配下のファイルで
上書きます。

config_env

早速現在のhostnameをlocalに記述して、
ここではapp/config/local/app.phpを下図のように指定してください。

env_app

エラー表示や、時刻設定を上書くことができます。
同様に環境によって接続するデータベースやキャッシュ等も変更可能です。

4.ルーターについて

多くのPHPフレームワークが、
ディレクトリパスや、コントローラーとメソッドでパスを決定しますが、
LaravelではrubyのSinatraライクにルーターを設定することができます。
またルーターとコントローラーに制約が無いため、ルーターだけで処理を
実装することも可能です。
ルーターはapp/routes.php にあり、下図のようになっています。

default_router

ここでは、/ にGETでアクセスした場合に、
app/views/hello.phpを出力する、という様に記述されています。
(デフォルトのviewディレクトリはapp/viewsです)
コントローラーを介さずに出力されており、viewを介さずに出力することもできます。

not_view

GET以外にもPOSTや、PUT、PATCH、DELETEなどにも対応しています。
この他に多くのルーター記述方法があり、
RESTfulなAPI設計や、複数ドメインを管理する様なルーター設定等、
シンプルなものから複雑なものまで幅広く対応できる様な仕組みとなっています。
ルーティング
ルーターとコントローラーの関連付けは後述のコントローラーについてをご覧ください。

5.コントローラーについて

コントローラーはデフォルトではapp/controllers配下となります。
BaseControllerを継承して実装していく様になっています。
HomeControllerのメソッドを使って先ほどのルーターとコントローラーを
関連付けてみます。

default_controller

これは/ にGETでアクセスした場合にHomeControllerのshowWelcomeを実行する、
という指定になります。
同様にメソッドを追加することで様々なURIを実装できます。

add_methods
add_router

更にfunction名をgetXXX, postXXX等とし、
コントローラーとルーターに下図のように指定すると、
URIとHTTPメソッドを結びつけることができます。

prefix_methods
controller_router

作成したルーターを下記のコマンドで一覧表示して確認してみましょう。

$ php artisan routes

artisan_routes

{one?}/{two?}/{three?}などはそのままパスに含めることができ、
対応のメソッドの引数で指定し、値を受け取ることができます。

method_args

特に必要がない場合はメソッドに指定しなくて構いません。

他にartisan コマンドでコントローラーを作成することもできます。
controller:make

コントローラーからviewへ値を渡す場合は、

View::make('template_name')->with('data', $params);

または、

$array = ['data' => $params];
View::make('template_name', $array);

となりますが、この他にもsessionに含ませる方法や、
一度だけ表示させる様な渡し方(エラー表示等)など便利なメソッドが
多数用意されています。

6.モデルについて

モデルにはエロクアント(Eloquent)、クエリービルダーとベーシックなクエリーの
3種類が用意されており、これらは独立したコンポーネントになっていますので、
Laravel以外のフレームワークでも使用することが可能です。
データベースに接続するにはdatabase.phpで接続先の指定をする必要があります。
Laravelではデータベース関連ではMySQL, PostgreSQL, SQLite, and SQL Serverが
サポートされていますので、お使いの環境に合わせて設定してください。
パッケージではMongoDB、Oracle等に対応したものが公開されていますので、
一般的なデータベースをお使いの場合は接続先が何であっても特に気にする
必要はありません。

ベーシックなクエリーは下記の様な発行方法です。

■SELECT
DB::select('select * from users where id = ?', array(1));

■INSERT
DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Dayle'));

■UPDATE
DB::update('update users set votes = 100 where name = ?', array('John'));

■DELETE
DB::delete('delete from users');

いずれもプリペアドステートメントを使用して
各クエリーを発行する形式になっています。

クエリービルダーでは以下の様になります。

■SELECT
DB::table('users')->where('id', 1)->first();

■INSERT
DB::table('users')->insertGetId(['id' => 1, 'name' => 'Dayle']);

■UPDATE
DB::table('users')->where('name' => 'John')->update(['votes' => 100]);

■DELETE
DB::table('users')->where('name' => 'John')->delete();

複数の検索条件が必要な場合はwhereを複数記述することで、
内部でANDへと変換されます。

エロクアントは、より洗練されたORMを提供します。

 ■SELECT
User::all();
User::find(1);

 ■INSERT
$user = User::create(array('name' => 'John'));

 ■UPDATE
$user = User::find(1);
$user->email = 'john@foo.com';
$user->save();

■DELETE
$user = User::find(1);
$user->delete();

エロクアントの場合は、デフォルトでは
クラス名を小文字の複数形にしたものが、テーブル名として使用されます。
初期状態の場合はapp/modelsにUserクラスが設置されています。
複数形ではない別のテーブルを使用する場合は、

protected $table = 'table_name';

と定義し
同様にfindで使われるものはprimaryKeyとなりますので、

protected $primaryKey = "table_id";

と定義します。
検索条件の追加等はクエリービルダーを組み合わせて実装していきます。

エロクアント、クエリービルダー、ベーシックの3種とも、
データベースのマスター、スレーブ、複数のデータベースを使用する場合等は、

// ベーシック
DB::connection('master')->select($sql, $params);

// クエリービルダー
DB::connection('master')->table('table')->get();

// エロクアント
User::on('slave)->find(1);

等の様に接続先を変更します。
これらの接続先は、app/config/database.php内のconnections配列のキーを
指定することで変更可能です。
デフォルトはsqlite, mysql, pgsql(PostgreSQL), sqlsrv(SQL Server)になっていますので、
masterやslaveなどへ変更して、接続先を指定してください。

この他に、エロクアントとクエリービルダーはクエリーの結果を
キャッシュしたり、ページャーを簡単に実装するメソッドが用意されています。
ベーシック
クエリービルダー
エロクアント

7.ビューについて

bladeというシンプルなテンプレートが用意されています。
TwigやSmartyなどと同様にレイアウト対応も可能です。
blade
bladeの他に、TwigやSmartyなどもパッケージが公開されていますので、
好みに応じて他のテンプレートを使用することができます。

8.Iocコンテナ

コントロールの逆転(Inversion of control)という、
依存を取り除く強力なコンテナが用意されています。
基本的な使い方は

//最もシンプルなインスタンス生成
$instance = App::make('Acme\ClassName');

//インターフェイスと結びつける
App::bind('Acme\ClassNameInterface', 'Acme\ClassName');

//シングルトン
App::singleton('Acme\ClassName', function()
{
return new ClassName;
});

などがあり、
タイプヒントでコンストラクタ・インジェクションなどで利用されます。
これによりユニットテストなどが容易になり、
システム設計や実装により集中できるようになります。
実装したモデルをコントローラーで使用する場合や、
独自に実装したクラスを利用する場合に使います。
この他にもコンテナにイベントを設定したり、より強固な実装を行えるようになります。

9.その他

上記の他にもLaravelには、
キューサーバを利用したメール送信や、
SSHを利用した実装、他言語対応、
大規模なトラフィックをさばくためのNoSQL対応など
(デフォルトではRedisがサポートされ、パッケージではRiak等があります)
多くの機能が提供されており、
パッケージではジェネレーターのLaravel-4-Generatorsや、
高機能認証パッケージのsentryなど高品質なパッケージがあります。
また、Facebook社が開発したPHPコンパイラHHVMでも動作しますので、
より高速な動作環境等を構築することが可能です。

今回は「Laravel」の主な機能についてご紹介いたしました。
ご不明な点等がありましたら、日本ユーザーフォーラム
または日本ユーザーグループ(facebook)にてお気軽にご質問ください。


Comments are closed.