laravel(商)城代码优化 Repository 模式
优点:使Controller层更加解耦和易读
第1步 配置composer.json
"infyomlabs/laravel-generator": "dev-master",
"laravelcollective/html": "5.4.*",
"infyomlabs/core-templates": "dev-master",
"infyomlabs/swagger-generator": "dev-master",
"jlapp/swaggervel": "dev-master",
"doctrine/dbal": "~2.3",
"infyomlabs/generator-builder": "dev-master"
"laravelcollective/html": "5.4.*",
"infyomlabs/core-templates": "dev-master",
"infyomlabs/swagger-generator": "dev-master",
"jlapp/swaggervel": "dev-master",
"doctrine/dbal": "~2.3",
"infyomlabs/generator-builder": "dev-master"
第2步 App目录下新建Repositories
第3步 Repositories目录下新建GoodsListRepository .php
第4步 实现抽象类
namespace App\Repositories;
use App\Models\Shop\GoodsModel;
use InfyOm\Generator\Common\BaseRepository;
/**
* BaseRepository继承BaseRepository抽象类
* BaseRepository抽象类实现接口*RepositoryInterface,RepositoryCriteriaInterface
**/
class GoodsListRepository extends BaseRepository{
public function model()
{
return GoodsModel::class;
}
public function getGoodsListByCategoryID($id){
$goods_list=GoodsModel::where(‘category_id‘,$id)->get();
return $goods_list;
}
}
$category_id=9;
$good_list=$this->goodsListRepo->getGoodsListByCategoryID($category_id);
return view(‘m.shop.good_list‘)->with(‘good_list‘,$good_list);
}
class GoodsListRepository extends BaseRepository{
public function model()
{
return GoodsModel::class;
}
public function getGoodsListByCategoryID($id){
$goods_list=GoodsModel::where(‘category_id‘,$id)->get();
return $goods_list;
}
}
第5步 构造
use App\Repositories\GoodsListRepository
protected $goodsListRepo;
public function __construct(GoodsListRepository $goodsListRepository)
{
$this->goodsListRepo = $goodsListRepository;
}
public function __construct(GoodsListRepository $goodsListRepository)
{
$this->goodsListRepo = $goodsListRepository;
}
第6步 正常使用啦
/***
* @param Request $request @分类id
* @return @格式collect @分类商品详情列表
*/
public function getGoodsList(Request $request){
/***
* @param Request $request @分类id
* @return @格式collect @分类商品详情列表
*/
public function getGoodsList(Request $request){
$category_id=9;
$good_list=$this->goodsListRepo->getGoodsListByCategoryID($category_id);
return view(‘m.shop.good_list‘)->with(‘good_list‘,$good_list);
}
深入理解控制反转(IoC)和依赖注入(DI)
定义接口
interface SuperModuleInterface { /** * 超能力激活方法 * * 任何一个超能力都得有该方法,并拥有一个参数 *@param array $target 针对目标,可以是一个或多个,自己或他人 */ public function activate(array $target); }
实现接口创建类
/** * X-超能量 */ class XPower implements SuperModuleInterface { public function activate(array $target) { // 这只是个例子。。具体自行脑补 } } /** * 终极炸弹 (就这么俗) */ class UltraBomb implements SuperModuleInterface { public function activate(array $target) { // 这只是个例子。。具体自行脑补 } }
对超人初始化的方法进行改造:
class Superman { protected $module; public function __construct(SuperModuleInterface $module) { $this->module = $module; } }
什么叫做依赖注入?
本文从开头到现在提到的一系列依赖,只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于依赖注入(DI) 。是不是豁然开朗?事实上,就是这么简单。下面就是一个典型的依赖注入:
// 超能力模组 $superModule = new XPower; // 初始化一个超人,并注入一个超能力模组依赖 $superMan = new Superman($superModule);