Laravel:2个模型1个控制器

时间:2019-02-20 15:57:06

标签: php laravel model-view-controller model controller

不一定与Laravel有关,但是,我正在一个网站上工作,用户可以在该网站上注册,并且可以根据需要订阅付费计划。

如果他们不订阅,他们仍然可以浏览网站并看到非常有限的内容(每篇文章仅几段)。

该网站有两种模式:用户和计划。最初的想法是允许用户从多个计划中进行选择,但是仅使用一个计划:“ Premium”。

当他们订阅计划时,他们将继续使用该计划,直到他们改变主意并每月收取费用。

我有一个具有以下方法的UserController:索引,创建,存储,显示,编辑,更新以及具有相同方法的UserPlanController。当用户决定取消对计划的订阅时,我只需调用UserPlanController :: update()即可将状态从“活动”更改为“已取消”。他们可能会保留为免费用户,也可能会取消其帐户(也将用户状态从“活动”更改为“已取消”)。

已要求我为后台代理创建一个“取消”按钮,该按钮将取消对付费计划的订阅并取消用户帐户(将两种状态都设置为“已取消”),但保留取消选项仅限订阅。

我当时只是想创建一个新的控制器并从中取消所有操作,但是我宁愿避免重复执行以下两个操作的代码,并且我已经为每个资源使用了一个控制器,所以我需要创建一个第三位控制器同时执行两项操作?

我要记住的另一个选项是只向两个端点发出两个ajax请求:单击“取消”-> Ajax请求取消订阅-> Ajax请求取消用户帐户,但我不确定如果这只是“骇客”的解决方法。

任何帮助将不胜感激,

预先感谢

2 个答案:

答案 0 :(得分:1)

首先,您应该为您的计划和用户提供一个模型,该模型仅处理这些数据结构上的操作。

UserController使用User模型,而UserPlanController使用Plan模型(和/或User模型)

现在您可以做的是,在UserController:cancelUserAccount函数中,您可以检查用户是否有计划,也可以取消该计划。

use User;
use Plan;

class UserController {
    public function cancelAccount(Request $request, User $user){
        $plans = Plan::where('user_id', $user->id);
        foreach($plans as $plan){
            $plan->destroy();
        }

        $user->destroy();
    }
}

答案 1 :(得分:0)

如果2个控制器使用相同的方法,请进行编辑,更新并消除它们无法访问的一些控制器,为什么不使用中间件?

您可以拥有一个控制器,并使用中间件定义访问权限。

然后,您可以将路由从一个计划分配到该中间件,并限制在那里的访问。您甚至可以使用route :: groups获得清晰的代码。

php artisan make:middleware paid

在handle方法上验证用户

在route.php文件上。

Route::group(['middleware'=>array('web','paid')],function(){
   //paid members routes...
   Route::get ....
});

Route::group(['middleware'=>array('web')],function(){
   //regular members routes...
   Route::get ....
});

我认为这将更易于维护,因为您将拥有1个方法的控制器,删除重复的动作并进行更多的组织。