カテゴリー : Symfony

[エラー] Unable to parse string: Unable to parse line ~. [Symfony1.4]

Symfony1.4にて、データベースにフィクスチャーファイルを読み込んだ際にエラーが出ました。

# php symfony doctrine:data-load

■ fixture.yml

Book:
  Book1
    isbn:               9784478012031
    asin:               4478012032
    title:              もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら
    memo:               |
                        敏腕マネージャーと野球部の仲間たちが甲子園を目指して奮闘する青春小説。

■ エラー発生その1

Unable to parse string: Unable to parse line 34 (Book1).

Book1 の後に : がありませんでした。 : を付けて解決。
 

■ エラー発生その2

Unable to parse string: A YAML file cannot contain tabs as indentation at line 46 ( 敏腕マネージャーと野球部の仲間たちが甲子園を目指して奮闘する青春小説。).

タブがいけなかった。YAMLは行の先頭付近はタブでのインデントはダメらしいです。

以上です。

[Symfony] Apache標準の404 Not Found が表示されるので mod_rewrite を有効にする

Symfony 1.4 にて、prod環境にするとApache標準の404 Not Found が表示されるという症状に陥りました。

Apache の mod_rewrite を有効にすることで解決したので、その手順をメモ。

他にもdev環境からprod環境へ切り替えると動作しない時の対処方法があるみたいなので、困ったら下記の記事を読みましょう。

dev環境からprod環境に変えると動かなくなる時の対処方法 « symfonyで開発日記 はてなブックマーク - dev環境からprod環境に変えると動かなくなる時の対処方法 « symfonyで開発日記

今回の症状は、

http://example.com/index.php/login
http://example.com/frontend_dev.php/login

とかだとアクセスできるけど、

http://example.com/login

だとアクセスできない状態でした。
 

Apache の mod_rewrite が有効か確認する

まず、mod_rewrite が有効になっているか確認するには、apachectl に -l オプションを付けて、コンパイル済みのモジュールリストを確認します。

# /usr/local/apache2/bin/apachectl -l
Compiled in modules:
 
  mod_rewrite.c

mod_rewrite.c があればOK.

なければ、config.nice に –enable-rewrite オプションを付けて再コンパイルして、インストールし直します。
 

mod_rewrite を有効にして再インストールする

# /usr/local/src/httpd-2.2.21/config.nice --enable-rewrite
# make
# make install

ちなみに、make install を実行しても今あるドキュメント、 ログファイル、設定ファイルは上書きされないみたいです。

・参考:コンパイルとインストール – Apache HTTP サーバ はてなブックマーク - コンパイルとインストール - Apache HTTP サーバ

インストール後に、もう一度 apachectl -l で mod_rewrite.c があるか確認します。

以上です。

[Symfony1.4][Validator] カスタムバリデータを作成する方法

 

Symfony1.4で、カスタムバリデータを作成する方法を調べて、実践したのでメモ。
 

まず、カスタムバリデータを作る前に、自分が使いたいバリデータが既存のものにないか確認します。
 

symfony Forms in Action | 付録 B – バリデータ | symfony | Web PHP Framework
 

使いたいバリデータがない場合は、自分で作ります。
 

カスタムバリデータを作るときに参考になった記事は、Symfony1.4だと以下の通りです。
 

The More with symfony book | カスタムウィジェットとバリデータ | symfony | Web PHP Framework

symfonyでカスタムバリデータを使ってフィルタを実装する – spanstyle::monolog

symfonyのValidatorで全角/半角変換などを行う – ゆっくり*ゆっくり
 

実際に、書籍を特定するための番号であるISBNを入力値の長さと文字の構成を確認するバリデータを作ってみました。
 

ちなみに、ISBNは、ISBN-10だと10桁で、1桁目が 0 ~ 9 、X が使用され、他の桁は数字です。ISBN-13は13桁で、数字のみで構成されています。
 

・参考:ISBN – Wikipedia
 

正規表現の使い方はこちらを参考にしました。
 

正規表現 | PHP Labo

正規表現
 

そして、実際に作ったのが下記のソースになります。
 

■ myValidatorIsbn.class.php
 

(ISBNの形式に合ってるか確認するバリデータ)
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
class validatorIsbn extends sfValidatorBase
{
	protected function doClean($value)
	{
		// 入力値の長さが10文字の場合、そのまま入力値を返す
		// ISBN-10は、1桁目が 0 ~ 9 、X で構成され、他の桁は数字
		if (strlen($value) == 10){
			if (preg_match("/^[0-9]{9}?[0-9X]$/" ,$value)){
				return $value;
			} else {
				throw new sfValidatorError($this, 'ISBN-10は1桁目は 0~9 、X、他の桁は数字で入力して下さい', array('value' => $value));
			}
		}
 
		// 入力値の長さが13文字の場合、そのまま入力値を返す
		if (strlen($value) == 13){
			// ISBN-13は数字のみで構成される
			if (preg_match("/^[0-9]{13}?$/" ,$value))
			{
				return $value;
			} else {
				throw new sfValidatorError($this, 'ISBN-13は数字のみで入力して下さい', array('value' => $value));
			}
		}
		// それ以外の場合、エラー
		throw new sfValidatorError($this, 'ISBNは10文字、または13文字で入力して下さい', array('value' => $value));
	}
}

 

■ IsbnSearchForm.class.php
 

(ISBNの入力フォームを定義しているフォームファイル)
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class IsbnSearchForm extends BaseForm
{
	public function configure()
	{
		$this->setWidgets(array(
			'isbn' => new sfWidgetFormInput(array(), array('size' => 20, 'maxlength' => 13, )),
		));
 
		$this->setValidators(array(
			'isbn' => new myValidatorIsbn(array('required' => true, ),
										  array('required' => '未入力', )),
		));
 
		$this->widgetSchema->setNameFormat('isbn_search[%s]');
 
		$this->widgetSchema->setLabels(array('isbn' => 'ISBN10/13', ));
	}
}

 

以上です。
 

[Symfony1.4] csrf token: Required.

 

Symfony1.4にて、フォームを作成して使ってみたらエラーが発生しました。
 

■ エラー内容

csrf token: Required.
 

■ 解決方法

フォーム内にHiddenフィールドを吐き出してなかったのが原因でした。

以下の内容をフォーム内に書けばOKです。
 

1
<?php echo $form->renderHiddenFields() ?>

 
以上です。
 

【参考】

さぼてん: 【symfony】_csrf_tokenとsetWidgets()

symfonyでCSRFがうまく動かない | OKWave

symfony1.2のCSRF対策について : アシアルブログ

csrf_secretを設定している場合のフォーム生成メモ – 偏った言語信者の垂れ流し
 

[Symfony1.4] Strict、Deprecated エラーや Warning を表示させない設定方法

 

Symfony1.4 にて、PEARを使うと、StrictエラーやらDeprecatedエラーやらが大量に出力されました。
 

エラーの出力設定を php.ini で変更したのですが、Symfonyのプログラムでは反映されていませんでした。
 

Symfonyには プロジェクトホーム/apps/frontend/config/settings.yml に error_reporting が書かれているので、php.ini の設定をこれで上書きしてしまっているようです。
 

ちなみに、「error_reporting」というワードが記載されているファイルは以下のように grep コマンドで探します。
 

1
2
3
4
5
# grep -R error_reporting ./
 
./cache/frontend/dev/config/config_settings.yml.php:  'sf_error_reporting' => 32767,
./apps/frontend/config/settings.yml:    error_reporting:        <?php echo (E_ALL | E_STRICT)."\n" ?>
./apps/frontend/config/settings.yml:    error_reporting:        <?php echo ((E_ALL | E_STRICT) ^ E_NOTICE)."\n" ?>

 

該当しそうな部分が見つかりました。
 

cache の config_settings.yml.php に ‘sf_error_reporting’ => 32767, とあり、32767 デフォルトのE_ALL | E_STRICTなので、php.ini の設定がSymfony側に反映されていないことが、ここで確認できます。
 

デフォルトでは settings.yml は以下のようになっています。
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# You can find more information about this file on the symfony website:
# http://www.symfony-project.org/reference/1_4/en/04-Settings

prod:
  .settings:
    no_script_name:         true
    logging_enabled:        false

dev:
  .settings:
    error_reporting:        <?php echo (E_ALL | E_STRICT)."\n" ?>
    web_debug:              true
    cache:                  false
    no_script_name:         false
    etag:                   false

test:
  .settings:
    error_reporting:        <?php echo ((E_ALL | E_STRICT) ^ E_NOTICE)."\n" ?>
    cache:                  false
    web_debug:              false
    no_script_name:         false
    etag:                   false

all:
  .settings:
    # Form security secret (CSRF protection)
    csrf_secret:            ebfxa42b0x90387xd2fx4d24xd00xxx38c1a9x16
 
    # Output escaping settings
    escaping_strategy:      true
    escaping_method:        ESC_SPECIALCHARS
 
    # Enable the database manager
    use_database:           true

 

dev の部分を以下のように変更して、Strict エラーと Deprecated エラーを表示させないようにします。
 

1
2
3
dev:
  .settings:
    error_reporting:        <?php echo (E_ALL & ~E_DEPRECATED)."\n" ?>

 

以上です。
 
 

[Symfony1.4] フォーム(Form)/バリデーター(Validator)関連の参考サイトまとめ

 

Symfony1.4 にて フォームを使うときに読む記事を一覧にしました。
 

色んなページからアクセスするのが面倒なのでまとめてみました。
 

blogチュートリアル(9) 記事の追加 | 日本Symfonyユーザー会 はてなブックマーク - blogチュートリアル(9) 記事の追加 | 日本Symfonyユーザー会

blogチュートリアル(10) データのバリデーション | 日本Symfonyユーザー会 はてなブックマーク - blogチュートリアル(10) データのバリデーション | 日本Symfonyユーザー会
 

A Gentle Introduction to symfony | 第10章 – フォーム | symfony | Web PHP Framework はてなブックマーク - A Gentle Introduction to symfony | 第10章 - フォーム | symfony | Web PHP Framework
 

symfony Forms in Action | symfony | Web PHP Framework はてなブックマーク - symfony Forms in Action | symfony | Web PHP Framework
 
  ・第1章 – フォームの作成

  ・第2章 – フォームのバリデーション

  ・第3章 – Web デザイナのためのフォーム

  ・第4章 – Propel との統合

  ・第8章 – 国際化とローカライゼーション

  ・第11章 – Doctrine との統合

  ・付録 A – ウィジェット

  ・付録 B – バリデータ
 

The More with symfony book | 高度なフォーム | symfony | Web PHP Framework はてなブックマーク - The More with symfony book | 高度なフォーム | symfony | Web PHP Framework
 

直接、フォームとは関係ないですが、セッションは一緒によく使うのでメモ。
 

さぼてん: 【symfony】セッションの利用~アクション~ はてなブックマーク - さぼてん: 【symfony】セッションの利用~アクション~
 

(随時、更新予定です)