关于service逻辑层的实现方法请教,大家是否有更好的方法?
之前都是逻辑写在控制器里边,最近看了一些教程,目前是这样子在项目里边实现,不知道有什么缺点吗?大家是否有更好的方法?谢谢大家!
service逻辑层:
<?php
namespace App\Services;
use Illuminate\Support\Facades\DB;
/**
* 积分服务
* Class PointsService
* @package App\Services
*/
class PointsService //extends BaseService
{
//用户的积分排名
public static function getUserPointsRank($userId)
{
$sql = 'select c.rowno, c.user_id, c.sumPoint from (select @rowno:=@rowno+1 as rowno, a.user_id, a.sumPoint from (select (sum(point) + sum(extra_point)) as sumPoint , user_id from yt_points_record where type=1 GROUP BY user_id ORDER BY sumPoint desc) a, (select @rowno:=0) b) c WHERE c.user_id=?';
$rankQuery = DB::connection('mysql_wx')
->select($sql, [$userId]);
$result = [];
if ($rankQuery) {
foreach ($rankQuery as $key => $value) {
$result = [
'rank' => $value->rowno,
'user_id' => $value->user_id,
'point' => $value->sumPoint
];
break;
}
}
return $result;
}
}
控制器中使用
<?php
namespace App\Http\Controllers\YtUser;
use App\Http\Controllers\Controller;
use App\Models\Sign;
use Illuminate\Http\Request;
use App\Services\PointsService;
use Auth;
class SignController extends Controller
{
public function index(Sign $sign)
{
$userId = Auth::guard('ytuser')->user()->id;
//用户排行
$ranking = PointsService::getUserPointsRank($userId);
}
}
没啥问题,不过一般是在
construct
函数中实例化service
的,不写service
静态方法service
的抽离就是为了 解耦 和 复用,从这个两个角度出发去设计service
就没问题。