如果逻辑部分太长除了controller 把代码应该放在哪里?

所有教程都在强调尽量少把代码放在controller里面,但是除了放在controller里面还可以放在哪里? 例如下面的逻辑部分还要多很多

if ( !'如果章节收费')
    {
        //直接返回章节内容
        return ...
    }

    if (!'如果用户登陆')
    {
        //用户未登陆提示尚未登陆
        return ...
    }

    if ('用户已经购买过'){
        //直接返回章节内容
        return ...
    }

    if (!'判断用户未购买过 判断用户当前金币是否足够支付当前章节费用'){
        //用户金币不足提示充值
        return ...
    }


    //直接支付 并返回内容
    //Todo something for payment...
    return ...
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

app 目录下创建 Services 目录, XxxxxService 中写业务代码,一般简单项目直接写在 Controller 中就可以了

2年前 评论
wanwei 2年前
rufo 2年前
Su (作者) 2年前
李小明 (楼主) 2年前
Su (作者) 2年前
讨论数量: 43
    if ( !'如果章节收费')
    {
        //直接返回章节内容
        return ...
    }

    if (!'如果用户登陆')
    {
        //用户未登陆提示尚未登陆
        return ...
    }

    if ('用户已经购买过'){
        //直接返回章节内容
        return ...
    }

    if (!'判断用户未购买过 判断用户当前金币是否足够支付当前章节费用'){
        //用户金币不足提示充值
        return ...
    }


    //直接支付 并返回内容
    //Todo something for payment...
    return ...
2年前 评论
李小明 (楼主) 2年前

贴一下我自己的目录格式 :grin:

\app\Services 用于存放所有逻辑代码,封装的function等

\app\Helpers 用于存放工具类

\app\Filters 用于存放查询构造器条件过滤器

\app\Models 用于存放模型

\app\Modules 用于存放各端的模块,里面就是controller\request\resources

\app\Exceptions 用于存放公共异常处理和响应

1.框架有要求的尽量遵循框架给出的规范,对于开发者也方便

2.公司有划分要求,就根据公司的规则控制

3.其次自己怎么舒服就怎么规划就可以了

file

2年前 评论
李小明 (楼主) 2年前
ShiKi 2年前
sharejia (作者) 2年前
Swww18 2年前
bing 2年前
sharejia (作者) 2年前

减少else是laravel的风格

2年前 评论

提前的return,可以减少if else;鉴权这些通用的判断,可以放在中间件实现

2年前 评论
颠倒的玉石

1.判断章节收费就可以单起一个方法
2.用户登陆也是一个方法
3.查订单也是一个方法
你这个逻辑就是调用这三个方法

2年前 评论
李小明 (楼主) 2年前
九霄道长

逻辑层

2年前 评论

app 目录下创建 Services 目录, XxxxxService 中写业务代码,一般简单项目直接写在 Controller 中就可以了

2年前 评论
wanwei 2年前
rufo 2年前
Su (作者) 2年前
李小明 (楼主) 2年前
Su (作者) 2年前

所有 if 加一个 !, 把不满足的条件提现 return 掉.

2年前 评论

文章服务.php -> 收不收费 授权服务.php -> 是否登录 购买服务.php -> 是否购买过 金币服务.php -> 随便处理金币

laravel 有个很好的东西叫管道,可以利用起来。 将每个服务提供的功能写入数组然后加入管道。 这样,如果某个功能要修改,只需要改其中的服务PHP就可以,不影响其他的业务逻辑。 如果某个功能不需要只需要充管道数组里移除就可以了。把所有功能开发理解成为组件,把组件理解成为乐高玩具。任何代码都可插拔。

你这样各种if else 改一个地方可能会影响其他业务。

2年前 评论
aaccbb 2年前
ZShawn (作者) 2年前
李小明 (楼主) 2年前
codelin 2年前
if (! '如果章节收费')
   return   //直接返回内容

// ErrorMsg为自定义异常
// 个人喜欢用&& 代替if   
// ||代替if(!)
'如果用户登陆' || throw new \App\Exceptions\ErrorMsg("尚未登陆");

if( 用户已经购买过)
   return   //直接返回内容

// else (用户未购买)   else多余  因为购买过会被return了  后面必将是未购买

// 直接支付 并返回内容
2年前 评论
  • Controller
    • Logic
      • Service
    • Service

可以这样加一个 Logic 层来包装一下

2年前 评论

首先,控制器中就不应该包含这么多的 if 权限判断,应该用中间件把没有访问 权限 的用户拦截在请求外。
其次,业务逻辑尽量封装在 service 层。

2年前 评论
if  (不收费)  {返回}
if  (未登录)  {去登录}
if (购买过)  {返回}
//判断余额
if  (余额不足) {提示充值}
//购买
2年前 评论
## 业务分层(高内聚低耦合),controller控制层不处理业务逻辑
controller层接收和转发请求
service层处理业务逻辑
repository层操作模型
traits封装常用组件
2年前 评论
芝麻开门 2年前
如梦又似幻 2年前
如梦又似幻 2年前

###Controllers控制层

namespace App\Http\Controllers;

use App\Http\Controllers\BaseController;
use App\Services\EquipmentService;
use Illuminate\Http\Request;

class EquipmentController extends BaseController
{
    /**
     * @var Request
     */
    protected $request;

    /**
     * @var SService
     */
    protected $sService;

    public function __construct(Request $request, SService $sService)
    {
        $this->request = $request;
        $this->sService = $sService;
    }
    /**
     * @Author: 
     * @Time: 2021/9/28 15:28
     * @return mixed
     */
    public function list()
    {
        return $this->success($this->sService->list($this->request));
    }
}

###Services服务层
namespace App\Services;

use App\Exceptions\ApiException;
use App\Repositories\SRepository;
use Carbon\Carbon;

class SService
{
    /**
     * @var SRepository
     */
    protected $s;
    public function __construct(SRepository $s)
    {
        $this->s = $s;
    }

    public function list($request)
    {
        $where['status'] = (int)$request->input('status', '');
        $where['id'] = $request->input('id');
        $limit = (int)$request->input('limit', 15);

        $query = $this->s->query($where);
        $data = $query->orderByDesc('id')->paginate($limit);
        $list = array();
        if ($data->isNotEmpty()) {
            $list['data'] = array();
            $list['total'] = $data->total();
            $data = $data->toArray();
            foreach ($data['data'] as $key => $value) {
                array_push($list['data'], [
                    'id' => $value['id'],
                    'name' => $value['name'],
                    'status' => $value['status']
                ]);
            }
        }
        return $list;
    }
}

###Repositories模型层
namespace App\Repositories\S;

use App\Models\S;
use App\Repositories\Repository;

class SRepository extends Repository
{
    /**
     * Specify Model class name
     *
     * @return string
     */
    public function model()
    {
        return S::class; // 模型类
    }

    public function query($query){
         ……
         // 数据库查询操作
    }
2年前 评论

这个社区太可爱了,这么多人出谋划策

2年前 评论
    if ( !'如果章节收费')
    {
        //直接返回章节内容
        return ...
    }

    if (!'如果用户登陆')
    {
        //用户未登陆提示尚未登陆
        return ...
    }

    if ('用户已经购买过'){
        //直接返回章节内容
        return ...
    }

    if (!'判断用户未购买过 判断用户当前金币是否足够支付当前章节费用'){
        //用户金币不足提示充值
        return ...
    }


    //直接支付 并返回内容
    //Todo something for payment...
    return ...
2年前 评论
李小明 (楼主) 2年前

楼上的小伙伴发的改写条件判断语句,或者是使用service模式,service实现interface接口,调用数据仓库,数据仓库调用模型进行处理,控制器可以简单的做数据校验(存不存在,为不为空),service进行复杂的数据判断和处理,控制器调用service。

2年前 评论

我同楼上, service 进行复杂的数据判断和处理,控制器调用 service。

2年前 评论

我是把一些通用的判断比如是否登录放到中间件,通过路由来绑定。至于service这种看个人习惯和项目规模吧,喜欢一把梭并且项目不是很大就直接controller干,喜欢分层清楚严格按照开发规范来就分层搞,个人php项目喜欢一把梭 :joy:

2年前 评论

《如果用户登录》-放到中间件或者request验证中,剩下的逻辑可以写成一个服务,专门用来处理收费内容的东西

2年前 评论

不同策略 执行不能逻辑

2年前 评论

新建个service层,不想直接放在model

2年前 评论

贴一下我自己的目录格式 :grin:

\app\Services 用于存放所有逻辑代码,封装的function等

\app\Helpers 用于存放工具类

\app\Filters 用于存放查询构造器条件过滤器

\app\Models 用于存放模型

\app\Modules 用于存放各端的模块,里面就是controller\request\resources

\app\Exceptions 用于存放公共异常处理和响应

1.框架有要求的尽量遵循框架给出的规范,对于开发者也方便

2.公司有划分要求,就根据公司的规则控制

3.其次自己怎么舒服就怎么规划就可以了

file

2年前 评论
李小明 (楼主) 2年前
ShiKi 2年前
sharejia (作者) 2年前
Swww18 2年前
bing 2年前
sharejia (作者) 2年前

我们在controller->service->data->page 然后还有一个dao专门方model

data主要是数据库 缓存交互 page主要是curl

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!