Featured image of post PolidogLaravelBundleを作った

PolidogLaravelBundleを作った

Twitter ツイート Hatena Bookmark ブックマーク

Symfony好きの皆さんこんにちわ。ポリドッグです。

さて今日はPolidogLaravelBundleを作ったのでそれのご紹介をしたいと思います。

PolidogLaravelBundle

polidog/LaravelBundle

Symfonyのプロジェクトの中でLaravelのプロジェクトを扱うためのBundleです。
単純にSymfonyのコントローラの中でLaravelを実行しているだけです。

なぜ作ったのか?

僕はSymfonyを使って開発、嫁はLaravelを使って開発 な感じなので、家庭内の平和を守る ためにSymfonyからLaravelを動かせる仕組みを作りました。

ってのは冗談です。

僕はLaravelを触った事がなかったので、どうせ理解するのであれば大好きなSymfonyからLaravelを使えるようにして、Laravel自体のコードを読んだほうが学習できるかなぁと思ったので作りました。

あとZendFramework3をSymfonyで動かす記事「Migrating your project to Symfony」を読んで、これならLaravelもSymfony経由で動かす事が可能だと思い作ってみました。

使い方

使い方はシンプルです。手順にそって説明していきたいと思います。

  1. Laravelなプロジェクトを用意する
  2. Symfonyプロジェクトを用意する
  3. LaravelBundleをインストール
  4. 設定  
  5. AppKernelへの登録
  6. Laravelのbootstrap/app.phpの場所を指定する
  7. Laravelのenvの設定をする
  8. ルーティング
  9. 実際に動かしてみる

Laravelなプロジェクトを用意する

僕はLaravel installerすら入っていなかったので、まずはインストーラーを入れるところから始めました。

1
$ composer global require "laravel/installer"

次にlaravelコマンドでプロジェクトを作成します。

1
2
$ cd ~/php
$ laravel new laravel-project

Symfonyプロジェクトを用意する

次に別ディレクトリにSymfonyプロジェクトを用意します。 Symfony Installerが入っていない場合は公式ドキュメントを参照してインストールしましょう。

今回はSymfony2.8を使います。

1
2
$ cd ~/php
$ symfony new laravel-symfony-example 2.8

LaravelBundleのインストール

LaravelBundleもpackagistに登録してあるので、普通にcomposerインストールします。

1
2
$ cd laravel-symfony-example
$ composer require polidog/laravel-bundle

これだけでインストール完了です。

設定

幾つか設定項目があります。設定していきましょう。

AppKernelへの登録

SymfonyではおなじみのAppKernelへの登録です。

1
2
3
4
5
6
$ vim app/AppKernel.php

        $bundles = array(
...
            new Polidog\LaravelBundle\PolidogLaravelBundle()
        );

Laravelのbootstrap/app.phpの場所を指定する

利用したいLaravelのプロジェクトのbootstrap/app.phpをconfig.ymlに記述します。

1
2
3
4
$ vim app/config/config.yml

polidog_laravel:
        bootstrap_file:  /path/to/laravel-project/bootstrap/app.php

Laravelのenvの設定をする

Laravelでは環境ごとに依存する設定ファイルは.envファイルがありますが、composerでLaravelプロジェクトを管理する事も考慮してプロジェクト直下に.envファイルがあったとしても読み込んだりはしないようになっています。 必要なenvの設定情報はsymfonyのconfig.ymlに記述してください。

1
2
3
4
5
6
7
$ vim app/config/config.yml

polidog_laravel:
        bootstrap_file:  /path/to/laravel-project/bootstrap/app.php
        env:
                APP_DEBUG: true
                APP_KEY: your app key

Symfonyでは環境依存する設定はparameters.ymlに記述するのが綺麗かと思います。

ルーティング

Symfonyのrouting.ymlの設定が必要です。

1
2
3
4
5
fallback:
    path: /{path}
    defaults: { _controller: "polidog_laravel.controller.fallback:fallback" }
    requirements:
        path: .*

こんな感じにルーティングを設定してあげればすべてのリクエストがLaravelに送られます。

実際に動かしてみる

実際に動かしてみましょう。 まずはwebサーバを立ち上げます。

1
$ app/console server:start

あとはブラウザで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というフレームワークがどのようなものかを経験してもらえたらなと思います。

おしまい。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。