业务逻辑

位置

位置 modules/{module}/src/action

注释

这里的注释在使用 PhpStorm/WebStorm 的时候可以自动生成 /** 所有的函数都需要按照这种格式来写

/**
 * 创建|编辑订单
 * @param array  $input      订单数据    <br />
 *      {String} title     订单标题      <br />
 *      {Int}    server_id 服务器ID      <br />
 * @param string $pay_pwd    支付密码
 * @param string $order_type 操控类型  [create|创建,edit|编辑]
 * @param string $type       支付密码传递方式
 * @return bool
 */
public function establish($input, $pay_pwd, $order_type, $type = 'plain')
{
   ...
}

这里需要注意的是, 如果是数组, 则需要按照如下的方式进行注释

数组注释 这里的注释方式和 Api 接口注释方式一致

*      {String} title     订单标题      <br />
*      {Int}    server_id 服务器ID      <br />

定义 code

Code 定义, Code 定义在 Action 文件中, Action 为 6 位的代码 例如错误代码为 100101, 一般对于 app 有独特错误的才会进行返回, 例如这里支付密码不正确, 需要重新设置/找回支付密码, app 拿到这个代码可以进行相应的提示, 而不能够根据返回的错误提示进行相应操作. 错误提示可以更改, 错误代码一旦定义则不能更改, 为了错误码集中统一使用单一的 AppError 来进行定义

10        # 代表的是模块的名称
  01      # 代表的是本模块的Action 编号
    01    # 代表本类的错误编码

必须返回值

这里的返回值必须是 true/false , 如果是需要获取返回数值, 需要定义 getXxx 方法来获取

// 使用
$Image = new Upload();
$image = (\Input::file('image'));
if ($Image->saveInput($image)) {
    return Resp::success('上传图成功!', [
        'url' => $Image->getUrl(),
    ]);
}

class 的定义

/**
 * 图片上传
 */
class Upload
{

    use AppTrait;

    protected $destination = '';


    /**
     * doWhat
     * 保存内容或者流方式上传
     * @param $content
     * @return bool
     */
    public function saveInput($content)
    {
        // 磁盘对象
        $Disk = $this->storage();
      // ..

        $this->destination = $fileRelativePath;
        return true;
    }

    /**
     * 图片url的地址
     * @return string
     */
    public function getUrl()
    {
        ...
        return config('app.url') . '/uploads/' . $this->destination;
        ...
    }
}

逻辑处理验证方式

这里我们以订单发布为例做下简单的说明 详细说明见注释 其中根据业务情况来进行处理, 有的可能不需要这种处理

// 这里的 input 是从控制器获取过来的, 不允许从请求中获取
public function establish($input, $pay_pwd, $order_type, $type = 'plain')
{
    /*
    |--------------------------------------------------------------------------
    | 验证用户权限
    |--------------------------------------------------------------------------
    */
    if (!$this->checkPam()) {
        // 需要明确的报错信息可以重写报错
        return $this->setError('无用户信息, 无法进行发单操作');
    }

   /*
    |--------------------------------------------------------------------------
    | 获取数据, 后边直接用到的在这里直接定义出来
    |--------------------------------------------------------------------------
    */
    $server_id       = (int) sys_get($input, 'server_id', 0);
    ...
    $order_current   = sys_get($input, 'order_title');

   /*
    |--------------------------------------------------------------------------
    | 和数据库字段相同的来组织数据
    |--------------------------------------------------------------------------
    */
    $dbInit = [
        'order_title'     => $order_title,
        ...
        'get_in_price' => sys_get($input, 'get_in_price'),
        'hour'         => (int) sys_get($input, 'order_number'),
    ];

    /*
    |--------------------------------------------------------------------------
    | 数据合法性校验
    |--------------------------------------------------------------------------
    */
    $validator = \Validator::make($dbInit, [
        'order_title'     => 'required|string',
        ...
        'source_id'       => 'numeric',
    ], [
        'order_title.required'    => '订单标题不能为空',
        'order_add_price.min'     => '溢价价格最低不能低于 1 元',
    ]);
    if ($validator->fails()) {
        return $this->setError($validator->errors());
    }

    /*
    |--------------------------------------------------------------------------
    | 数据服务端验证合法性
    |--------------------------------------------------------------------------
    */

    /* 游戏区服校验和完善
     -------------------------------------------- */
    $codeRef      = GameServer::codeRef();
    $collCodeRef  = new Collection($codeRef);
    $serverFilter = $collCodeRef->where('server_id', $server_id);
    if (!$serverFilter->count()) {
        return $this->setError('指定的游戏区服不存在');
    }

    /*
    |--------------------------------------------------------------------------
    | 操作权限验证 / 策略验证
    |--------------------------------------------------------------------------
    */
    if (!$this->policy('pubCreate', [$this->pam, $this->front])) {
        return false;
    }

    /*
    |--------------------------------------------------------------------------
    | 处理数据
    |--------------------------------------------------------------------------
    */
    try {
        \DB::transaction(function () use ($createData, $owner, $ownerPam, $totalNeedPrice) {

            ...
            /* 事务中抛出异常
           -------------------------------------------- */
            $this->order = DailianOrder::create($createData);
            if (!$this->order) {
                throw new TransactionException('创建订单失败, 请重试!');
            }
            ...
        });
        return true;
    } catch (\Throwable $e) {
        return $this->setError($e->getMessage());
    }
}

注意要点

Action 中不得存在 log 日志

Log 日志如果被 crontab 使用同时也被基本的信息错误调用便会出现权限不一致.

必须修复所有的编辑器代码错误提示

编辑器代码提示均可能存在 bug 或者优化项目

Action 命名

Action 命名不要和模型名称重复, 一般为一个单词, 例如账号管理使用 Pam 作为命名