2010.05.06

【正誤情報】『symfony徹底攻略』

symfony徹底攻略


■第1刷発行後に発見された修正点

●第3楽章:p.15中央、「(3)PEARを通してsymfonyをインストール」下の1行目
ここでは最新版のsymfonyをインストールするコマンドが掲載されています。書籍刊行後にバージョンアップされているので、本書刊行時のバージョン1.0.6をインストールするためには、下記のようにバージョンを指定してください。
<修正前>
$ pear install symfony/symfony
<修正後>
$ pear install symfony/symfony-1.0.6

●第4楽章:p.25上、図4.2の下寄り
<修正前>
ンについて説明しましょう。まず、アプリケーションとは何かということですが、アクションとは「何
<修正後>
ンについて説明しましょう。まず、アクションとは何かということですが、アクションとは「何

●第4楽章:p.25中央、4.1.3「モジュールとアクション」下の段落2行目
httpに続く:(コロン)は1つが正しいです。
<修正前>
http:://ドメイン名/アプリケーション環境/モジュール/アクション/
<修正後>
http://ドメイン名/アプリケーション環境/モジュール/アクション/

●第4楽章:p.29上、図4.3内の下寄り
<修正前>

フィルタリング処理(プリフィルタ、ポストフィルタ)
Filter1 Filter1 実行処理フィルタ
プリフィルタ
プリフィルタ
プリフィルタ

<修正後>

フィルタリング処理(プレフィルタ、ポストフィルタ)
Filter1 Filter2 実行処理フィルタ
プレフィルタ
プレフィルタ
プレフィルタ

●第4楽章:p.30中央、図4.4内の右上
<修正前>
getResultMethods()関数の戻り値で定義可能
<修正後>
getRequestMethods()関数の戻り値で定義可能

●第4楽章:p.38上、上から4行目
小文字cを削除します。
<修正前>
トはシングルトン*5で呼び出します(sfCcontext::getInstance)。そのため、どこで呼び出しても同じオ
<修正後>
トはシングルトン*5で呼び出します(sfContext::getInstance)。そのため、どこで呼び出しても同じオ

●第4楽章:p.41中央、上から2番目のリスト、4行目
修正箇所を混同しないよう5行目も掲載しています。
<修正前>
// ‘error message’をログに残してリダイレクト
$this->forward404(‘error message’);
<修正後>
// ‘error message’をログに残してフォワード
$this->forward404(‘error message’);

●第4楽章:p.46中央、リストの下から4行目のコメント
<修正前>
// ユーザーのnickneme属性を表示
<修正後>
// ユーザーのnickname属性を表示

●第4楽章:p.48上、上から6行目(「JavaScriptヘルパー」の冒頭の段落)
<修正前>
ので、テンプレートで次のようにフォームヘルパーを読み込む宣言を行います。
<修正後>
ので、テンプレートで次のようにJavaScriptヘルパーを読み込む宣言を行います。

●第4楽章:p.50上、上から4行目(「JavaScriptヘルパー」の冒頭の段落)
<修正前>
include_partial()関数を呼び出した箇所にパーシャルが挿入されます。パーシャルの実体はtempltes
<修正後>
include_partial()関数を呼び出した箇所にパーシャルが挿入されます。パーシャルの実体はtemplates

●第4楽章:p.51上、上から10行目(2つ目の段落)
<修正前>
components.phpに実装します。コンポーネントのテンプレートはパーシャルと同じ命名規則ですので、
<修正後>
components.class.phpに実装します。コンポーネントのテンプレートはパーシャルと同じ命名規則ですので、

●第4楽章:p.55上、上から4行目
<修正前>
ん。これがデータベース抽象レイヤであPropelというわけです。
<修正後>
ん。これがデータベース抽象レイヤであPropelというわけです。

●第5楽章:p.70、表5.6「symfonyの内部定数」の見出し行
<修正前>
数名 | 内容 | 設定値
<修正後>
数名 | 内容 | 設定値

●第5楽章:p.71、表5.7「モジュールより下層のディレクトリ名の定義」の見出し行
<修正前>
数名 | 内容 | 既定値
<修正後>
数名 | 内容 | 既定値

●第5楽章:p.76、下から11行目
■キャッシュクリア中にアプリケーションを利用不可にする

<修正前>
ィレクトリ>/symfony/data/web/arrors/unavailable.php が呼び出されます。このページをカスタ
<修正後>
ィレクトリ>/symfony/data/web/errors/unavailable.php が呼び出されます。このページをカスタ

●第5楽章:p.78、上から6行目
■ ウェブデバッグツールバーの表示設定を行いたい

<修正前>
 アプリケーションのウェブデバッグツールバー表示設定を行います。また、settings.yml内でなく
<修正後>
 アプリケーションのウェブデバッグツールバー表示設定を行います。また、settings.yml内でなく

●第5楽章:p.84、上から6行目
■データベースの設定を行いたい

<修正前>
設定箇所 <プロジェクトルート>/config/atabases.yml
<修正後>
設定箇所 <プロジェクトルート>/config/databases.yml

●第5楽章:p.85、上から1行目
<修正前>
 これらの設定値にアクセスする方法は次のようにapp_なります。
<修正後>
 これらの設定値にアクセスする方法は次のようにapp_なります。

●第6楽章:p.91、表6.1、下から4行目
<修正前>
 | symfony freeze | freezeの解除
<修正後>
 | symfony unfreeze | freezeの解除

●第6楽章:p.93、上から9行目
<修正前>
設定することができます。設定ファイル(setting.yml)においてcheck_lockフラグをonにするだけで
<修正後>
設定することができます。設定ファイル(settings.yml)においてcheck_lockフラグをonにするだけで

●第6楽章:p.95、上から1行目
<修正前>
$ ls -R apps/frontend/modules/mymodule/ ※ 作成されたmymmoduleディレクトリを確認
<修正後>
$ ls -R apps/frontend/modules/mymodule/ ※ 作成されたmymoduleディレクトリを確認

●第6楽章:p.113、見出しの番号
<修正前>
6.2.1 データの取得
<修正後>
6.3.1 データの取得

●第6楽章:p.114中央、「■where句の指定」の「・コード」4行目
<修正前>
$c->add(UserPeer::EMAIL, ‘bar’, Criteria::EQUAL);
<修正後>
$c->add(UserPeer::NAME, ‘bar’, Criteria::EQUAL);

●第6楽章:p.115、上から8行目
<修正前>
 (user.ID>=1 AND user.ID<=3) 部分の条件句を->getNewCriterion で作成し->addAnd するか、
<修正後>
 (user.ID>=1 AND user.ID<=3) 部分の条件句を->getNewCriterion で作成し->addAnd した結果($criterion)を ->addするか

●第6楽章:p.115中央、「■userデータ数をカウントする」の「・SQL」
<修正前>
SELECT COUNT(user.ID) FROM user WHERE user.DELETED_AT IS NULL
<修正後>
SELECT COUNT(*) FROM user WHERE user.DELETED_AT IS NULL

●第6楽章:p.117、1行目
<修正前>
■ HAVING BY
<修正後>
■ HAVING

●第6楽章:p.118、「■リレーションも含めて取得」
<修正前>
■リレーションも含めて取得
<修正後>
■リレーション先のデータを取得
<修正前>
 symfonyでpropel-build-modelするときにFKを指定し、テーブルのリレーションを定義していれば、
<修正後>
 symfonyでpropel-build-modelするときにFK(外部キー *1)でテーブルのリレーションを定義していれば、

※さらに下記の注を追加。

*1 http://ja.wikipedia.org/wiki/%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC

●第6楽章:p.124、13-14行目「・ポイント」の出だし行と次の行
<修正前>
 updated_atカラムが存在すれば自動的に日時がセットされます。
 $user->setNew(false); を呼び出しておくとUPDATEではなくINSERTで実行されます。
<修正後>
 UPDATED_ATカラムが存在すれば自動的に日時がセットされます。
 $user->setNew(false); を呼び出しておくとINSERTではなくUPDATEで実行されます。

●第6楽章:p.126、4行目
<修正前>
です。キーとなるカラム名がキャメルケースになっていることに注意してください。
<修正後>
です。キーとなるカラム名がキャメルケース*1になっていることに注意してください。

※さらに下記の注を追加。

*1 http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9

●第6楽章:p.135、表6.9の下から1・2行目

<修正前>
time_seperator | 生成された時刻のセレクトタグの区切り文字を指定する
time_seperator | 生成されるセレクトタグに対して、ほかの属性のオプションを配列で指定する
<修正後>
time_seperator | 生成された時刻のセレクトタグの区切り文字を指定する

●第6楽章:p.145、下から4行目
<修正前>

echo auto_link(“Go to http://www.symfony-project.com/”);

<修正後>

echo auto_link_text(“Go to http://www.symfony-project.com/”);

●第6楽章:p.146中央下
<修正前>

echo link_to_remote(‘モジュール名/アクション名‘, オプションの配列)

<修正後>

echo link_to_remote(‘テキスト‘, オプションの配列)

●第11楽章:p.208中央から下へ
 config/schema.ymlの下から2行目のインデント(字下げ)
<修正前>


 description: longvarchar
 __user_id: {type: integer, foreignTable: sf_guard_user, foreignReference: id}
 status_id:


<修正後>


 description: longvarchar
 user_id: {type: integer, foreignTable: sf_guard_user, foreignReference: id}
 status_id:


●第12楽章:p.212、上から8行目、上のリストのパス
<修正前>
・apps/backend/modules/config/setting.yml
<修正後>
・apps/backend/config/setting.yml

●第12楽章:p.212中央、上から2番目のリスト
 変更対象のファイル名を補足します。

<修正前>
 ユーザークラスの親クラスをsfBasicSecurityUserからsfGuardSecurityUserに変更します。


<?php

class myUser extends sfGuardSecurityUser
{
}


<修正後>
 ユーザークラスの親クラスをsfBasicSecurityUserからsfGuardSecurityUserに変更します。

・apps/backend/lib/myUser.class.php


<?php

class myUser extends sfGuardSecurityUser
{
}


●第12楽章:p.217、下から4、3行目
<修正前>
スタイルシートのディレクトリは<ドキュメントルート>/css/ になります。
<修正後>
スタイルシートのディレクトリは<プロジェクトルート>/web/css/ になります。

●第12楽章:p.218下
 config/sfGuardPlugin-profile-schema.ymlの内容。

<修正前>


sf_guard_user_profile:
   _attributes: { phpName: sfGuardUserProfile }
   id:
   user_id: { type: integer, foreignTable: sf_guard_user, foreignReference: id, required: true, onDelete: cascade }
   email: varchar(255)


<修正後>


propel:
   sf_guard_user_profile:
     _attributes: { phpName: sfGuardUserProfile }
     id:
     user_id: { type: integer, foreignTable: sf_guard_user, foreignReference: id, required: true, onDelete: cascade }
     email: varchar(255)


●第12楽章:p.219中央、下から14行目
<修正前>
 symfonyの設定ファイルが設置場所によって上書きできることはすでに説明した通りですので、
<修正後>
 symfonyの設定ファイルが設置場所によって上書きできることはすでに説明した通りですので、

●第12楽章:p.220中央、2つめのコード
<修正前>
・apps/backend/modules/sfGuardUser/templates/_email.php


<?php
echo input_tag(‘sf_guard_user_email]‘, $sf_guard_user->getProfile()->getEmail());


<修正後>
・apps/backend/modules/sfGuardUser/templates/_email.php


<?php
echo input_tag(‘sf_guard_user_email’, $sf_guard_user->getProfile()->getEmail());


●第12楽章:p.223下、2つめのコード
<修正前>


## email用の追加
   sf_guard_user_email:
     required: yes
     required_msg: Please, enter a email


<修正後>


## email用の追加
   sf_guard_user_email:
     required: yes
     required_msg: Please, enter a email
     validators:


●第12楽章:p.228、1つめのコード
<修正前>
・passwordSuccess.php


<?php echo form_tag(‘sfGuardAuth/Password’, array(‘method’ => ‘post’, ‘id’ => ‘form1’, ‘name’ => ‘form1’)) ?>


<修正後>
・passwordSuccess.php


<?php echo form_tag(‘sfGuardAuth/password’, array(‘method’ => ‘post’, ‘id’ => ‘form1’, ‘name’ => ‘form1’)) ?>


●第12楽章:p.228中央、3つめのコードのファイル名
<修正前>
・apps/backend/modules/sfGuardAuth/validate/Password.yml
<修正後>
・apps/backend/modules/sfGuardAuth/validate/password.yml

●第12楽章:p.228中央、項目「バリデーションの設定」の説明文2行目
<修正前>
(email)だけであり、とても単純です。sendPasswordアクションでバリデーションを行うため、次の
<修正後>
(email)だけであり、とても単純です。passwordアクションでバリデーションを行うため、次の

●第12楽章:p.229、コード中央付近
<修正前>


<!– form1 –>
<?php echo form_tag(‘sfGuardAuth/sendPassword’, array(‘method’ => ‘post’,
‘id’ => ‘form1’, ‘name’ => ‘form1’)) ?>


<修正後>


<!– form1 –>
<?php echo form_tag(‘sfGuardAuth/password’, array(‘method’ => ‘post’,
‘id’ => ‘form1’, ‘name’ => ‘form1’)) ?>


●第13楽章:p.244下、下から6行目
<修正前>
・新規、修正の確認画面用: apps/frontend/modules/task/templates/editSuccess.php
<修正後>
・新規、修正の確認画面用: apps/frontend/modules/task/templates/confirmSuccess.php

●第13楽章:p.248、下側のコマンド実行
<該当個所>
この初期データファイルを指定してpropel-load-dataで読み込ませます。


$ symfony propel-load-data frontend data/fixtures/task_import.yml
>> propel load data from “data/fixtures/task_import.yml”


<補足>
 紙面ではTaskテーブルの初期データのみ掲載していますが、実際はプラグインのデータも記述する必要があります。紙面上ではこれらについての説明が抜けていました。申し訳ありません。
 サポートページからダウンロードできるサンプルに含まれている /data/fixtures/200_task_import.yml が同じファイルになります。こちらではプラグンのデータについても含め記述されています。こちらのファイルでご確認ください。

●第13楽章:p.249下
 lib/model/TaskPeer.phpの上から4行目。

<修正前>
  $c->doSelectJoinAllOrderByCreatedAt(self::CREATED_AT);
<修正後>
  $c->addAscendingOrderByColumn(self::CREATED_AT);

●第13楽章:p.259下
 下から12行目。「タスクタイトル」が重複しているので、下側を訂正します。

<修正前>
<dt>タスクタイトル</dt>
<修正後>
<dt>ステータス</dt>

●付録B:p.308
URL「http://go-pear.org/」はドメイン管理者が変わってしまったため、「http://pear.php.net/go-pear」をご利用ください。「http://pear.php.net/go-pear/」から末尾の「/」(スラッシュ)がなくなっています。

<修正前>
(16)PEARをインストールします。PEARはyumでupdateしたりせず、pearコマンドによって管理を行うため、別途インストール作業を行います。


$ /usr/bin/curl http://go-pear.org/ | sudo /usr/bin/php


…中略…
(1)パッケージマネージャを取得します。


$ /usr/bin/curl http://go-pear.org/ > go-pear.php


<修正後>
(16)PEARをインストールします。PEARはyumでupdateしたりせず、pearコマンドによって管理を行うため、別途インストール作業を行います。


$ /usr/bin/curl http://pear.php.net/go-pear | sudo /usr/bin/php


…中略…
(1)パッケージマネージャを取得します。


$ /usr/bin/curl http://pear.php.net/go-pear > go-pear.php


●Index(索引):p.321上
<修正前>
components.php … 51
<修正後>
components.class.php … 51, 271