如何在Laravel 4应用程序中实现订阅计划逻辑

时间:2014-05-16 23:51:42

标签: laravel implementation subscription saas

我目前正在开发基于订阅的应用程序,并且很想知道处理服务功能的最佳方式,以便订阅不同的计划。 这就是我目前正在做的事情,但我确信有更有效的方法:

在我的计划中' model我有以下功能:

public static function checkSubscription($route)
{
    $user = Sentry::getUser();
    $account = $user->account()->first();

    if($account->plan->id == 1) //Free Plan
    {
        switch($route) {

            case 'apiaries':
                //Fetch all apiaries for this account
                $apiaries = Apiary::where('account_id','=',$account->id);

                if($apiaries->count() >= 1){
                    Session::put('plan-message', 'You have reached your maximum number of Apiaries. To add more please upgrade your plan.');
                    return true;
                }else{
                    Session::forget('plan-message');
                    return false;
                }
                break;

            case 'harvests':
                //Fetch all harvests for this account
                $harvests = Harvest::where('account_id','=',$account->id);

                if($harvests->count() >= 1){
                    Session::put('plan-message', 'You have reached your maximum number of Harvests. To add more please upgrade your plan.');
                    return true;
                }else{
                    Session::forget('plan-message');
                    return false;
                }
                break;

            case 'tasks':
                //Fetch all tasks for this account
                $tasks = Task::where('account_id','=',$account->id);

                if($tasks->count() >= 1){
                    Session::put('plan-message', 'You have reached your maximum number of Tasks. To add more please upgrade your plan.');
                    return true;
                }else{
                    Session::forget('plan-message');
                    return false;
                }
                break;

            default:
                Session::forget('plan-message');
                break;
        }
    }
    Session::forget('plan-message');
}

然后从基本控制器调用它:

$ this-> hasAccess = Plan :: checkSubscription(Request :: segment(1));

然后我在视图文件中使用hasAccess变量来隐藏和显示按钮等

关于这种方法的想法?其他人如何处理不同的订阅计划?

1 个答案:

答案 0 :(得分:2)

静态方法和长切换语句可能表明您正在对应用程序设计采用非常“程序化”的方法 - 如果您的应用程序规模非常小且功能不太可能增长,这可能不是一个大问题。更面向对象的方法可以是采用上面的switch语句并用一些多态替换它。

我从上面猜测你已经为我称之为模块的每一个都有一个Model类,例如收获,任务等。你可以改为传递一个实例,而不是将路径字符串传递给函数。使用路径字符串创建的相关模块模型。然后,每个模块类型模型将具有类似countEntriesByAccount($ account-> id)的方法,然后您的switch语句将消失,例如。

public function checkSubscription($module_model_instance)
{
    $user = Sentry::getUser();
    $account = $user->account()->first();

    if($account->plan->id == 1) {

        if( $module_model_instance->countEntriesByAccount($account->id) >= 1){

            Session::put('plan-message', 'You have reached your maximum number of '.$module_model_instance->getModuleNamePlural() .'. To add more please upgrade your plan.');
            return true;

        }else{

             Session::forget('plan-message');
             return false;
        }
    }
}

这只是一个非常粗略和简单的介绍,仅基于提供的一小部分代码。很难从这个小片段中确切知道哪个类应该掌握关于如何判断特定订阅的状态和要采取的行动的业务逻辑 - 但希望它能让您开始考虑其他方法。

如果您确实想要沿着这条路走下去,您可能还想看看创建一个每个模块类型实现的接口,以确保它们在传递到上述方法之后都具有所需的方法 - http://www.php.net/manual/en/language.oop5.interfaces.php,并且键入提示您传入的对象是个好主意http://www.php.net/manual/en/language.oop5.typehinting.php

从您提供的小代码片段中很难说出为什么使用静态方法 - 您可能有很好的理由,但如果可以的话,最好避免使用静态函数 - 它们最终会结束作为全球变量的oop等价物并且可以使测试更加困难 - 不要被Laravel静态外墙所迷惑 - 这些是与你实现的直接静态功能不同的鱼群。