symfonyの簡単なまとめ
インストール
pear channel-discover pear.symfony-project.com pear install symfony/symfony-1.2.10
モジュールの追加
frontendアプリケーションにcontentモジュールを追加。
cd PROJECT_DIR symfony generate:module frontend content
アクションの追加
showアクションを追加。URLは http://localhost/frontend_dev.php/content/show になる。
- actions/actions.class.php
<?php class contentActions extends sfActions { public function executeShow() { $this->mesg = 'SHOW!'; } }
- content/templates/showSuccess.php
<html> <body> <?php if ($mesg): ?> [<?php echo $mesg ?>] <?php endif; ?> </body> </html>
ページのレイアウト
sampleモジュールのindexアクションのページを考えると、デフォルトの構成では、以下のように2つのファイルを使い、レイアウトに<html>タグや<head>タグを記述し、テンプレートには<body>内を記述する。
- レイアウトファイル
- apps/frontend/templates/layout.php
- テンプレートファイル
- apps/frontend/modules/sample/templates/indexSuccess.php
任意のレイアウトを指定する
- apps/frontend/templates/my_layout.php
- /apps/frontend/modules/sample/config/view.yml:
all: has_layout: on indexSuccess: layout: my_layout
テンプレートからテンプレートを呼び出す
部分テンプレート
以下のようにテンプレートに記述する。
<?php include_partial('mypartial1') ?> # frontend/modules/mymodule/templates/_mypartial1.phpが呼び出される <?php include_partial('foobar/mypartial2') ?> # frontend/modules/foobar/templates/_mypartial2.phpが呼び出される
部分テンプレート内で変数を参照するには、呼び出す際に以下のようにすると、mytotal変数に参照出来る。
<?php include_partial('mypartial', array('mytotal' => $total)) ?>
コンポーネント
TODO
既存のデータベースからスキーマファイルを作成
- config/databases.yml
all: propel: class: sfPropelDatabase param: dsn: mysql://login:passwd@localhost/blog
- 以下のコマンドを実行する。
symfony propel:build-schema
スキーマファイルからデータモデルクラスを作成
symfony propel:build-model
データモデルクラス
- lib/model/XXX.php
- ロジックを記述し、実際に編集する。
基底データモデルクラス
- lib/model/om/XXX.php
- symfonyシステムファイルで通常編集しない。
オブジェクトクラス
- lib/model/TableA.php
- lib/model/om/BaseTableA.php
- テーブルのレコードそのものを表すクラス。
$tblA = new TableA(); $myname = $tblA->getMyName();
ピアクラス
- lib/model/TableAPeer.php
- lib/model/om/BaseTableAPeer.php
- テーブルのレコードを操作(取得)するクラス。
$tblA_list = TableAPeer::retrieveByPks(array(1,2,3));
CRUD
TODO
URL・ルーティング
// 内部のURI構文 <module>/<action>[?param1=value1][¶m2=value2][¶m3=value3]... // 内部URIの例で、エンドユーザーに決して表示されない article/permalink?year=2006&subject=finance&title=activity-breakdown // 外部URLの例で、エンドユーザーに表示される http://www.example.com/articles/finance/2006/activity-breakdown.html
- routing.yml
article_by_title: url: articles/:subject/:year/:title.html param: { module: article, action: permalink }
- url_for()ヘルパーは内部URIを外部URLに変換する
<a href="<?php echo url_for('article/permalink?subject=finance&year=2006&title=activity-breakdown') ?>"> ここをクリック</a> // ヘルパーはURIがarticle_by_titleルールにマッチすることを見る // ルーティングシステムはそれから外部URLを作成する => <a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">ここをクリック</a>
- link_to()ヘルパーは直接ハイパーリンクを出力し、PHPとHTMLを混在させることを回避する
<?php echo link_to( 'ここをクリック', 'article/permalink?subject=finance&year=2006&title=activity-breakdown') ?> ) ?>
- 内部では、link_to()はurl_for()を呼び出すので結果はつぎのものと同じ
=> <a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">ここをクリック</a>
フォームヘルパー
フォームタグ
<?php echo form_tag('test/save') ?> => <form method="post" action="/path/to/save"> <?php echo form_tag('test/save', 'method=get multipart=true class=simpleForm') ?> => <form method="get" enctype="multipart/form-data" class="simpleForm"action="/path/to/save">
閉じタグは</form>自分で。
デバッグ
ログ
public function executeIndex(sfWebRequest $request) { $this->logMessage('ログです'); $this->logMessage('エラーです','err'); }
<html><?php use_helper('Debug') ?> <?php log_message('エラーです', 'err') ?></html>