Symfony好きの皆さんこんにちわ。ポリドッグです。
さて今日はPolidogLaravelBundleを作ったのでそれのご紹介をしたいと思います。
PolidogLaravelBundle
Symfonyのプロジェクトの中でLaravelのプロジェクトを扱うためのBundleです。
単純にSymfonyのコントローラの中でLaravelを実行しているだけです。
なぜ作ったのか?
僕はSymfonyを使って開発、嫁はLaravelを使って開発 な感じなので、家庭内の平和を守る ためにSymfonyからLaravelを動かせる仕組みを作りました。
ってのは冗談です。
僕はLaravelを触った事がなかったので、どうせ理解するのであれば大好きなSymfonyからLaravelを使えるようにして、Laravel自体のコードを読んだほうが学習できるかなぁと思ったので作りました。
あとZendFramework3をSymfonyで動かす記事「Migrating your project to Symfony」を読んで、これならLaravelもSymfony経由で動かす事が可能だと思い作ってみました。
使い方
使い方はシンプルです。手順にそって説明していきたいと思います。
- Laravelなプロジェクトを用意する
- Symfonyプロジェクトを用意する
- LaravelBundleをインストール
- 設定
- AppKernelへの登録
- Laravelのbootstrap/app.phpの場所を指定する
- Laravelのenvの設定をする
- ルーティング
- 実際に動かしてみる
Laravelなプロジェクトを用意する
僕はLaravel installerすら入っていなかったので、まずはインストーラーを入れるところから始めました。
|
|
次にlaravelコマンドでプロジェクトを作成します。
|
|
Symfonyプロジェクトを用意する
次に別ディレクトリにSymfonyプロジェクトを用意します。 Symfony Installerが入っていない場合は公式ドキュメントを参照してインストールしましょう。
今回はSymfony2.8を使います。
|
|
LaravelBundleのインストール
LaravelBundleもpackagistに登録してあるので、普通にcomposerインストールします。
|
|
これだけでインストール完了です。
設定
幾つか設定項目があります。設定していきましょう。
AppKernelへの登録
SymfonyではおなじみのAppKernelへの登録です。
|
|
Laravelのbootstrap/app.phpの場所を指定する
利用したいLaravelのプロジェクトのbootstrap/app.phpをconfig.ymlに記述します。
|
|
Laravelのenvの設定をする
Laravelでは環境ごとに依存する設定ファイルは.env
ファイルがありますが、composerでLaravelプロジェクトを管理する事も考慮してプロジェクト直下に.env
ファイルがあったとしても読み込んだりはしないようになっています。
必要なenvの設定情報はsymfonyのconfig.ymlに記述してください。
|
|
Symfonyでは環境依存する設定はparameters.ymlに記述するのが綺麗かと思います。
ルーティング
Symfonyのrouting.ymlの設定が必要です。
|
|
こんな感じにルーティングを設定してあげればすべてのリクエストがLaravelに送られます。
実際に動かしてみる
実際に動かしてみましょう。 まずはwebサーバを立ち上げます。
|
|
あとはブラウザでhttp://localhost:8000
にアクセスしてみましょう。
こんな感じに表示されるかと思います。
サンプル用意しました。
サンプル用意してあります。
polidog/laravel-bundle-example
うまく動かない人はこちらを参考にしてただければと思います。
Laravel本体のコードで気になった点
PolidogLaravelBundleを作っていて幾つかLaravelの実装で気になったというかイケてないと思う点がありました。
Kernel::handle()の引数について
Kernelインターフェースhandle()メソッドのDocコメントをみると引数にSymfonyのHttpFoundationのRequesetオブジェクトを渡せと書いてありました。 https://github.com/illuminate/contracts/blob/master/Http/Kernel.php
しかしここでHttpFoundationのRequestオブジェクトを渡してしまうとエラーになってしまいます。。
実際にimplementsしているIlluminate\Foundation\Http\Kernel
では\Illuminate\Http\Request
を引数にッて書いてあるんですよね。
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Foundation/Http/Kernel.php#L91
うーんこれだったらInterface側にもIlluminate\Http\Request
って記述してタイプヒントで縛ったほうがいいのではないかと思うんですが、どうなんですかね?
だれか理由を教えて下さい。。。
ApplicationがContainerである事
Applicationを見ておもったんですが、Application=Containerになってしまってるのがすごく違和感を感じます。 ここは分離したほうがいいんじゃないかなぁーと。
今後の対応
- Laravelのコマンドを使えるようにする
- Cache周りの確認と開放の対応
Laravelのコマンドを使えるようにする
使えたほうが便利なので・・・w
Cache周りの確認と開放の対応
Laravelのキャッシュの管理がどうなっているのか理解できていないのでなんとも言えませんが、とりあえずapp/console cache:clear
とかで開放するような仕組みはあってもいいかなぁーと思っています。
最後に
実際LaravelのApplication、Kernel周りのコードがある程度把握出来たので、そういった意味でも今回のLaravelBundleを作った価値があったかと思います。 ただやっぱりLaravelの抽象度が低い気がして、積極的に使う気にはなれませんけど・・・汗
とりあえず作ってしまったんでぜひぜひLaravelの人はこのBundleを使いながらSymfonyに触れてもらいたいです。
またSymfonyしか使ったに人もこのBundleを使いながらLaravelというフレームワークがどのようなものかを経験してもらえたらなと思います。
おしまい。