Home > Tags > symfony
symfony
symfony1.1以降で開発する際に必ず守ること箇条書き
- 2009/03/21
- Web開発関連
- 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 本。始めは買わなかったけど、結局買った本。ないよりは全然まし。
ソフトバンククリエイティブ
売り上げランキング: 208898

Symfony1.2には未対応
2冊目に買うべき本
この本は酷い
誤植が・・・
動作するjobeetサイト
- 2009/03/19
- Web開発関連
今まで jobeet の svn はあったけれど動作するサイトがないなあと思っていたら見つけました。ちょっとさわると、jobeet には symfony を使ったプレビュー画面がありました。いろいろ方法はあるけどこれという決定打がないのでプレビューの参考になるかもしれません。
symfonyでsqlを節約
- 2009/02/25
- Web開発関連
doSelectJoinXXX()
っていう関数を使うと 2 つのテーブルを join した結果を SQL 1 本で取得できる。
この関数は schema.yml で外部参照を設定すると自動で生成される。
symfonyでセッションを利用するときにやっといたほうがいいこと
- 2009/02/24
- Web開発関連
ひとつは、セッション名の変更。
all:
storage:
class: sfSessionStorage
param:
session_name: my_cookie_name
もう一つは有効期限の設定。
all:
user:
class: myUser
param:
timeout: 1800 # 秒単位のセッションの寿命
php のセキュリティをざっと理解するには↓↓
symfony1.1でフロントと管理ツールの公開ディレクトリを切り替える方法
symfony の web ディレクトリはフロントとバックヤードで共通になってしまう。気持ち悪いので、切り替える方法を考えてみた。
まず以下のように backend ディレクトリを作成する。中身は web ディレクトリをそのままコピーする。
apps/
cache/
config/
data/
doc/
lib/
log/
plugins/
test/
web/
backend/ ← バックヤード用の公開ディレクトリを作成
次に、以下のように config/ProjectConfiguration.class.php の setup メソッドで公開ディレクトリを変更する。
[php]
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
$this->setWebDir($this->getRootDir().'/backend');
}
}
あとはドキュメントルートを backend に設定すれば、フロントとバックで別ディレクトリを利用できるはず。でも結局ドキュメントルートを切り替える必要がある。。
技術評論社
売り上げランキング: 62157

情報弱者向けの本
エッセンスがよくまとまっている
symfony1.1+oracle用のパッチファイル
- 2009/02/19
- Web開発関連
symfony1.1 + oracle で propel:build-all を実行すると、propel:insert-sql でエラーが発生する。原因は、生成された SQL 内(data/sql/lib.model.schema.sql)のコメントがオラクルのコメントになっていないことと、テーブル名とカラム名がダブルコーテーションで囲まれていることです。
毎回 sql を修正しているわけにもいかないのでパッチを作って対応しました。
これで propel:build-all-load frontend みたいなコマンドもするっと実行できます。
ソフトバンククリエイティブ
売り上げランキング: 166284

2冊目に買うべき本
この本は酷い
誤植が・・・
symfonyでモバイル開発する際に参考になるだろうリンク
- 2009/02/08
- Web開発関連
モバイル開発@symfony :: handsOut.jp がかなり良い感じ。以下コードを引用してみる。
apps/app_name/config/filters.yml
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
PEAR:
name: PEAR
files:
Net_UserAgent_Mobile: /path/to/Net/UserAgent/Mobile.php
myMobileFilter.class.php (抜粋)
// 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, 'utf8');
$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 (抜粋)
<html xmlns="http://www.w3.org/1999 /xhtml" xml:lang="ja" lang="ja">
<head>
apps/app_name/templates/_dtd.php
<?php case 'docomo': ?><?php echo '<'; ?>?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE html PUBLIC "//imode group (ja)//DTD XHTML iXHTML(Locale/Ver.=ja/1.1) 1.0//EN" "ixhtml_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/xhtmlbasic.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でバッチ処理を作るにはどうすればいいの?
- 2009/01/14
- Web開発関連
symfony1.2 では generate:task コマンドが用意されているのでそれを利用します。
- まず、ジェネレートコマンドでひな形を作る
- execute 関数をカスタマイズする
- バッチ処理を実行する
- 引数を使いたいとき
- 他にも
ジェネレートコマンドを実行すると、
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
}
}
『add your code here』の下に実際の処理を記述していきます。
{
// 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('処理終了');
}
{
// // add your own arguments here
$this->addArguments(array(
new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
));
configure 関数の先頭のコメントを外すと my_arg 引数が有効になり、execute 関数の引数 $arguments['my_arg'] で利用できるようになります。
symfony/task/project とか
symfony/task/generator とか
symfony のライブラリー内のタスクにサンプルになりそうなファイルがあるので参考にしてください。
symfony のデプロイ方法をためしてみる – jobeet23日目
- 2009/01/12
- Web開発関連
本番アップはいつも FTP でやっているのですが、capistrano とかある程度ツールを使って自動化したいなと前から思っていました。今ちょうど symfony をやっているので symfony のデプロイ方法を試してみました。
- 本番環境チェック
- コアライブラリへのパスを本番に合わせる
- データベースを本番の設定に
- シンボリックリンクなどがあれば固定化する
- エラーページを設定する
- プロジェクトの転送
- 終了。あとこの方法だとサーバ上の不要になったファイルを削除してくれないのでそこは考える必要あり。
実行すると、OK とか Warinig とか表示されるので必要に応じて対応します。APC のインストールとか。これは便利。
php check_configuration.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
本番環境の情報を設定する
[production]
host=www.symfony-project.com
port=22
user=jobeet
dir=/var/www/jobeet/
type=rsync
pass=
転送したくないファイルがあれば設定する
.svn
/web/uploads/*
/cache/*
/log/*
/web/*_dev.php
プレビュー
実際に転送する。rsync が実行される
やっぱり rsync は楽ですね、どのファイルをアップするかとか考えなくてよくて、コマンド一発でデプロイが完了します。注意しないといけないのが設定ファイルを開発用のまま転送すると本番環境が動かなくなることです。この問題も本番反映用のシェルファイルを作れば解決しそうです。
参考
symfony | Web PHP Framework | The Jobeet Tutorial | Day 23: The Deployment
第16章 - アプリケーションの運用ツール
秋元@ずっと雪 » Windows+symfony1.1でproject:deployを動かすためのパッチ
phpフレームワークsymfonyをdreamhostへインストールする方法
- 2009/01/11
- 日記
dreamhost へ symfony をインストールしようと試みました。
- symfony をインストール
- symfony のバージョンを確認(エラーが発生)
- エラーの原因を調査する
symfony 本家から tar.gz のアーカイブを wget で取得して解凍します。
% 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
% vendor/symfony-1.2.2/data/bin/symfony -V
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in
dreamhost の wiki を検索すると、symfony についてのページがあるので参考にする。(dreamhost で困ったらとりあえず wiki で検索する。)
原因はパスの設定のようなので対応
これで正常に動く
symfony version 1.2.2
ホーム > タグ > symfony
![symfony徹底攻略 [PHP徹底攻略シリーズ] (PHP徹底攻略シリーズ)](http://ecx.images-amazon.com/images/I/51wL5doVKJL._SL160_.jpg)

![symfony×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 3)](http://ecx.images-amazon.com/images/I/41gbS%2BvOscL._SL160_.jpg)