Silverstripe table_name 未设置 class

Silverstripe table_name not set for class

我刚刚开始学习 SilverStripe,实际上我对 silverstripe 网站上的课程有疑问。

我有这个 class:

namespace SilverStripe\Lessons;

use Page;

class ArticlePage extends Page
{
    private static $can_be_root = false;
    private static $db = [
        'Date' => 'Date',
        'Teaser' => 'Text',
        'Author' => 'Varchar(255)',
    ];

//    public function getCMSFields(){
//        $fields = parent::getCMSFields();
//        $fields = addFieldToTab();
//        return $fields;
//    }

}

现在,当我 /dev/build 时,我在构建页面上收到了以下反馈:

所以我接下来所做的实际上是注释掉 $db 数组的声明。然后我从 dev/build:

得到了这个反馈

所以有些事情我不确定。 dev/build 的第一个输出中的红色注释表明您应该为所有命名空间模型定义一个 table_name。它确实没有说明我有一个未定义的 table_name。但是它下面的下一个注释说 table_name 没有为 class SilverStripe\Lessons\ArticlePage 设置。那么在这些消息的上下文中,定义 table_name 和 "setting" 和 table_name 是一回事吗?

此外,第二个输出表明为 SilverStripe\Lessons\ArticlePage 定义了 table_name 事实上,每个 table_name 后面都附加了“2”,这是我在开始这个 post 之前进行实验的结果,我相信。即,一旦我看到这种行为,我就重复实验以尝试重现这种行为,因此创建和删除了更多表,因此必须增加它们的名称。 那么为什么没有设置 ArticlePage table_name? 有人可以帮我解决这个问题吗? 戴夫

该消息意味着您应该为您的页面(和数据对象)配置一个 table_name,它们将拥有自己的数据库 table。

在您自己的代码中,最好通过添加私有静态 属性 来实现,如下所示:

private static $table_name = 'ArticlePage';

为避免名称冲突,最好在您的 table 名称前加上您自己的公司名称或类似名称。但这仅在您开发的模块或其他代码将 运行 用于多个上下文时才真正重要。

使用静态 属性 的替代方法是通过 YML 定义它。所以在你的 _config/mysite.yml 中你会输入:

SilverStripe\Lessons\ArticlePage:
  table_name: ArticlePage

注意: table_name 的变化是在 SilverStripe 4.0.0 之后引入的,因此本课可能没有涵盖这个主题。