モンモンブログ

技術的な話など

(symfony1.4) フォームクラスの生成で Fatal error: Call to a member function setTableName() とかなんとか

symfony1.4 で、モデルのコンストラクタのオーバーライドをトチったら厄介なエラーに悩まされたのでメモ。

"Customer" モデルクラスのコンストラクタをこんな風に書きました。parent::__construct を呼ぶのを忘れてます。いっぱしの phper なら鼻で笑っちゃうような初歩的なミスですけど。

$ vim lib/model/doctrine/Customer.class.php
class Customer extends BaseCustomer
{
    // バグコード
    public function __construct()
    {
        $this->ehehe = sfConfig::get('app_ehehe');
    }

    // 以下略
}

そしたらフォームクラスの自動生成で意味不明なエラーが出るようになりました。
↓のように doctrine:build でモデル&フォームを自動生成しようとすると、モデルの生成は成功するけど、続くフォームの生成で Fatal error で失敗。

$ ./symfony doctrine:build --model --forms
>> doctrine  generating model classes  ←モデル生成
>> file+     /var/folders/wj/fp8svh9j25l0yz4lx61p84cm0000gn/T/doctrine_schema_59077.yml
>> tokens    /var/www/ehehe/lib/model/doctrine/base/BaseCustomer.class.php
>> autoload  Resetting application autoloaders
>> file-     /var/www/ehehe/cache/ehehe/dev/config/config_autoload.yml.php

>> doctrine  generating form classes  ←フォーム生成
PHP Fatal error:  Call to a member function setTableName() on a non-object in /var/www/symfony-1.4.18/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Abstract.php on line 140

Fatal error: Call to a member function setTableName() on a non-object in /var/www/symfony-1.4.18/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record/Abstract.php on line 140
PHP Fatal error:  Call to a member function evictAll() on a non-object in /var/www/symfony-1.4.18/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 1239

Fatal error: Call to a member function evictAll() on a non-object in /var/www/symfony-1.4.18/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 1239

エラーを見ても何が何やら分かんないです。で結局、モデルクラスのコンストラクタが原因だったと。

正しくはこう。

$ vim lib/model/doctrine/Customer.class.php
class Customer extends BaseCustomer
{
    // 正しいコード
    public function __construct($table = null, $isNewEntry = false)
    {
        $this->ehehe = sfConfig::get('app_ehehe');
        parent::__construct($table, $isNewEntry);
    }

    // 以下略
}

こんなアホなミスする奴はグーグル先生も見つけらんなかったから僕がきっとパイオニアだよ。同じミスするアホの役に立つことを願って書き残します。そこのお前だよおいアホ m9(^Д^)プギャー

じゃね。