UserController<?php
namespace AppHttpController;
class UserController extends Controller{
public $request;
protected $userService;
public function __construct(Request $request, UserService $userService)
{$this->request = $request;
$this->userService = $userService;
}
public function register()
{
//... validationreturn $this->userService->register ($this->request->all());
}
}复制代码
UserService<?php
namespace AppService;
class UserService{
public function register($data)
{ $username = $data['username']; $password = $data['password'];
$password = encrypt ($password);
$user = new User();$user->username = $username;$user->password = $password;$result = $user->save();return $result;
}
}复制代码
到现在为止,我们至少将业务与请求彻底分开了。但还是不如人意,如果把所有的业务及CURD全部写在Service中,那只不过是将Controller的臃肿转移到了Service,那Service就没有什么存在意义了。
所以我们需要继续分割Service,将对数据库的R操作独立出来,因为CUD的操作基本是一贯不变的,而R操作根据业务的复杂度则变的多姿多彩。所以独立R操作。这个时候我们引用Repository的概念。
Repository
我们使用Repository辅助Model,将相关的查询逻辑封装到不同的repository中,方便逻辑代码的维护符合SOLID的单一原则
符合SOLID的依赖反转UserController<?php
namespace AppHttpController;
class UserController extends Controller{
public $request;
protected $userService;
public function __construct(Request $request, UserService $userService)
{$this->request = $request;
$this->userService = $userService;
}
public function getUserInfo()
{
//... validationreturn $this->userService->getUserInfo ($this->request->all());
}
}复制代码
UserService<?php
namespace AppService;
class UserService{
public $userRepository;
public function __construct(UserRepository $userRepository){ $this->userRepository = $userRepository;
}
public function getUserInfo()
{ return $this->userRepository->getUserInfo($data);
}
}复制代码
UserRepository<?php
namespace AppRepository;
class UserRepository{
public function getUserInfo($data)
{ $userId = $data['user_id']; $result = User::where('id',$userId)->first();
return $result;
}
}复制代码
解决了R的问题,有人就问了,难道因为CUD比较统一简单就可以放在一起了吗?答案是NO,我们引用一个新的名词Action。
Action这是看了@Charlie_Jade的文章才学到的
独立每个操作文件,例如CreateUser,DeleteUser,UpdateUser符合SOLID的单一原则UserController<?php
namespace AppHttpController;
class UserController extends Controller{
public $request;
protected $userService;
public function __construct(Request $request, UserService $userService)
{$this->request = $request;
$this->userService = $userService;
}
public function register(){
//... validation return $this->userService->register($this->request->all());
}
public function getUserInfo()
{return $this->userService->getUserInfo ($this->request->all());
}
}复制代码
UserService<?php
namespace AppService;
class UserService{
public function getUserInfo(UserRepository $userRepository)
{ return $this->userRepository->getUserInfo($data);
}
public function register(){ $result = (new CreateUser())->execute($this->request->all());
return $result;
}
}复制代码
UserRepository<?php
namespace AppRepository;
class UserRepository{
public function getUserInfo($data)
{ $userId = $data['user_id']; $result = User::where('id',$userId)->first();
return $result;
}
}复制代码
CreateUser<?php
namespace AppAction;
use AppModelMember;
class CreateUser extends CreateUserWallet
{
public function execute(array $data)
{$models = new Member();$models->tel = $data['tel'];$models->password = $data['password'];$result = $models->save ();
return $result;
}
}复制代码
以上代码逻辑见下图Common
译为公共的,常用的,再部分开发中,你可能需要一些公共的方法(并非公共的类,例如邮件发送等,用他并不合适),比如查询用户余额,查询用户是否注册或者是否在线,生成订单号等。使用Common更要简单。他更像一个公共函数库的样子