我正在使用Laravel 4.2构建一个PHP应用程序。该应用程序允许用户访问网站并提交唯一代码。提交代码时,会向他们提供他们已获得的奖励。奖励可能会有所不同,例如“下次购买时减价10%”,“免费T恤”,“下次购买时免运费”等。
我的应用程序中有一个Code
模型,它是用户最初提交的唯一代码的模型。因此,应用程序的第一步是检查他们提交的代码,确保它存在于数据库中,然后回复他们有资格获得的可能奖励列表。
我的第一个想法是拥有一个Reward
模型和一个rewards
表来存储数据库中的可用奖励,然后在提交其唯一代码后向用户显示相关的奖励。在我的模板中有这样的东西:
<ul>
@foreach($rewards as $reward)
<li>{{ $reward->name }}</li>
<li>{{ $reward->value }}</li>
<li>{{ $reward->redemption_instructions }}</li>
@endforeach
</ul>
但是,我现在认为让每个奖励设置为自己的班级实际上更方便。这样我就可以根据需要为每种奖励类型构建尽可能多的自定义功能。因此,例如,每个奖励类都有一个名为display()
的方法,该方法将输出必要的html以向用户显示奖励。在这种情况下,我的模板看起来像这样:
<ul>
@foreach($rewards as $reward)
<li>{{ $reward->display() }}</li>
@endforeach
</ul>
我正在试图弄清楚如何设置,以便它们以这种方式运行。我打算设置课程来存储每个奖励所需的信息。例如,一个可能看起来像这样:
class TenPercentOffNextOrderReward {
private $name = '10% Off Your Next Order';
private $description = 'Take 10% off your next order on our website!';
public function createCoupon() {
// create a coupon for this reward
}
}
class FreeShirtReward {
private $name = 'Free T-Shirt';
private $description = 'Get a free t-shirt!';
public function sendShirt() {
// send tshirt to customer
}
}
因此,正如您所看到的,每种奖励类型都有不同的功能。这是处理此类设置的最佳方法吗?我的rewards
表是否应该存储所有奖励的不同类名?我甚至需要rewards
表吗?
答案 0 :(得分:0)
根据我的经验,拥有包含任何冗余数据(如名称,描述等)的数据的表格是更好的做法,因为这也有助于以后能够使用网络界面输入新的奖励。然后应该使用一些服务器端逻辑(就像你在上面的类中所做的那样)来指定特定于奖励的显示规则,或者只是使用某种模板机制并通过你将存储在你的模板中引用它们。实际上,即使template_id也可以与数据库中的查找表中的匹配模板一起存储,这样也可以在将来进行编辑。
因此,我不仅将其保留在数据库中,而且如果您想自定义显示模板,您可以考虑增强数据库以适应它而不是将其削减。
一般来说,数据库表适用于存储具有相似属性(如可能的奖励)的多个实例,并且类适用于定义行为(它们如何显示),因此您不会错误地处理错误考虑使用类的路径,但我只是确保在数据库中实际存储有关这些奖励的数据,并且只处理它们在编程代码中的行为,而不是数据本身。
答案 1 :(得分:0)
如果奖励可能有自己的业务逻辑(比如发送衬衫),那么最好使用类。
interface RewardInterface
{
public function getName();
public function getDescription();
public function reward();
}
class NextOrderReward implements RewardInterface
{
private $percent;
public function __construct($percent = 10)
{
$this->percent = $percent;
}
public function getName()
{
return $this->percent.'% Off Your Next Order';
}
public function getDescription()
{
return 'Take '.$this->percent.'% off your next order on our website!';
}
public function reward()
{
// create coupon
}
}
class FreeShirtReward implements RewardInterface
{
public function getName()
{
return 'Free T-Shirt';
}
public function getDescription()
{
return 'Get a free t-shirt!';
}
public function reward()
{
// send tshirt to customer
}
}
使用。
$rewards = [new NextOrderReward(), new NextOrderReward(20), new FreeShirtReward()];
<ul>
@foreach($rewards as $reward)
<li>{{ $reward->getName() }} <span>{{ $reward->getDescription() }}</span></li>
@endforeach
</ul>
一次实例化所有RewardInterface
个班级。当然,所有构造函数都应该没有参数。
$rewards = [];
foreach (get_declared_classes() as $className) {
if (in_array('RewardInterface', class_implements($className))) {
$rewards[] = new $className();
}
}
注意,如果没有特定的奖励业务逻辑,使用类可能会过度工程。