【问题标题】:Laravel: 2 models 1 controllerLaravel:2 个模型 1 个控制器
【发布时间】:2019-07-14 09:13:16
【问题描述】:

不一定只与 Laravel 相关,但我正在开发一个用户可以注册的网站,如果他们愿意,他们可以订阅付费计划。

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

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

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

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

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

我想只创建一个新控制器并从中取消这两项操作,但我希望避免重复执行这两个操作的代码,并且我已经为每个资源创建了一个控制器,所以我需要创建一个第三个控制器来做这两个动作?

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

任何帮助将不胜感激,

提前致谢

【问题讨论】:

  • 从我的角度来看,我不认为你需要另一个控制器,而不是你可以在 UserController 中做的。因为这些事情是由用户完成的。

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


【解决方案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();
    }
}

【讨论】:

  • 感谢您的回复@William Randokun。在用户控制器中,我只有一个 update() 方法,可以更新任何用户字段(电子邮件、姓名以及状态)。我是否需要创建一个单独的方法来取消帐户(这基本上是将状态从“活动”更改为“已取消”)?
  • 如果你的 update() 函数只更新用户上的东西,那很好,你可能应该保持这种状态。但是您可以创建一个新函数 combineUpdate() 来调用 User->update 函数,还可以创建处理订阅的代码。然后,如果您总是想在修改用户时也处理计划,那么您总是可以使用 combineUpdate() 方法。
【解决方案2】:

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

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

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

php artisan make:middleware paid

关于句柄方法验证用户

在 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 个控制器用于方法、删除重复操作并进行更多组织。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多