kopug memo

名古屋で働くとあるWebエンジニアの覚書。

symfony で普段使っているpluginをまとめてみた

この記事はSymfonyアドベントカレンダー2010の19日目です


1. sfWebBrowserPlugin - RESTful APIを利用するならお手の物。HTTP通信なら完全お任せ!

READMEを見ると利用方法が事細かに書かれているので非常に分かりやすいですね。
このpluginでは 3種類のインターフェイスをアダプターという形で用意しています。

  • sfCurlAdapter
  • sfFopenAdapter
  • sfSocketsAdapter

どれを利用しても良いのですが、Forward Proxy経由でHTTPリクエストを送りたい事があるため、sfCurlAdapterを利用しています。

(例)

<?php

$b = new sfWebBrowser(array(), 
      'sfCurlAdapter',
      array('httpproxytunnel' => 1,
            'proxy' => 'http://proxy.example.com:8080',
            'proxyport' => '8080',
           )
      ); 

クラウド環境を利用していて、webサーバがオートスケールで増えてくれるのはいいけれども、振られるグローバルIPが何になるのか分からない場合などに使えますね!
※1. IPアドレスでの通信制限が無い場合は、気にする必要はないです。
※2. ロードバランサーがNATしてくれている場合は、気にしなくてもOK

2. sfDoctrineMasterSlavePlugin - DBのReplicationをするならまずこれでしょう!

Symfonyアドベントカレンダー2010の12日目vectorxenonさんがsfDoctrineMasterSlavePluginの事を書かれております。

このpluginで何が1番嬉しかったかというと、マスターの分散が出来ることです。

   # databases.yml 
   all:
      # db1 connections
      db1_master:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db1;host:db1-master.example.com
          username: root
          password: ~
          group:    db1
      db1_slave:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db1;host:db1-slave.example.com
          username: root
          password: ~
          group:    db1

      # db2 connections
      db2_master:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db2;host:db2-master.example.com
          username: root
          password: ~
          group:    db2
      db2_slave:
        class: sfDoctrineDatabase
        param:
          dsn:      mysql:dbname=db2;host:db2-slave.example.com
          username: root
          password: ~
          group:    db2

selectの負荷はSlaveサーバを増やすことによって解決できますが、
更新系処理が多くなってくる場合、それでは対応できません。
上記のようにMaster and Slaveサーバのグループを用意し、schema.ymlで対応するconnectionを指定すればOKです。

# schema.yml
User:
  connection:db1
  columns:
    name: { type: string(255), notnull: true }
LegacyUser:
  connection:db2
  columns:
    name: { type: string(255), notnull: true }

3. sfAdminDashPlugin - 手軽にシャレオツ管理画面を提供したい場合に!

README に設定方法が書かれていますが、id:ken39argさんがsfAdminDashPluginがかなりいい件についてという記事で、ハマりどころも合わせて書かれています。

WEBサービスを作る上で管理画面って結構後回しにされがちですが、このpluginで手軽にシャレオツな管理画面が作れるので重宝しています。

4. sfTaskExtraPlugin - pluginを簡単に作るためのplugin

symfonyで幾つかProjectの開発をしていくと、必ずProject間で共通で利用したいコードが出てくると思います。
その時にplugin化をしたくなるのですが、pluginを開発する上で簡単で手軽にテストコードも準備できる枠組みを提供してくれるのがsfTaskExtraPluginです!

まずインストール
$ symfony plugin:install sfTaskExtraPlugin

これでREADMEに書かれているタスクを利用する事ができるようになりますが、特によく使うのは以下です。

  • generate:plugin: pluginのスケルトンを吐き出す
  • generate:plugin-module: モジュールを含むpluginのスケルトンを吐き出す
  • plugin:package: 作成したpluginをPEARパッケージにしてくれます

symfony の pluginはPEARパッケージで管理しているので、これを使うといちいちpaclage.xmlを作成する必要がなくなります。
まぁそれも便利なのですが、一番素晴らしいのがTDDでの開発がすごくしやすくなることです。

実際にmyPluginを作成してみます。

$ symfony generate:plugin myPlugin

これだけで以下のスケルトンができます。

plugins/myPlugin
|-- LICENSE
|-- README
|-- config
|   `-- myPluginConfiguration.class.php
|-- lib
|-- package.xml.tmpl
`-- test
    |-- bin
    |   `-- prove.php
    |-- bootstrap
    |   |-- functional.php
    |   `-- unit.php
    |-- fixtures
    |   `-- project
    |       |-- apps
    |       |   `-- frontend
    |       |       |-- config
    |       |       |   |-- app.yml
    |       |       |   |-- cache.yml
    |       |       |   |-- factories.yml
    |       |       |   |-- filters.yml
    |       |       |   |-- frontendConfiguration.class.php
    |       |       |   |-- routing.yml
    |       |       |   |-- security.yml
    |       |       |   |-- settings.yml
    |       |       |   `-- view.yml
    |       |       |-- i18n
    |       |       |-- lib
    |       |       |   `-- myUser.class.php
    |       |       |-- modules
    |       |       `-- templates
    |       |           `-- layout.php
    |       |-- cache
    |       |-- config
    |       |   |-- ProjectConfiguration.class.php
    |       |   |-- properties.ini
    |       |   `-- rsync_exclude.txt
    |       |-- data
    |       |   `-- fixtures
    |       |       `-- fixtures.yml
    |       |-- lib
    |       |   `-- form
    |       |       `-- BaseForm.class.php
    |       |-- log
    |       |-- plugins
    |       |-- symfony
    |       |-- test
    |       |   |-- bootstrap
    |       |   |   |-- functional.php
    |       |   |   `-- unit.php
    |       |   |-- functional
    |       |   `-- unit
    |       `-- web
    |           |-- css
    |           |   `-- main.css
    |           |-- images
    |           |-- js
    |           |-- robots.txt
    |           `-- uploads
    |               `-- assets
    |-- functional
    `-- unit

上記を見てわかるとおり、殆どがテストのためのディレクトリ、ファイルになります。
※ plugin:packageをすると上記のテストディレクトリは除外されてパッケージされます。

テストコードの書き方は以下のドキュメントに詳しく書かれていますので、これでいつでもplugin開発ができますね!

5. sfMobileJPlugin - ガラケー対応サイトを作るのなら・・

手前味噌で恐縮ですが、仕事柄ガラケーのサイトを開発することがあるので、ガラケーに特化したpluginを公開しております。
使い方はREADMEにも書いていますが、簡単にご紹介すると、現在公開しているバージョンで出来ることは以下の2つです。

  • 通常のテンプレートとガラケー共通テンプレートを分けることが可能
    • 国内3大キャリア(DoCoMo/SoftBank/au)別のテンプレートでも分けること可能(auだけテンプレート別にするとか)
  • 個体識別番(imodeID, UID and EZ番号)の制御
    • ページ全体、個別でUIDの通知条件の必須を選択することが可能

はい。それだけです。(ぉぃ)
一応それ以外にも細かなUtil classもあったりしますが、backendではNet_UserAgent_Mobileを使用しているので、端末の情報取得系はそちらが使えます。

現在公開準備中ではありますが、絵文字処理、携帯メール処理も上記pluginに含めれるようにコツコツと開発をしております。(^_^;

最後に

ここ一年くらいはサーバエンジニア系の仕事ばかりしていたので、中々コードを書く時間が無かったのですが、2011年はSymfony2ともっと一緒に遊びたいと思ってます!
それではまたよろしくお願い致します。


Symfony Advent 2010では12月1日から12月24日までを使って日替わりでsymfonyでイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にして公開していくイベントです。