2011年11月1日火曜日

Symfony2で機能拡張

この記事は訂正されました。Symfony2で機能拡張  訂正も御覧下さい。
symfony2で機能拡張はどうすれば良いのだろうか。
cakePHPで言うところのコンポーネント、ビヘイビア辺りをイメージしているのですがいまいち不明。

やっぱり日本symfonyユーザー会のsymfony2日本語ドキュメントを読む。
サービスコンテナを取り敢えず読んでみる。

ふむふむ。
  1. app/config/config.ymlにserviceを追加して
  2. コントローラーに $mailer = $this->get('my_mailer');って書く

...あれ?Mailerクラスはどこ書くの?

違うとこも読む。
セマンティック...
???Acme/HelloBundle/DependencyInjection/HelloExtension.phpをMailerとして書くの?

意味不明すぎる。英語が読めたらなぁ...


取り敢えず自力で頑張ってみる。
以下一応できたのでその結果。symfony2の規約として正しいかどうか不明。でも出来た。
#\src\Acme\PagesBundle\DependencyInjection\Carrier.php

namespace Acme\PagesBundle\DependencyInjection;

use Symfony\Component\HttpFoundation\Request;

class Carrier
{
}


#\src\Acme\PagesBundle\Controller\PagesContller.php

use Acme\PagesBundle\DependencyInjection\Carrier;
...
public function indexAction()
{
$carrier = new Carrier();
}


DependencyInjectionは依存性の注入って意味らしいです。なのでこの直下に作りたいクラスを書く。
コントローラーでuseで書いたクラスを呼び出せるように設定。new Carrier();でインスタンス生成。
って感じです。


これで良いのか不明。でも出来たし、よしとする。

1 件のコメント:

  1. 初めまして、Symfonyユーザー会のものです。

    まずドキュメントのサービスコンテナのページで説明しているMailerクラスの配置場所ですが、バンドルのディレクトリ直下に配置しているようですね。


    また、今回作られているようにコントローラ内で直接利用するライブラリクラスは、DependencyInjectionディレクトリではなくて、単純にバンドルディレクトリ直下や、Util、Request等ライブラリに合わせたディレクトリを作って配置すればOKです。


    DependencyInjectionはサービスコンテナの設定関連のファイルを置く場所なので、そういう機能が必要になるまでは、なにもいじらないと考えていただければよいかと思います。

    返信削除