我有一个CakePHP应用程序,它使用Fields来存储0,1,2等值。
表:
+----+--------+----------------+
| 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
字段的status
表。默认值为:0未发布,1已发布等。在实体/文章中定义这些值。有一个包含默认值的数组,因此在模板文件中我调用一个Entity方法,该方法使用数组作为options
表单输入。
前一段时间我正在使用配置数组。 这是完成任务的好方法吗?它应该存储在 ini文件中?或者在表/模型?
中一切正常,但我想遵循MVC模式。感谢。
答案 0 :(得分:2)
将它们放入src\Model\ArticleStatus.php
。至少对我来说,状态是一个或多个不经常变化的事物的列表。无需将它们放在数据库表中。这些列表是数据,显然属于MVC模式的模型层。
恕我直言,最好为它们使用常量,因为你会在代码中对这些值进行大量检查。字符串值容易出现拼写错误,很难与其他域区分开来。例如,如果您有两个表使用相同名称但具有不同含义的状态,则代码可能变得难以理解,并且搜索和替换将无法正常工作,因为您将更改两个域的两种类型。 / p>
例如,我们有一个国家/地区表,其中包含每个国家/地区的大量附加信息,但使用我们约18个最常用国家/地区的常量列表,因为我们的业务,我们必须对其进行有条件检查。我们有src\Model\Table\CountriesTable.php
但src\Model\Country.php
。这样做的原因是,如果您可以编写Country::GERMANY
而不是仅使用5
之类的ID,那么它将更容易理解代码中的内容。我个人认为在代码中的任何地方都使用硬编码的id非常糟糕。
if ($country === 41 && $status === 3)
VS
if ($country === Country::GERMANY && $status === ArticleStatus::PUBLISHED)
我认为我们可以同意,可读且易于理解的代码比输入少量字符要好得多。老实说,抱怨几个角色的人应该学会更快地打字。我认为这只是一个不好的借口。 ;)另外,使用IDE将以任何方式自动完成类常量。对于整数,它不会那样做。
以下是一个示例,甚至可以让您生成包含已翻译标签的列表:
<?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')
];
}
}
在您的控制器中使用它并将其设置为您的视图或直接在视图中使用它。