6

我只是在学习 SilverStripe,实际上我对 silverstripe 网站上的课程有疑问。

我有这堂课:

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 的第一个输出中的红色注释表明您应该为所有命名空间模型定义一个 table_name。它确实没有说明我有一个未定义的 table_name。但是它下面的下一个注释说 table_name 没有为类 SilverStripe\Lessons\ArticlePage 设置。那么在这些消息的上下文中定义一个 table_name 和“设置”一个 table_name 是一样的吗?

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

4

1 回答 1

14

该消息意味着您应该table_name为将拥有自己的数据库表的页面(和 DataObjects)配置一个。

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

private static $table_name = 'ArticlePage';

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

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

SilverStripe\Lessons\ArticlePage:
  table_name: ArticlePage

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

于 2018-02-15T12:12:40.057 回答