將下面這行添加至 config/app.php 文件 providers 數組中:php
'providers' => [ ... App\Plugins\Auth\Providers\LaravelServiceProvider::class ]
首先須要聲明的是設計模式和使用的框架以及語言是無關的,關鍵是要理解設計模式背後的原則,這樣才能無論你用的是什麼技術,都可以在實踐中實現相應的設計模式。laravel
按照最初提出者的介紹,Repository 是銜接數據映射層和領域層之間的一個紐帶,做用至關於一個在內存中的域對象集合。客戶端對象把查詢的一些實體進行組合,並把它 們提交給 Repository。對象可以從 Repository 中移除或者添加,就比如這些對象在一個 Collection 對象上進行數據操做,同時映射層的代碼會對應的從數據庫中取出相應的數據。git
從概念上講,Repository 是把一個數據存儲區的數據給封裝成對象的集合並提供了對這些集合的操做。github
Repository 模式將業務邏輯和數據訪問分離開,二者之間經過 Repository 接口進行通訊,通俗點說,能夠把 Repository 看作倉庫管理員,咱們要從倉庫取東西(業務邏輯),只須要找管理員要就是了(Repository),不須要本身去找(數據訪問),具體流程以下圖所示:web
php artisan make:repo User
php artisan make:repo User --cache
建立 UserRepository 時會詢問是否建立Model ,若是Model以存在,須要把 AppRepositoriesModulesUserProvider::class 的Model替換成當前使用的Model
將下面這行添加至 AppProvidersAppServiceProvider::class 文件 register 方法中:redis
public function register() { $this->app->register(\App\Repositories\Modules\User\Provider::class); }
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Repositories\Modules\User\Interfaces; class HomeController extends Controller { protected $repo = null; public function __construct(Interfaces $repo) { $this->repo = $repo; } public function index(Request $request){ return $this->respondWithSuccess($this->repo->get(['*'])); } }
配合 Search 更靈活
public function index(Request $request){ return $this->respondWithSuccess( $this->repo->getwhere( new IndexSearch($request->olny(['name'])) , ['*'] ) ); }
參考 Repository 方法
把表單提交的一些參數傳換成 where
語句.sql
生成一個UserController::index控制器使用的搜索輔助類數據庫
php artisan make:search User\IndexSearch
上面命令會建立一個 AppSearchsModulesUserIndexSearch::class 的類設計模式
建立Search時,建議根據 ControllerActionSearch 的格式建立。
<?php namespace App\Searchs\Modules\User; use luffyzhao\laravelTools\Searchs\Facades\SearchAbstract; class IndexSearch extends SearchAbstract { protected $relationship = [ 'phone' => '=', 'name' => 'like', 'date' => 'between' ]; public function getNameAttribute($value) { return $value . '%'; } public function getDateAttribute($value){ return function ($query){ $query->where('date', '>', '2018-05-05')->where('status', 1); }; } }
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Repositories\Modules\User\Interfaces; use App\Searchs\Modules\User\IndexSearch; class HomeController extends Controller { protected $repo = null; public function __construct(Interfaces $repo) { $this->repo = $repo; } public function index(Request $request){ return $this->respondWithSuccess( $this->repo->getWhere( new IndexSearch( $request->only(['phone', 'name', 'date']) ), ['*'] ) ); } }
請求參數:api
phone=18565215214&name=成龍&date=2018-08-21
生成的sql
WHERE (phone = 18565215214) AND (name like '成龍%') AND (date > '2018-05-05' AND status = 1)
Excels導出輔助插件
php artisan make:excel User
上面命令會建立一個 AppExcelsModulesUserExcel::class 的類
<?php namespace App\Excels\Modules; use App\Excels\Facades\ExcelAbstract; use App\Repositories\Modules\User\Interfaces; use App\Searchs\Modules\User\ExcelSearch; class CarExcel extends ExcelAbstract { public function __construct(Interfaces $repo) { parent::__construct($repo); } /** * Excel標題列 * @return {[type]} [description] */ public function headings() { return ['ID','手機號碼','姓名']; } /** * @param mixed $row * * @return array */ public function map($row) { return [ $row->id, $this->phone, $this->name ]; } /** * 搜索參數 * @return {[type]} [description] */ protected function getAttributes() { return new ExcelSearch(request()->only([ 'phone', 'name', ])); } }
更多用法 請參考 maatwebsite/excel
把sql語句記錄到日誌裏
在 laravel 自帶的 EventServiceProvider 類裏 listen 添加
'Illuminate\Database\Events' => [ 'luffyzhao\laravelTools\Listeners\QueryListeners' ]
php artisan event:generate
controller公用方法
在 AppHttpControllersController 類中 use luffyzhaolaravelToolsTraitsResponseTrait
請求參數加簽驗證
若是你使用的是md5加簽方式請在config/app.php文件中,添加 sign_key 配置。若是你使用的是Rsa加簽方式請在config/app.php文件中,添加app.sign_rsa_private_key和app.sign_rsa_public_key配置
在app/Http/Kernel.php文件中,您須要把 'sign' => luffyzhaolaravelToolsMiddlewareVerifySign::class, 添加到$routeMiddleware屬性中
<?php Route::group( ['middleware' => 'sign:api'], function($route){ Route::get('xxx', 'xxx'); } );
rsa
和 md5
timestamp
字段url
參數串以下所示:
{ "name": "4sd65f4asd5f4as5df", "aimncm": "54854185", "df4": ["dfadsf"], "dfsd3": { "a": { "gfdfsg": "56fdg", "afdfsg": "56fdg" } } }
排序後:
{ "aimncm": "54854185", "df4": ["dfadsf"], "dfsd3": { "a": { "afdfsg": "56fdg", "gfdfsg": "56fdg" } }, "name": "4sd65f4asd5f4as5df", "timestamp": "2018-05-29 17:25:34" }
生成url參數串:
aimncm=54854185&df4[0]=dfadsf&dfsd3a=56fdg&dfsd3a=56fdg&name=4sd65f4asd5f4as5df×tamp=2018-05-29 17:25:34
拼接 key :
aimncm=54854185&df4[0]=dfadsf&dfsd3a=56fdg&dfsd3a=56fdg&name=4sd65f4asd5f4as5df×tamp=2018-05-29 17:25:34base64:Z9I7IMHdO+T9qD3pS492GWNxNkzCxinuI+ih4xC4dWY=
md5加密
ddab78e7edfe56594e2776d892589a9c
把token保存在redis。同時支持登陸過時時間設置,登陸以前,登陸以後事件處理。
在 config/auth.php 文件中,你須要將 guards/driver 更新爲 redis-token:
'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], ... 'guards' => [ 'api' => [ 'driver' => 'redis-token', 'provider' => 'users', ], ],
若是須要使用 redis-token 做爲用戶認證,咱們須要對咱們的 User 模型進行一點小小的改變,實現一個接口,變動後的 User 模型以下:
<?php namespace App\Model; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; use luffyzhao\laravelTools\Auths\Redis\RedisTokeSubject; class User extends Authenticatable implements RedisTokeSubject { public function getIdentifier(){ return $this->getKey(); } }
/** * 登陸 * @method store * @param StoreRequest $request * * @return \Illuminate\Http\JsonResponse * * @author luffyzhao@vip.126.com */ public function store(StoreRequest $request) { $token = auth('api')->attempt( $request->only(['phone', 'password']) ); if (!$token) { return $this->respondWithError('用戶不存在,或者密碼不正確!'); } return $this->respondWithToken((string) $token); }
/** * 退出登陸. * * @method logout * * @return \Illuminate\Http\JsonResponse * * @author luffyzhao@vip.126.com */ public function logout() { auth('api')->logout(); return $this->respondWithSuccess([], '退出成功'); }