在哪里定义 CakePHP 表的字段值

Where to define Field values for CakePHP tables

我有一个 CakePHP 应用程序,它使用字段来存储 0、1、2 等值。

Table:

+----+--------+----------------+
| id | status | title          |
+----+--------+----------------+
|  1 |      2 |  something new |
|  2 |      1 |           nsfw |
|  3 |      1 |       a potato |
|  5 |      0 | the real thing |
+----+--------+----------------+

实体/数组:

$data = [
    0 => 'not published',
    1 => 'published',
    2 => 'draft',
    9 => 'option',
];

// Some public methods to get the data..

模板表单下拉列表:

+----+---------------+
| id | value         |
+----+---------------+
|  0 | not published |
|  1 |     published |
|  2 |         draft |
|  9 |        option |
+----+---------------+

我在模板中使用的内容:

echo $this->Form->input('status', ['options' => $article->getArticleStatusList()]);

示例: articles table 带有 status 字段。默认值为:0 未发布,1 已发布等。在 Entity/Article 中定义这些值。有一个包含默认值的数组,因此在模板文件中我调用了一个实体方法,该方法使用该数组作为 options 表单输入。

以前我为此使用了一个配置数组。 这是完成任务的好方法吗?它应该存储在 ini 文件中?或者在 Table/Model?

一切正常,但我想遵循 MVC 模式。谢谢。

将它们放入 src\Model\ArticleStatus.php。至少对我来说,状态是一个或多个不经常更改的事物的列表。无需将它们放入数据库 table。这些列表是数据,显然属于 MVC 模式的模型层。

恕我直言,最好为它们使用常量,因为您将根据这些值在代码中进行大量检查。字符串值容易出现拼写错误,并且很难与其他域区分开来。例如,如果您有两个 table 使用相同名称但具有不同含义的状态,代码可能会变得难以理解,而且搜索和替换也不会很好地工作,因为您将更改两种类型对于两个域。

例如,我们有一个国家 table,每个国家都有很多附加信息,但使用我们 ~18 个最常用国家的常量列表,由于我们的业务,我们必须对其进行条件检查。所以我们有 src\Model\Table\CountriesTable.php 但也有 src\Model\Country.php。这样做的原因是,如果您可以编写 Country::GERMANY 而不是仅使用像 5 这样的 id,那么代码的可读性和理解性将大大提高。我个人认为在代码中到处使用硬编码 ID 是非常糟糕的做法。

if ($country === 41 && $status === 3) 

if ($country === Country::GERMANY && $status === ArticleStatus::PUBLISHED)

我认为我们可以同意,可读且易于理解的代码比少输入几个字符要好得多。老实说,抱怨几个字符的人应该学会更快地打字。我认为这只是一个糟糕的借口。 ;) 此外,使用 IDE 将为您自动完成 class 常量。它不会对整数执行此操作。

这是一个示例,它甚至可以让您生成带有翻译标签的列表:

<?php
namespace App\Model;

class ArticleStatus {

    const PUBLISHED = 'published';
    const DRAFT = 'draft';
    // Add more as you like

    public static function getStatuses() {
        return [
            static::PUBLISHED ,
            static::DRAFT
        ];
    }

    public static function getKeyValueList() {
        return [
            static::PUBLISHED => __d('app', 'Published'),
            static::DRAFT=> __d('app', 'Draft')
        ];
    }
}

在你的控制器中使用它并设置到你的视图或直接在视图中使用它。