在哪里定义 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')
];
}
}
在你的控制器中使用它并设置到你的视图或直接在视图中使用它。
我有一个 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')
];
}
}
在你的控制器中使用它并设置到你的视图或直接在视图中使用它。