Skip to content

Services

liaofei edited this page Jan 20, 2021 · 1 revision

Services

  • 定义

目录

\app\services

具体services下在分块,可以根据不同功能划分;默认这里创建的services所有应用都可以使用,如果不同应用想单独创建services,请在应用目录下创建services目录,再具体实现不同services类

services是具体实现某个特定功能,比如用户的列表查看搜索、用户注册、登录等等都是具体功能

services<->dao<->model<->table

和UserDao对应UserServices,只需要在构造方法中注入UserDao就可以

<?php

declare (strict_types=1);

namespace app\services\user;

use app\services\BaseServices;
use app\dao\user\UserDao;

/**
 *
 * Class UserServices
 * @package app\services\user
 */
class UserServices extends BaseServices
{

    /**
     * UserServices constructor.
     * @param UserDao $dao
     */
    public function __construct(UserDao $dao)
    {
        $this->dao = $dao;
    }
    public function getList()
    {

    }
}

具体查看列表功能应包括分页每一页数据,以及总条数;也就需要调用两个不同的dao方法

$list = $this->dao->getList($where,'*',$page,$limit);
$count = $this->dao->count($where);

每一个小的功能都可以定义为一个实现方法,比如:设置默认地址

/**
 * 设置默认定制
 * @param int $uid
 * @param int $id
 * @return bool
 */
public function setDefault(int $uid, int $id)
{
    if (!$this->getAddress($id)) {
        return false; //'地址不存在';
    }
    if (!$this->dao->update($uid, ['is_default' => 0], 'uid'))
        return false; //'取消原来默认地址';
    if (!$this->dao->update($id, ['is_default' => 1]))
        return false; //'设置默认地址失败';
    return true;
}

如果添加一个的地址,并选择了默认地址选项,则在添加的地址方法中调用setDefault方法

public function add($uid,$data)
{
    $data['uid] = $uid;
    $res = $this->dao->save($data);
    if(!$res)
        return false;
    if($data['is_default] == 1){
           $this->setDefault($uid,$res['id]);       
    }
    return true;
}

可以按照需要把不同功能点拆分为每一个方法,以实现代码的最大复用,不用重复造轮子

  • 使用

services可以在控制器中,也可以不同services之间互相调用(实现某一个复杂功能逻辑)

控制器中使用

也是在构造方法中注入当前services,比如UserControlle注入 UserServices

<?php
namespace app\api\controller\v1\user;

use app\Request;
use app\services\user\UserServices;

/**
* 用户类
* Class UserController
* @package app\api\controller\store
*/
class UserController
{
    protected $services = NUll;
    /**
    * UserController constructor.
    * @param UserServices $services
    */
    public function __construct(UserServices $services)
    {
        $this->services = $services;
    }
}

使用UserServices具体方法可以使用$this->services

$this->services->getList();

控制器中方法注入

某个特定方法注入某个services

/**
* 记录用户分享
* @param Request $request
* @return mixed
*/
public function user_share(Request $request, UserBillServices $services)
{
    $uid = (int)$request->uid();
    return app('json')->successful($services->setUserShare($uid));
}

UserBillServices用来记录每一次分享

不同services之间互相调用

首先引入需要使用的services

使用app()->make()来创建services类的实例

app()->make()使用:

/** @var UserLevelServices $userLevel */
$userLevel = app()->make(UserLevelServices::class);

整体具体使用:

<?php 
namespace app\services\user;
use app\services\BaseServices;
use app\dao\UserDao;
use app\services\user\UserBillServices;
class UserServices extends BaseServices
{
    /**
    * UserServices constructor.
    * @param UserDao $dao
    */
    public function __construct(UserDao $dao)
    {
        $this->dao = $dao;
    }
    /**
    * 新增用户 
    */
    pulbic funciotn serUser($data,$spreaUid = 0)
    {
        $res = $this->dao->save($data);
        if (!$res)
            return false;
        if ($spreadUid) {
            /** @var UserBillServices $userBill */
            $userBill = app()->make(UserBillServices::class);
            //邀请新用户增加经验
            $userBill->inviteUserIncExp((int)$spreadUid);
        }
        return $res;
     }
}
Clone this wiki locally