CakePHP 2.3在AppModel中使用国际化时出错

时间:2013-03-07 21:29:52

标签: cakephp internationalization

我试图在AppModel中定义一些状态常量,以便在每个模型中都可用。要获取它们的字符串值,我想将它们存储在数组中,但是当我尝试将字符串国际化时,会导致以下错误:

致命错误:在第181行的/home/dev/www/test/lib/Cake/Utility/ClassRegistry.php中调用未定义的函数AppModel()

我的代码:

class AppModel extends Model {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    public $statuses = array(
        self::STATUS_INACTIVE => __('Inactive'),
        self::STATUS_ACTIVE => __('Active')
    );
}

我查看了核心,发现以下行引发了错误:

$instance = new $appModel($settings);

$ appModel($ settings)语句导致它,我试图调试它并得到相同的错误。 任何帮助或想法朝着正确的方向解决这个问题表示赞赏。

1 个答案:

答案 0 :(得分:0)

我认为你不能在PHP中定义这样的$ status。问题是您无法使用函数的结果定义类属性。

http://www.php.net/manual/en/language.oop5.properties.php

  

类成员变量称为“属性”。您也可以使用“属性”或“字段”等其他术语来查看它们,但出于本参考的目的,我们将使用“属性”。它们通过使用public,protected或private之一,然后是普通变量声明来定义。此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,必须能够在编译时进行评估,并且不得依赖于运行时信息才能进行评估。

如果要使用已翻译的标签设置属性,请将其移至构造函数,该构造函数用于初始化对象;

class AppModel extends Model {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    public $statuses;

    public function __construct($id = false, $table = null, $ds = null) {
        parent::__construct($id, $table, $ds);
        $this->statuses = array(
            self::STATUS_INACTIVE => __('Inactive'),
            self::STATUS_ACTIVE => __('Active')
        );
    }
}

或者将它移动到另一个方法,这样只有在实际使用时生成,就像这样;

public function getStatusOptions()
{
   return array(
        self::STATUS_INACTIVE => __('Inactive'),
        self::STATUS_ACTIVE => __('Active')
   );
}

另一方面说明;一个很好的技巧来定义类常量使它们可以重复使用,而无需将它们添加到AppModel是使用接口;

interface ActiveInactive {
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
}


interface FooBar {
     const HELLO = 'world';
}


class MyModel extends AppModel implements ActiveInactive, FooBar {

    public function test()
    {
        echo self::STATUS_INACTIVE;  // outputs '1'
        echo self::HELLO;            // outputs 'world'
    }

}

 class MyHelper extends Helper implements ActiveInactive, FooBar {

    public function test()
    {
        echo self::STATUS_INACTIVE;  // outputs '1'
        echo self::HELLO;            // outputs 'world'
    }

}

这样你可以在任何地方重复使用这些常量;在助手,模型,控制器。你可以“组合”这些常数:)