PHPカンファレンス行ってきます
今週土曜日 (10/11) に PHPカンファレンス2014 が開催されます。実のところ初参加でして、楽しみ半分不安半分といったところです。
"ぼっちになっても泣かない" を目標に楽しみたい所存です。
当日見ようと思っているプログラムはこちら。
- 基調講演
- 基本。
- PHPコアから読み解くPHP5.5
- 面白そう。PHP5.6の話もあるといいなー。
- フリマアプリ「メルカリ」の超高速開発を支える PHP
- ここは迷ってて、もしかしたら「mysqlnd 徹底解説」に行くかも。
- PHPにおけるI/O多重化とyield
- もしかしたらお昼ごはん食べてるかもしれません。
- HHVM + Hack == PHP++
- 通訳ありなのが助かります。一番楽しみにしてるセッション。2番めに楽しみな「Good Parts of PHP and The UNIX Philosophy」が聞けないのが残念…。
- 休憩
- 14:50 - 15:20は特にこれはというものはなし。「PHP&NewSQLで考える次世代アプリケーション」だけ気になってるのでこれだけは聞く予定。
- LT
- 楽しみにしてるのは、「PHPでAIプログラミングコンテスト準優勝するまでの軌跡」と「良いことも悪いこともぜんぶPHPが教えてくれた」と「PHPNGの現状を知る」と「中年以降エンジニアの成長戦略」
以上。楽しみだ!
Laravel 5 はこう変わる! メソッドインジェクションとFormRequest編
注意!
このエントリは 2014/09/30 時点の情報です。これからどんどん変わっていく可能性があるので鵜呑みはダメ、絶対。
はじめに
11月にリリースされる Laravel5 の変更点を説明していきます。前回は
Laravel4 では存在しなかった FormRequest とメソッドインジェクションについて説明します。個人的には一番の目玉です。
メソッドインジェクション
Laravel4 にもあった Ioc コンテナは今までコンスタラクタインジェクションしかできませんでした。
<?php class HomeController extends Controller { /** * User * * @var \App\User */ private $user; /** * コンストラクタインジェクション */ public function __construct(User $user) { $this->user = $user; } }
Laravel5 ではメソッドインジェクションが可能になったのでこうかけるようになりました。
<?php class HomeController extends Controller { public function index(User $user) { // インジェクションされてる! dd($user); }
これは嬉しい変更ですね。助かります。
FormRequest
さて、メソッドインジェクションを踏まえて FormRequest の説明をします。FormRequest は既存の Request クラス(Laravel4 でいうところの Input + Request クラス)にValidationと認証機能(?)を足したものです。
まずは作ってみましょう。
php artisan make:request App\\Http\\Requests\\HomeRequest
ポイントは名前空間を \\ で区切ってやるのがポイントです。ここらへん以前は(3日前くらい)は名前空間を付ける必要がなかったのですが、現時点では必要です。もしかしたらいらなくなるかもしれません(Laracasts を収録した段階では必要なかった模様)。すると app/Http/Requests にこんな感じのファイルが出来上がります。
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class HomeRequest extends FormRequest { /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; } /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return false; } }
rules メソッドと authorize が実装されています。rules は Validaiton ルールを書く場所です。
<?php /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required', 'email' => 'required|email', 'password' => 'required|min:8', ]; }
こんな感じに書いて…コントローラーにインジェクションすると、Validation が自動に実行されます。Validation がうまく行かなかった時はデフォルトで前画面に戻ります。挙動を変えたい場合は FormRequest の redirect フィールドを定義してください。細かい挙動は Illuminate\Foundation\Http\FormRequest#getRedirectUrl を参照してください
<?php public function store(HomeRequest $request) { dd($request->all()); }
今までは Controller に書いたり Ardent のように Eloquent のメソッドをオーバーライドして Model 側で Validation を実行させたりしていましたが、この変更で決着をみたんじゃないかと思います。
Validaitonの必要がない場合は \Illuminate\Http\Request をインジェクションするのもありですね。
<?php public function store(Illuminate\Http\Request $request) { dd($request->all()); }
でも、これルートパラメータと相性悪いかもしれませんね。調査しきれていないので解決方法があるかもしれませんが。
で次の、authorize メソッドなんですが、これイマイチどう使えばいいかわかってません。 認証されたかどうかのチェックなら AuthFilter 使えばいいしなぁ…。一応説明するとこのメソッドで false を返すと 403 が返却されます。 true を返すと次の処理へ進みます。forbiddenResponse をオーバーライドすることで挙動を変えることができます。
終わりに
ちょっと長めになりましたが、Validation の手間が大幅に軽減されたのは嬉しい限りです。リリースが楽しみですね。
次回は新たに追加された ServiceProvider の話か、route:cache の話をしたいと思います。
Laravel 5 はこう変わる! ディレクトリ構造編
注意!
このエントリは 2014/09/30 時点の情報です。これからどんどん変わっていく可能性があるので鵜呑みはダメ、絶対。
はじめに
Laravel 5 は現在絶賛開発中で現行の 4.2.9 と比較するとかなり大きく変更されます。11月にリリース予定ですが、その前に先取りして主な変更点を何回かにわけてブログに書き残しておこうと思います。
一応 PHP カンファレンスが始まる前には書き終わりたいと思っていますが、我慢できない人は What's New in Laravel 5.0 のスクリーンキャストを見るとよくわかります。
Laravel5 のインストール
Composer でインストールできます。
composer create-project laravel/laravel forder-name dev-develop
ディレクトリ構造
かなり変わりました。軽く解説していきます。tree 構造はこちら。
root. ├── app │ ├── Console │ ├── Http │ │ ├── Controllers │ │ ├── Filters │ │ └── Requests │ └── Providers ├── bootstrap ├── config │ ├── local │ ├── packages │ └── testing ├── database │ ├── migrations │ └── seeds ├── public │ └── packages ├── resources │ ├── lang │ │ └── en │ └── views │ └── emails │ └── auth ├── storage │ ├── cache │ ├── logs │ ├── meta │ ├── sessions │ ├── views │ └── work ├── tests └── vendor
Laravel4 との対比はこんな感じ。
| Laravel4 | Laravel5 |
|---|---|
| app/commands | app/Console |
| app/config | config |
| app/controllers | app/Http/Controllers |
| app/database | database |
| app/lang | resources/lang |
| app/models | app |
| app/start | ない |
| app/storage | storage |
| app/tests | tests |
| app/views | resources/virews |
| app/filters.php | 廃止(app/Providers/FilterServiceProviderに定義) |
| app/routes.php | app/Http/routes.php |
| bootstrap | bootstrap |
| public | public |
大きな変更点として app 周りがガラッと変わっています。これ、ディレクトリ構造だけではなくて Laravel4 では 自作するController/Model/Command は名前空間の修飾を必要としませんでしたが*1 Laravel5 からは名前空間は必須となります。手数が増えるかわりに自由度が上がった感じでしょうか。個人的には歓迎しています。
個人的には Model が app の下にあるのがもにょりますが、自由に変更できるので、まぁいいかと。
Laravel で xhprof を手軽につかう

「推測するな。計測せよ」
と偉い人が言っていました。先人に倣って僕も頑張ろうと思います。…というのも自分が今作ってるアプリが特定の条件で極端に遅くなるという現象に遭遇したからですが。
というわけで Facebook 謹製*1 の xhprof を使ってみることにします。後継と言われている uprofiler はまだ HomeBrew ではインストールできなかったので。
PHP と xhprof のインストール
brew install php55 php55-mcrypt php55-xhprof
簡単ですね。mcrypt 入れてるのは Laravel で必要だからです。
xhprof_html/xhprof_lib を任意の場所にコピーする
mkdir $HOME/.xhprof
cp /usr/local/Cellar/php55-xhprof/{なんかユニークな文字列が入る}/xhprof_html $HOME/.xhprof/xhprof_html
cp /usr/local/Cellar/php55-xhprof/{なんかユニークな文字列が入る}/xhprof_lib $HOME/.xhprof/xhprof_lib
Laravel のコードに xhprof を仕込む
アプリケーションイベントを使うのが簡単でよいです。
<?php // app/start/global.php App::before(function() { // xhprof を有効にする xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); }); // shutdown App::shutdown(function() { // 計測する $xhprof_data = xhprof_disable(); $XHPROF_ROOT = '/Users/localdisk/.xhprof'; $APP_NAME = 'app_name'; require_once $XHPROF_ROOT . '/xhprof_lib/utils/xhprof_lib.php'; require_once $XHPROF_ROOT . '/xhprof_lib/utils/xhprof_runs.php'; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, $APP_NAME); // ログに xhprof 用の URL が出力されます Log::debug("http://localhost:8001/index.php?run={$run_id}&source={$APP_NAME}"); });
今回はタイトルにあるように手軽さを重視していますが、Laravel 的には Middleware を作って ServiceProvider に登録するのがよいと思います。設定も思いのままですし、アプリケーションのコードを修正する必要がなくなります。
あとは $HOME/.xhprof/xhprof_html をルートにしてPHPのビルトインサーバーを起動させておき、app/storage/logs/laravel.log に出力された URL にアクセスすればOKです。
最後に宣伝
明日 InnoCafe 開発コミュニティサミット in 福岡 - イノベーター・ジャパン | Doorkeeper という集まりがあります。東京と福岡のコミュニティについて面白い話が聞けるのでよかったら遊びに来てください。
翌日である 9/13 は ヌーラボさんのオフィスをお借りしてもくもく会をします。こちらもきっと楽しいと思いますのでよかったらどうぞ。
*1:だと思ってたけど違う人がメンテしてる?
CakePHPer のための Laravel 入門 - ブログチュートリアル2
CakePHPer のための Laravel 入門 - ブログチュートリアル1 - localdiskの続きです。
Postコントローラの作成
cake-to-laravel/app/controllers に 投稿記事(posts)に対するコントローラを作成します。
<?php class PostController extends BaseController { }
全てのコントローラーは BaseController クラスを拡張する必要があります*1。では、一つメソッドを作って呼び出してみましょう。
<?php class PostController extends BaseController { public function getIndex() { // URL を echo する echo Request::url(); } }
コントローラを呼び出すのにはルートの定義が必要です。cake-to-laravel/app/routes.phpを以下のように編集します。
<?php // コントローラを登録 Route::controller('posts', 'PostController');
では、http://localhost:8000/posts/indexをブラウザでアクセスしてみましょう。アクセスした URL が表示されるはずです。
次は前回作成したモデルを表示させてみましょう。コントローラを以下のように編集します。
<?php class PostController extends BaseController { public function getIndex() { return View::make('posts.index', ['posts' => Post::all()]); } }
Post ビューの作成
Post モデルの内容を表示するシンプルなビューを作りましょう。ビューの設置場所は cake-to-laravel/app/views になります。今回はそこに posts というフォルダを作ってその中に index.php というファイルを作りましょう。
<h1>Blog posts</h1> <table> <tr> <th>Id</th> <th>Title</th> <th>Created</th> </tr> <!-- ここから、$posts配列をループして、投稿記事の情報を表示 --> <?php foreach ($posts as $post): ?> <tr> <td><?php echo $post->id; ?></td> <td> <!-- link_to_action を使うと定義されていなければエラーになる --> <?php echo link_to("posts/view/{$post->id}", $post->title) ?> </td> <td><?php echo $post->created_at ?></td> </tr> <?php endforeach; ?> </table>
シンプルですよね。煩わしい配列がないところが特に。
ビューの中のリンク(投稿記事のタイトルから/posts/view/some_idというURLへのリンク)をクリックすると、Laravelは、そのアクションはまだ定義されていません、エラー画面を表示します。*2
では、エラーを撲滅するべく表示用のメソッドを実装しましょう。
<?php class PostController extends BaseController { public function getIndex() { return View::make('posts.index', ['posts' => Post::all()]); } public function getView($id) { // この状態だと $id が URL に付加されてない場合は ErrorException が発生する // $id あってもなくてもよい場合は getView($id = null) とすればよい // Model::findOrFail を使うとモデルが見つからなかった場合 // ModelNotFoundException を発生させる return View::make('posts.view', Post::findOrFail($id)); } }
記事の追加
続きはあとで。
CakePHPer のための Laravel 入門 - ブログチュートリアル1
CakePHPer のための Laravel 入門 - インストール - localdisk の続き。
さて、前回はインストール、環境の設定(localに設定しました)、拡張のインストールを行いました。今回はメインである CakePHP のブログチュートリアルを Laravel で実装してみましょう。
データベースの設定
まずは、cake-to-laravel/app/config/local/database.php を設定しましょう。前回触れましたが、Laravel は環境ごとの設定を容易に作成することができます。今回は local 環境のデータベースを SQLite を使用する設定を行います。たった一行追加するだけです。
<?php return array( 'default' => 'sqlite', // <- ここを追加! 'connections' => array( 'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'homestead', 'username' => 'homestead', 'password' => 'secret', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ), 'pgsql' => array( 'driver' => 'pgsql', 'host' => 'localhost', 'database' => 'homestead', 'username' => 'homestead', 'password' => 'secret', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ), ), );
これで local 環境は、SQLite を使用することになります。
マイグレーション
Laravel では、データベースのスキーマコントロールにマイグレーションを使用します。CakePHP でも同様のことができますがプラグインが必要です。まずはマイグレーションを使用できるようにするために以下のコマンドをターミナルから実行してください。
$ php artisan migrate:install
コマンドを実行したあと、以下のように表示されれば成功です。
Migration table created successfully.
テーブルの作成
マイグレーションの設定ができたら posts テーブルを作成しましょう。ターミナルで以下のコマンドを実行してください。
$ php artisan generate:migration create_posts_table
コマンド実行すると以下のように表示されます。
Created: /Users/localdisk/NetBeansProjects/cake-to-laravel/app/database/migrations/2014_08_03_061640_create_posts_table.php Generating optimized class loader
はい、作成できましたね。ではこのファイルを覗いてみましょう。
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function(Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('posts'); } }
ちゃんと出来ていますね。では、 up メソッドを修正しましょう。2行追加するだけです。
<?php class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function(Blueprint $table) { $table->increments('id'); $table->string('title', 50); // 追加 $table->text('body'); // 追加 $table->timestamps(); }); } }
修正したら、以下のコマンドを実行して posts テーブルを作成します。
$ php artisan migrate
コマンド実行すると以下のように表示されます。
Migrated: 2014_08_03_061640_create_posts_table
はい、これでテーブルができました。次はモデルを作成しましょう。
Post テーブルの作成
posts テーブルと対になる Post モデルを作成します。ターミナルで以下のコマンドを実行してください。
$ php artisan generate:model Post
コマンド実行すると以下のように表示されます。
Migrated: 2014_08_03_061640_create_posts_table
これで Post モデルが作成されました。
<?php class Post extends \Eloquent { protected $fillable = []; }
シード
作成した posts テーブルに表示用の初期値を設定します。
$ php artisan generate:seed posts
コマンド実行すると以下のように表示されます。
Created: /Users/localdisk/NetBeansProjects/cake-to-laravel/app/database/seeds/PostsTableSeeder.php
これで PostsTableSeeder.php が作成されました。では、内容を確認してみましょう。
<?php // Composer: "fzaninotto/faker": "v1.4.0" use Faker\Factory as Faker; class PostsTableSeeder extends Seeder { public function run() { $faker = Faker::create(); foreach (range(1, 10) as $index) { Post::create([ ]); } } }
生成されたファイルには Faker の記述がありますが、今回は使用しません。結構便利なライブラリなので、興味があるならぜひ使用してみてください。
では、ブログチュートリアルにそってデータを作成していきましょう。
<?php class PostsTableSeeder extends Seeder { public function run() { Post::create([ 'title' => 'タイトル', 'body' => 'これは、記事の本文です。' ]); Post::create([ 'title' => 'またタイトル', 'body' => 'そこに本文が続きます。' ]); Post::create([ 'title' => 'タイトルの逆襲', 'body' => 'こりゃ本当にわくわくする!うそ。' ]); } }
そして DatabaseSeeder.php を以下のように修正します。
<?php class DatabaseSeeder extends Seeder { /** * データベースシード(初期値設定)を実行 * * @return void */ public function run() { Eloquent::unguard(); // PostTableSeeder を実行する $this->call('PostsTableSeeder'); } }
では、db:seed コマンドを実行して初期値をテーブルに設定しましょう。
$ php artisan db:seed
コマンド実行すると以下のように表示されます。
Seeded: PostsTableSeeder
これでデータベースに初期値が設定されました。
続く!
CakePHPer のための Laravel 入門 - インストール
CakePHP のブログチュートリアルを Laravel で実装してみました。手順をなるだけ詳細に説明します。CakePHPer で Laravel に興味を持っている人に参考になれば幸い。
Laravel のインストール
laravelja.phar
Laravel のインストーラー phar ファイルをダウンロードします。
- @HiroKwsさんの作成したインストーラー日本語版をダウンロードします
- ターミナルで以下のコマンドを実行します。
$ php laravelja.phar new -l ja -s cake-to-laravel- すると
cake-to-laravelというディレクトリの下に Laravel がインストールされます。 - phar ファイルでのインストールは Composer のそれと比べて早いのと日本語化されたメッセージファイルがインストールされるのでおすすめ。
インストールされた Laravel は最新版ではない(4.2.1)ので composer update します。$ composer updateこれで 4.2.7 にバージョンアップされます (2014/08/02 現在)- 川瀬さんが対応してくれました!ブログ書いててよかった!
環境を設定する
Laravel も他のフレームワークと同じく手軽に複数の環境を扱うことができます(local / testing / staging / production) 。環境の設定は cake-to-laravel/bootstrap/start.php 内の $app->detectEnvironment で行います。デフォルトの環境は production です。環境はホスト名で決定します。 例外として* は全てに当てはまります。今回は local に設定します。cake-to-laravel/bootstrap/start.php を以下のように設定してください。
<?php $env = $app->detectEnvironment(array( 'production' => array('production.host'), // production のホスト名 'staging' => array('staging.host'), // ステージングのホスト名 'local' => array('*'), // それ以外はローカル ));
開発中は local に設定しておきましょう。
設定ファイルについて
Laravel の設定ファイルは app/config にあります。この下に環境名(今回の場合は local)の名前のついたディレクトリを作成し、オーバーライドしたい同名の設定ファイルを設置することによって、環境ごとの設定を行うことができます。
必須パッケージをインストールする
以下2つのパッケージをインストールします。
- Laravel4 Generators
- Laravel IDE Helper Generator
- IDE を使っていない人は必要ありません
composer.json を編集
cake-to-laravel の直下の composer.json を以下のように書き換えてください。コピペでOK。
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.2.*" }, "autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php" ] }, "require-dev": { "barryvdh/laravel-ide-helper": "1.*", "way/generators": "dev-master" }, "scripts": { "post-install-cmd": [ "php artisan clear-compiled", "php artisan optimize" ], "post-update-cmd": [ "php artisan clear-compiled", "php artisan ide-helper:generate", "php artisan optimize" ], "post-create-project-cmd": [ "php artisan key:generate" ] }, "config": { "preferred-install": "dist" }, "minimum-stability": "stable" }
app.php を編集
cake-to-laravel/app/config/app.php の providers の配列に以下を追加します。
<?php return array( 'providers' => array( ・・・ 'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', 'Way\Generators\GeneratorsServiceProvider', ), );
ファイルを編集したら $ composer update してください。
動作確認
では、Laravel の動作確認をしてみましょう。ターミナルで以下のコマンドを入力して下さい。
$ php artisan serve
すると
Laravel development server started on http://localhost:8000
とターミナルに表示されると思います。ブラウザから http://localhost:8000 にアクセスしてみてください。

上記画面が、ブラウザに表示されれば正常に処理されています。
続く!
Laravel で View を文字列で取得する
簡単。
<?php $viewStr = View::make('home')->render();
でOK.セクション毎にも取れる。
<?php $viewStr = View::make('home')->renderSections()['content'];
Laravel 4.2 Beta をインストールする
これが一番簡単だと思います。
$ git clone -b develop https://github.com/laravel/laravel.git laravel-beta $ cd laravel-beta $ composer install
変更点等は @HiroKws のツイートをチェックするべし。
注意点ですが、trait を使用しているため PHP5.4 以上になっているのでそこだけ気をつけてください。
追記
今現在開発しているアプリケーションを 4.2 にあげたい人は composer.json を修正しましょう。
{ "require": { "laravel/framework": "4.2.*" }, "minimum-stability": "dev" }
この2箇所を修正すればOKです。