Symfony2でバンドルを作成する

バンドルの作成

いろいろ難しいSymfony2ですがチュートリアルはここにあります。
むかしはapp/consoleだと思っていたんですが、bin/consoleになったような気がする。

$  php bin/console generate:bundle --namespace=Leaning\TemplateBundle --format=yml

例によってダイアログでいろいろ聞かれますが、全部エンターのみ押していけばOK。

  Welcome to the Symfony bundle generator!


Are you planning on sharing this bundle across multiple applications? [no]:

Your application code must be written in bundles. This command helps
you generate them easily.

Give your bundle a descriptive name, like BlogBundle.
Bundle name [LeaningTemplateBundle]:

Bundles are usually generated into the src/ directory. Unless you're
doing something custom, hit enter to keep this default!

Target Directory [src/]:

What format do you want to use for your generated configuration?

Configuration format (annotation, yml, xml, php) [yml]:


  Bundle generation


> Generating a sample bundle skeleton into app/../src/LeaningTemplateBundle
  created ./app/../src/LeaningTemplateBundle/

  created ./app/../src/LeaningTemplateBundle/LeaningTemplateBundle.php
  created ./app/../src/LeaningTemplateBundle/Controller/
  created ./app/../src/LeaningTemplateBundle/Controller/DefaultController.php
  created ./app/../tests/LeaningTemplateBundle/Controller/
  created ./app/../tests/LeaningTemplateBundle/Controller/DefaultControllerTest.php
  created ./app/../src/LeaningTemplateBundle/Resources/views/Default/
  created ./app/../src/LeaningTemplateBundle/Resources/views/Default/index.html.twig
  created ./app/../src/LeaningTemplateBundle/Resources/config/
  created ./app/../src/LeaningTemplateBundle/Resources/config/services.yml
  created ./app/../src/LeaningTemplateBundle/Resources/config/routing.yml
> Checking that the bundle is autoloaded
> Enabling the bundle inside app/AppKernel.php
  updated ./app/AppKernel.php
> Importing the bundle's routes from the app/config/routing.yml file
  updated ./app/config/routing.yml
> Importing the bundle's services.yml from the app/config/config.yml file
  updated ./app/config/config.yml


  Everything is OK! Now get to work :).

app/src以下に新しい「LeaningTemplateBundle」というのが作成されます。このバンドルはapp/AppKernel.phpとapp/config/routing.ymlにも自動的に書き込まれます。削除の際はこれらのファイルの行も消さないと気持ちが悪いことになるのでご注意。

app/src/LeaningTemplateBundle/
app/AppKernel.php
app/config/routing.yml

もし間違ってバンドルを作成してしまったりもう用のないバンドルを削除する際には最後にキャッシュも削除しないと駄目です。

$ php bin/console cache:clear --no-warmup

ページを作成する

巨大なシステムを作成するのは得意なSymfony2ですが、1ページ作成するだけでどんだけ時間かかるんだって感じです。みんなよくいいますがSymfonyの開発は出だしがほんとに鈍いです。しかしいろいろなコードを書いて使いまわしてゆくうちにいろいろと使いまわせるようになり、全体としてまとまってくるというわけです。
で、やること。

  • Routing
  • Controller
  • Twig

Symfony2のコンセプトにあるように「リクエストしてレスポンスするだけ」ということなので、まずはルーティングでもってリクエストのパスを設定します。パス(URI)を受け取ったアプリケーションはパスから処理を開始します。処理を行うところがコントローラになります。諸々処理を終えるとTwigに所定の値を渡して無事HTMLレンダリング。これがレスポンスとなってページを表示するという仕組みです。

ルーティング

まずは、app/config/routing.ymlに新しく追加したバンドルの情報が書かれているのがわかります。LeaningTemplateBundleというものを作ったので、このバンドルが読み込むルーティングの情報はどのファイルなのかを指し示しています。これはバンドル作成時に自動的に追記されるので特に意識しなくてよいと思います。

leaning_template:
    resource: "@LeaningTemplateBundle/Resources/config/routing.yml"
    prefix:   /

で、その指し示しているsrc/LeaningTemplateBundle/Resources/config/routing.ymlを開きます。こちらも半ば自動的に追記されるのですが、ここでは独自のパスとそのパス(リクエスト)が処理するコントローラと関数(メソッド)の所在が書かれています。ここでは/にアクセスがあったときにLeaningTemplateBundleバンドルのDefaultController.phpが指名されて、さらにindexAction()を実行しなさいという感じになっています。

leaning_template_homepage:
    path:     /
    defaults: { _controller: LeaningTemplateBundle:Default:index }

leaning_template_homepage:という箇所はルーティング名と呼ばれていて任意の名前をつけることができます。プロジェクトによってわかりやすい名前をつけるのがよいかと思います。
ルーティング名はTwigでパスを書き出す際に使います。

// LeaningTemplateBundle/Resources/view/index.html.twig
{ path('leaning_template_homepage') }}

このパスで書き出されるのは、開発環境では「/app_dev.php/」、本番環境では「/」になります。

Last update: 2017.01.22 (日)