Home > Tags > symfony

symfony

symfony1.1以降で開発する際に必ず守ること箇条書き

  • schema.yml
    • カラム名には id、created_at、updated_at、created_by、updated_by を利用する
    • join して利用するテーブルには外部制約を必ず設定、テーブル名_id を利用する
    • database.yml、propel.ini の設定は symfony configure:database コマンドを使う
  • 命名規則
    • 変数、関数名は camelCase で
    • app.yml の変数名は snake_case で
    • コメントなしでもわかるような名前をつけて、わかりきったコメントは書かない
  • コーディングルール
    • type hinting を使う
    • if、for、foreach、switch 文の括弧は symfony 形式で
    • 比較文に ==、!= は絶対に使わない。===、!== を利用する。でも is_null とかはもっと使え
    • 文字列を連結する時はピリオドと文字列の間に半角スペース。(例)
      $text = 'text1' . 'text2' . 'text3'

    • php の定数は小文字で。(例)null、true、false など
    • コード内のコメントなどに全角スペースを使わない
    • 関数の return 値に空文字を使うなら null を使え
  • 全体
    • SQL 文を直接書かない、頑張って criteria で書く
    • 共通処理は親クラスを作成し、継承して利用する
    • クラスのプロパティは絶対に protected or private で
    • symfony の lib ディレクトリ以下を理解するとかなりレベルアップ
  • サーバ
    • utf-8 で統一
  • アクション
    • アクションにビジネスロジックを書かない
    • アクションに criteria を書かない
  • モデル
    • lib/model/om、map、lib/form/base の下はさわらない
    • DB まわりのビジネスロジックは lib/model/xxxPeer.php に書く
    • レコード単位の処理は lib/model/xxx.php に書く
    • doSelectRS() で取得したレコードセットは populateObjects() を使ってオブジェクトに変換すると楽
    • doSelectRs() で取得したレコードセットが 2 箇所以上から利用される場合は、レコードセットに合わせたモデルを作成し利用する
    • DB の定数は xxxPeer.php に宣言
    • 複数のモデルに共通の処理を挿入する場合は、sfPropelBehavior を利用する
  • フォーム
    • Form クラスを必ず使う
    • Form まわりのビジネスロジックは lib/form/xxx に書く
    • 親子関係のテーブルを Form で利用する時は embedForm を使う
    • input タグの name は xxx[xxx] の形式で書く。bind する時のロジックが短くなる。$this->widgetSchema->setNameFormat('xxx[%s]') を使う
    • sfUser を使いたい時は、sfContext::getInstance()->getUser() を利用する
  • バリデーター
    • 複数フィールドのバリデートには setPreValidator()、setPostValidator() を使う
  • テンプレート
    • テンプレートには if、for などの簡単な条件分岐以外で php を利用しない
    • layout 内で動的に切り替わる要素を使いたい場合は slot を利用する
    • form を利用している時はテンプレートに関するロジックは form で、form を利用しない時は、viewXxx.class.php を作成しコンストラクタでオブジェクトを渡してロジックは view クラス内に閉じ込める
  • routing.yml
    • get パラメーターのチェックは routing.yml で
  • エラー
    • 400、500、unavailable.php の 3 つが設定対象
  • 保留
    • (ある程度規模が大きくなると、lib/service/serviceXxx.class.php みたいな symfony  にできるだけ依存しないビジネスロジッククラスを作る案もありかも)
  • ヘッダーコメント
/**
* 概要
*
* @package    xxx
* @subpackage xxx
* @author     mei sei
* @copyright  (c) 2009 company_name inc.
* @version    SVN: $Id$
*/

↓↓↓は本屋で売ってる唯一の symfony 本。始めは買わなかったけど、結局買った本。ないよりは全然まし。

symfony徹底攻略 [PHP徹底攻略シリーズ] (PHP徹底攻略シリーズ)
前田 雅央

ソフトバンククリエイティブ

売り上げランキング: 208898

おすすめ度の平均: 2.0

2 Symfony1.2には未対応

4 2冊目に買うべき本

1 この本は酷い

1 誤植が・・・

動作するjobeetサイト

今まで jobeet の svn はあったけれど動作するサイトがないなあと思っていたら見つけました。ちょっとさわると、jobeet には symfony を使ったプレビュー画面がありました。いろいろ方法はあるけどこれという決定打がないのでプレビューの参考になるかもしれません。

http://www.jobeet.org/en/

symfonyでsqlを節約

doSelectJoinXXX()

っていう関数を使うと 2 つのテーブルを join した結果を SQL 1 本で取得できる。
この関数は schema.yml で外部参照を設定すると自動で生成される。

第18章 - パフォーマンス
続きを読む

symfonyでセッションを利用するときにやっといたほうがいいこと

ひとつは、セッション名の変更。

# apps/frontend/config/factories.yml
all:
  storage:
    class: sfSessionStorage
    param:
      session_name: my_cookie_name

もう一つは有効期限の設定。

# apps/frontend/config/settings.yml
all:
  user:
    class:       myUser
    param:
      timeout:   1800           # 秒単位のセッションの寿命

第6章 - コントローラレイヤーの内側

php のセキュリティをざっと理解するには↓↓

入門PHPセキュリティ
入門PHPセキュリティ
posted with amazlet at 09.02.24
クリス シフレット
オライリージャパン
売り上げランキング: 40453
おすすめ度の平均: 4.0

4 薄くて充実

symfony1.1でフロントと管理ツールの公開ディレクトリを切り替える方法

symfony の web ディレクトリはフロントとバックヤードで共通になってしまう。気持ち悪いので、切り替える方法を考えてみた。

まず以下のように backend ディレクトリを作成する。中身は web ディレクトリをそのままコピーする。


apps/
cache/
config/
data/
doc/
lib/
log/
plugins/
test/
web/
backend/  ← バックヤード用の公開ディレクトリを作成

次に、以下のように config/ProjectConfiguration.class.php の setup メソッドで公開ディレクトリを変更する。

# config/ProjectConfiguration.class.php
    [php]
    class ProjectConfiguration extends sfProjectConfiguration
    {
       public function setup()
       {
         $this->setWebDir($this->getRootDir().'/backend');
       }
    }

あとはドキュメントルートを backend に設定すれば、フロントとバックで別ディレクトリを利用できるはず。でも結局ドキュメントルートを切り替える必要がある。。

symfony×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 3)
森川 穣 亀本 大地 田中 正裕
技術評論社
売り上げランキング: 62157
おすすめ度の平均: 3.0

1 情報弱者向けの本
5 エッセンスがよくまとまっている

symfony1.1+oracle用のパッチファイル

symfony1.1 + oracle で propel:build-all を実行すると、propel:insert-sql でエラーが発生する。原因は、生成された SQL 内(data/sql/lib.model.schema.sql)のコメントがオラクルのコメントになっていないことと、テーブル名とカラム名がダブルコーテーションで囲まれていることです。

毎回 sql を修正しているわけにもいかないのでパッチを作って対応しました。
これで propel:build-all-load frontend みたいなコマンドもするっと実行できます。

symfony徹底攻略 [PHP徹底攻略シリーズ] (PHP徹底攻略シリーズ)
前田 雅央
ソフトバンククリエイティブ
売り上げランキング: 166284
おすすめ度の平均: 2.0

4 2冊目に買うべき本
1 この本は酷い
1 誤植が・・・

symfonyでモバイル開発する際に参考になるだろうリンク

モバイル開発@symfony :: handsOut.jp がかなり良い感じ。以下コードを引用してみる。

apps/app_name/config/filters.yml

rendering: ~
web_debug: ~
security: ~
# generally, you will want to insert your own filters here
mobile:
  class: myMobileFilter
cache: ~
common: ~
flash: ~
execution:  

apps/app_name/config/autoload.yml

autoload:
  PEAR:
    name: PEAR
    files:
      Net_UserAgent_Mobile: /path/to/Net/UserAgent/Mobile.php

myMobileFilter.class.php (抜粋)

public function execute($filterChain) {
  // preFilter
  $request = $this­->getContext()­->getRequest();
  $response = $this­->getContext()­->getResponse();
  if ($this­->isFirstCall()) {
    $agent = @Net_UserAgent_Mobile::singleton();
    switch (true) {
      case $agent­->isDoCoMo():
        $carrier = 'docomo';
        $response­->setContentType('application/xhtml+xml; charset=Shift_JIS'); // 出力ヘッダを指定
        $response->addStylesheet('/path/to/docomo.css')// キャリア別のスタイルシートを指定
        break;
      case $agent­->isEzweb():
        $carrier = 'ezweb';
        $response->addStylesheet('/path/to/ezweb.css')// キャリア別のスタイルシートを指定
        // 中略
    }
    $request­->setAttribute('agent', $agent);
    $request­->setAttribute('carrier', $carrier);
    // sfPictogramMobilePlugin
    $pictogram = sfPictogramMobile::factory($carrier, 'utf­8');
    $request­->setAttribute('pictogram', $pictogram);
  }
 
  $filterChain-­>execute();
 
  // postFilter
  $content = $response­->getContent();
  $content = $request­->getAttribute('pictogram')­->replace($content);
  // 出力前に CSS をインライン展開
  if ($request­->getAttribute('carrier') == 'docomo') {
    $content = HTML_CSS_Mobile::getInstance()­->setBaseDir('/path/to/doc_root')­->apply($content);
  }
  $response­->setContent($content);
}

apps/app_name/templates/layout.php (抜粋)

<? include_partial('global/dtd'); ?>
<html xmlns="http://www.w3.org/1999 /xhtml" xml:lang="ja" lang="ja">
<head>

apps/app_name/templates/_dtd.php

<?php switch (sfContext::getInstance()­>getRequest()­>getAttribute('carrier')): ?>
<?php case 'docomo': ?><?php echo '<'; ?>?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE html PUBLIC "­//i­mode group (ja)//DTD XHTML i­XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i­xhtml_4ja_10.dtd">
<?php break; ?>
<?php case 'ezweb': ?>
<?php echo '<'; ?>?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE html PUBLIC "­//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml­basic.dtd">
// 以下略

他にも helper を使って、mailto や input 要素の問題などを吸収する方法や、モバイルのセッションを、SessionStorage を使って解決する方法が書いてある。

以下のファイルを作成、編集
apps/app_name/lib/helper/MobileHelper.php
apps/app_name/lib/myMobileFrontController.class.php
apps/app_name/lib/myMobileSessionStorage.class.php
apps/app_name/config/factories.yml

memokami::楽天テクノロジーカンファレンス「PHPで作る携帯サイト」 :: handsOut.jp もすごくいい感じ。

symfony1.2でバッチ処理を作るにはどうすればいいの?

symfony1.2 では generate:task コマンドが用意されているのでそれを利用します。

  1. まず、ジェネレートコマンドでひな形を作る
  2. ジェネレートコマンドを実行すると、

    % ./symfony generate:task foo:sample

    fooSampleTask.class.php というファイルが作成される

    // lib/task/fooSampleTask.class.php
    <?php

    class fooSampleTask extends sfBaseTask
    {
      protected function configure()
      {
        // // add your own arguments here
        // $this->addArguments(array(
        //   new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
        // ));

        $this->addOptions(array(
          new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'),
          new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
          new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
          // add your own options here
        ));

        $this->namespace        = 'foo';
        $this->name             = 'sample';
        $this->briefDescription = '';
        $this->detailedDescription = <<<EOF
    The [foo:sample|INFO] task does things.
    Call it with:

      [php symfony foo:sample|INFO]
    EOF;
      }

      protected function execute($arguments = array(), $options = array())
      {
        // initialize the database connection
        $databaseManager = new sfDatabaseManager($this->configuration);
        $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();

        // add your code here
      }
    }

  3. execute 関数をカスタマイズする
  4. 『add your code here』の下に実際の処理を記述していきます。

    protected function execute($arguments = array(), $options = array())
      {
        // initialize the database connection
        $databaseManager = new sfDatabaseManager($this->configuration);
        $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();
       
        // DB アクセスも普通に使える
        $obj = BookPeer::retrieveByPK(3);
        var_dump($obj);
       
        // ログも便利
        $this->log('処理終了');
      }

  5. バッチ処理を実行する
  6. % ./symfony foo:sample

  7. 引数を使いたいとき
  8. protected function configure()
      {
        // // add your own arguments here
        $this->addArguments(array(
          new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
        ));

    configure 関数の先頭のコメントを外すと my_arg 引数が有効になり、execute 関数の引数 $arguments['my_arg'] で利用できるようになります。

    % ./symfony foo:sample aaa
    // print_r($arguments);
    Array
    (
        [task] => foo:sample
        [my_arg] => aaa
    )

  9. 他にも
  10. symfony/task/project とか
    symfony/task/generator とか

    symfony のライブラリー内のタスクにサンプルになりそうなファイルがあるので参考にしてください。

    参考
    第16章 - アプリケーションの運用ツール

symfony のデプロイ方法をためしてみる – jobeet23日目

本番アップはいつも FTP でやっているのですが、capistrano とかある程度ツールを使って自動化したいなと前から思っていました。今ちょうど symfony をやっているので symfony のデプロイ方法を試してみました。

  1. 本番環境チェック
  2. 実行すると、OK とか Warinig とか表示されるので必要に応じて対応します。APC のインストールとか。これは便利。

    wget http://trac.symfony-project.org/browser/branches/1.2/data/bin/check_configuration.php?format=raw check_configuration.php
    php check_configuration.php

  3. コアライブラリへのパスを本番に合わせる
  4. // config/ProjectConfiguration.class.php
    require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

  5. データベースを本番の設定に
  6. $ php symfony configure:database "mysql:host=localhost;dbname=prod_dbname" prod_user prod_pass

  7. シンボリックリンクなどがあれば固定化する
  8. $ php symfony plugin:publish-assets

  9. エラーページを設定する
  10. プロジェクトの転送
  11. 本番環境の情報を設定する

    # config/properties.ini
    [production]
      host=www.symfony-project.com
      port=22
      user=jobeet
      dir=/var/www/jobeet/
      type=rsync
      pass=

    転送したくないファイルがあれば設定する

    # config/rsync_exclude.txt
    .svn
    /web/uploads/*
    /cache/*
    /log/*
    /web/*_dev.php

    プレビュー

    $ php symfony project:deploy production

    実際に転送する。rsync が実行される

    $ php symfony project:deploy production --go

  12. 終了。あとこの方法だとサーバ上の不要になったファイルを削除してくれないのでそこは考える必要あり。

やっぱり rsync は楽ですね、どのファイルをアップするかとか考えなくてよくて、コマンド一発でデプロイが完了します。注意しないといけないのが設定ファイルを開発用のまま転送すると本番環境が動かなくなることです。この問題も本番反映用のシェルファイルを作れば解決しそうです。

参考
symfony | Web PHP Framework | The Jobeet Tutorial | Day 23: The Deployment
第16章 - アプリケーションの運用ツール
秋元@ずっと雪 » Windows+symfony1.1でproject:deployを動かすためのパッチ

phpフレームワークsymfonyをdreamhostへインストールする方法

dreamhost へ symfony をインストールしようと試みました。

  1. symfony をインストール
  2. symfony 本家から tar.gz のアーカイブを wget で取得して解凍します。

    % cd ~
    % mkdir -p symfony/vendor
    % cd symfony/vendor
    % wget http://www.symfony-project.org/get/symfony-1.2.2.tgz
    % tar zxvf symfony-1.2.2.tgz

  3. symfony のバージョンを確認(エラーが発生)
  4. % cd ~/symfony/
    % vendor/symfony-1.2.2/data/bin/symfony -V
    Parse error: syntax error, unexpected T_OBJECT_OPERATOR in

  5. エラーの原因を調査する
  6. dreamhost の wiki を検索すると、symfony についてのページがあるので参考にする。(dreamhost で困ったらとりあえず wiki で検索する。)
    原因はパスの設定のようなので対応

    % export PATH=/usr/local/php5/bin:${PATH}

    これで正常に動く

    % vendor/symfony-1.2.2/data/bin/symfony -V
    symfony version 1.2.2

ホーム > タグ > symfony

ぴくちゃー
ブログパーツ

ページの上部に戻る