不一定与Laravel有关,但是,我正在一个网站上工作,用户可以在该网站上注册,并且可以根据需要订阅付费计划。
如果他们不订阅,他们仍然可以浏览网站并看到非常有限的内容(每篇文章仅几段)。
该网站有两种模式:用户和计划。最初的想法是允许用户从多个计划中进行选择,但是仅使用一个计划:“ Premium”。
当他们订阅计划时,他们将继续使用该计划,直到他们改变主意并每月收取费用。
我有一个具有以下方法的UserController:索引,创建,存储,显示,编辑,更新以及具有相同方法的UserPlanController。当用户决定取消对计划的订阅时,我只需调用UserPlanController :: update()即可将状态从“活动”更改为“已取消”。他们可能会保留为免费用户,也可能会取消其帐户(也将用户状态从“活动”更改为“已取消”)。
已要求我为后台代理创建一个“取消”按钮,该按钮将取消对付费计划的订阅并取消用户帐户(将两种状态都设置为“已取消”),但保留取消选项仅限订阅。
我当时只是想创建一个新的控制器并从中取消所有操作,但是我宁愿避免重复执行以下两个操作的代码,并且我已经为每个资源使用了一个控制器,所以我需要创建一个第三位控制器同时执行两项操作?
我要记住的另一个选项是只向两个端点发出两个ajax请求:单击“取消”-> Ajax请求取消订阅-> Ajax请求取消用户帐户,但我不确定如果这只是“骇客”的解决方法。
任何帮助将不胜感激,
预先感谢
答案 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个方法的控制器,删除重复的动作并进行更多的组织。