在数据库中存储数据与在类

时间:2015-06-10 17:43:13

标签: php laravel-4

我正在使用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表吗?

2 个答案:

答案 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();
    }
}

注意,如果没有特定的奖励业务逻辑,使用类可能会过度工程。