我需要在mt项目中广泛使用状态。我需要angular.module('app', [])
.controller("DBController", function($scope){
$scope.userName = "My Name";
})
(users
,active
等),实体(suspended
,active
,pending_activation
)和我的{}订阅(inactive
,active
,on_grace_period
,not_subscribed
)。
到目前为止,我认为最好的方法是将它们存储在数据库中,但我觉得将它们放在其他3个选项中要容易得多。
我还认为我可以将它们存储在我的never_subscribed
模型中作为常量。例如,我的订阅模型如下所示:
Eloquent
并检索它们,例如在刀片视图中:
// SubscriptionModel
const SUBSCRIBED_ACTIVE = 1;
const SUBSCRIBED_ON_GRACE_PERIOD = 2;
const NOT_SUBSCRIBED = 3;
const NEVER_SUBSCRIBED = 4;
如何使用配置文件夹并添加名为// subscription/index.blade.php
@if($user->subscription->status == /App/SubscriptionModel::SUBSCRIBED_ACTIVE)
<div>You are subscribed. Thank you</div>
@elseif($user->subscription->status == /App/SubscriptionModel::NEVER_SUBSCRIBED)
<div>You need to create a subscription before being granted full access!</div>
@elseif(...)
// and so on
的文件。在视图中访问它将是:
status.php
有更好的方法吗?
此外,等式的其他部分如何,意味着状态存储在@if($user->subscription->status == Config::get('status.subscription.SUBSCRIBED_ACTIVE'))
<div>You are subscribed. Thank you</div>
@elseif(...)
// etc
中。我应该只为订阅表添加DB
列并存储应用程序指示的内容,甚至可以创建一个单独的表status
并在{{subscription_statuses
foreign_key
1}}表?
答案 0 :(得分:16)
我倾向于为状态创建一个特定的模型,它充当枚举。因此,如果我有一个Event
模型,我可能会有一个相应的EventStatus
模型,如下所示:
class EventStatus
{
const CANCELLED = 'EventCancelled';
const POSTPONED = 'EventPostponed';
const RESCHEDULED = 'EventRescheduled';
const SCHEDULED = 'EventScheduled';
}
然后我可以做这样的检查:
$event->status == EventStatus::CANCELLED;
我通常也会为我的模型添加便利方法:
class Event extends Model
{
public function isCancelled()
{
return $this->status == EventStatus::CANCELLED;
}
}
对于“人性化”字符串,我将拥有一个包含文本字符串的语言文件:
<?php // resources/lang/en/event_status.php
return [
EventStatus::CANCELLED => 'Cancelled',
EventStatus::POSTPONED => 'Postponed',
EventStatus::RESCHEDULED => 'Rescheduled',
EventStatus::SCHEDULED => 'Scheduled',
];
答案 1 :(得分:6)
我不同意其他答案。您的状态信息应存储在数据库中。设计良好的数据库应该清晰可用,无需应用程序。如果您决定使用此数据库为移动应用程序提供支持,会发生什么?您将从数据库中获取一些信息并仅将其存储在Laravel中,这意味着您必须在移动应用程序中复制该状态列表,并将其保留在两者之间。
此类信息应存储在数据库中。
选项1
如果您的用户只能拥有一个状态,那么您应该使用值为enum
,subscribed
,subscribed-grace
,not-subscribed
的{{1}}字段
这在您的观点中同样简单:
never-subscribed
选项2
但是,如果您可能有多种状态,那么您几乎肯定会为每种状态设置单独的字段,并使用@if($user->subscription->status == 'subscribed'
来存储TINYINT
或1
。
单独的状态表?
除非您预计可能会添加更多状态,否则我无法看到使用单独状态表的充分理由,即使您要添加更多状态,也可以向0
添加新值或添加新值字段取决于适合的选项。
如果您打算在除用户之外的数据库中使用许多其他表的状态,那么状态表将是理想的。
单独状态表的唯一其他原因是,如果您决定更改特定状态的含义。这意味着您可以重命名状态表中的状态,但用户仍然可以通过它的主键链接到它。使用前两种方法更改状态的含义将涉及对结构的更改。
这实际上取决于您预期如何使用它们,但没有理由不将它们保存在数据库中。
答案 2 :(得分:4)
在我的应用程序中,我的做法类似于@Martin Bean,除了我不为状态创建单独的类,我将它存储在现有的类/ Model中。
我打电话给user
,subscription
和entity
实体。
status
。status
可能值的常量,如ACTIVE
,INACTIVE
,PENDING
等,每个模型可能会有所不同。getStatusLabel()
,listStatus()
,isActive()
,isX()
等。isActive/X()
,可能是模型有4个状态,但您只对一个特定进行比较,因此我只为该状态创建一个isX()
。< / LI>
class User
{
const STATUS_ACTIVE = 1;
const STATUS_SUSPENDED = 2;
const STATUS_INACTIVE = 3;
/**
* Return list of status codes and labels
* @return array
*/
public static function listStatus()
{
return [
self::STATUS_ACTIVE => 'Active',
self::STATUS_SUSPENDED => 'Suspended',
self::STATUS_INACTIVE => 'Inactive'
]
}
/**
* Returns label of actual status
* @param string
*/
public function statusLabel()
{
$list = self::listStatus();
// little validation here just in case someone mess things
// up and there's a ghost status saved in DB
return isset($list[$this->status])
? $list[$this->status]
: $this->status;
}
/**
* Some actions will happen only if it's active, so I have
* this method for making things easier.
* Other status doesn't have a specific method because
* I usually don't compare agains them
* @return Boolean
*/
public function isActive()
{
return $this->status == self::STATUS_ACTIVE;
}
}
答案 3 :(得分:1)
每种方法都有优点和缺点。了解每一个都很好。
表 - 优点和缺点(AJReading&#39;方法):
使用常量:优点/缺点(Martin Bean&#39;方法):
我使用常量方法,但有时我认为如果我使用表格,我的代码可能会更清晰,更简单。这是一个艰难的电话。我希望有一个记录良好的解决方案,用于恒定方法,至少可以创建一致性,但我还没有见过。无论哪种方式,我都不认为这是正确或错误的答案。选择一个并继续使用它!
答案 4 :(得分:0)
对于这种性质的决定,请问自己:
“我的应用程序是否会有一个实例 感觉这些常数有不同的价值吗?“
e.g。测试环境,某种克隆,一些尚未定义但可能的未来版本......
如果该问题的答案为“是”,那么它应该可以进入应用程序配置。
如果不太可能,(或愚蠢)让值发生变化,它们属于,应该进入模型。
我建议在这种情况下,没有明智的理由让应用程序的版本具有不同的值,所以我将它放在模型中。