laravel 开发辅助工具
配置
添加服务提供商
将下面这行添加至 config/app.php 文件 providers 数组中:
'providers' => [
...
App\Plugins\Auth\Providers\LaravelServiceProvider::class
]
插件及文档
Repository 模式
插件介绍
首先需要声明的是设计模式和使用的框架以及语言是无关的,关键是要理解设计模式背后的原则,这样才能不管你用的是什么技术,都能够在实践中实现相应的设计模式。
按照最初提出者的介绍,Repository 是衔接数据映射层和领域层之间的一个纽带,作用相当于一个在内存中的域对象集合。客户端对象把查询的一些实体进行组合,并把它 们提交给 Repository。对象能够从 Repository 中移除或者添加,就好比这些对象在一个 Collection 对象上进行数据操作,同时映射层的代码会对应的从数据库中取出相应的数据。
从概念上讲,Repository 是把一个数据存储区的数据给封装成对象的集合并提供了对这些集合的操作。
Repository 模式将业务逻辑和数据访问分离开,两者之间通过 Repository 接口进行通信,通俗点说,可以把 Repository 看做仓库管理员,我们要从仓库取东西(业务逻辑),只需要找管理员要就是了(Repository),不需要自己去找(数据访问),具体流程如下图所示:
创建 Repository
不使用缓存
php artisan make:repo User
使用缓存
php artisan make:repo User --cache
创建 UserRepository 时会询问是否创建Model ,如果Model以存在,需要把 AppRepositoriesModulesUserProvider::class 的Model替换成当前使用的Model
配置Providers
将下面这行添加至 AppProvidersAppServiceProvider::class 文件 register 方法中:
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
语句.
创建 Search
生成一个UserController::index控制器使用的搜索辅助类
php artisan make:search User\IndexSearch
上面命令会创建一个 AppSearchsModulesUserIndexSearch::class 的类
创建Search时,建议根据 ControllerActionSearch 的格式创建。
编写Search
<?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);
};
}
}
使用Search
<?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'])
),
['*']
)
);
}
}
生成的sql
请求参数:
phone=18565215214&name=成龙&date=2018-08-21
生成的sql
WHERE (phone = 18565215214) AND (name like '成龙%') AND (date > '2018-05-05' AND status = 1)
<h2>Excels导出辅助插件</h2> <h3>插件介绍</h3> <p>Excels导出辅助插件</p> <h3>创建 Excels</h3>
php artisan make:excel User
<p>上面命令会创建一个 AppExcelsModulesUserExcel::class 的类</p> <h3>编写Search</h3>
<?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', ])); }
}
<blockquote>更多用法 请参考 <a href="https://github.com/Maatwebsite/Laravel-Excel" rel="nofollow noreferrer">maatwebsite/excel</a> </blockquote> <h2>Sql 写进日志-事件</h2> <h3>介绍</h3> <p>把sql语句记录到日志里</p> <h3>使用</h3> <p>在 laravel 自带的 EventServiceProvider 类里 listen 添加</p>
'Illuminate\Database\Events' => [
'luffyzhao\laravelTools\Listeners\QueryListeners'
]<h3>生成事件</h3>
php artisan event:generate
<h2>Controller Traits</h2> <h3>介绍</h3> <p>controller公用方法</p> <h3>使用方法</h3> <p>在 AppHttpControllersController 类中 use luffyzhaolaravelToolsTraitsResponseTrait</p> <h2>Sign 加签</h2> <h3>插件介绍</h3> <p>请求参数加签验证</p> <h3>配置 Sign</h3> <p>如果你使用的是md5加签方式请在config/app.php文件中,添加 sign_key 配置。如果你使用的是Rsa加签方式请在config/app.php文件中,添加app.sign_rsa_private_key和app.sign_rsa_public_key配置</p> <h3>配置中间件</h3> <p>在app/Http/Kernel.php文件中,您需要把 'sign' => luffyzhaolaravelToolsMiddlewareVerifySign::class, 添加到$routeMiddleware属性中</p> <h3>使用</h3>
<?php
Route::group(
['middleware' => 'sign:api'],
function($route){
Route::get('xxx', 'xxx');
}
);<h5>加签方式</h5> <p><code>rsa</code> 和 <code>md5</code></p> <h5>参数排序</h5> <ul> <li>准备参数</li> <li>添加 <code>timestamp</code> 字段</li> <li>然后按照字段名的 ASCII 码从小到大排序(字典序)</li> <li>生成 <code>url</code> 参数串</li> <li>拼接 key 然后 md5 或者 rsa</li> </ul> <p>如下所示:</p>
{
"name": "4sd65f4asd5f4as5df",
"aimncm": "54854185",
"df4": ["dfadsf"],
"dfsd3": {
"a": {
"gfdfsg": "56fdg",
"afdfsg": "56fdg"
}
}
}<p>排序后:</p>
{
"aimncm": "54854185",
"df4": ["dfadsf"],
"dfsd3": {
"a": {
"afdfsg": "56fdg",
"gfdfsg": "56fdg"
}
},
"name": "4sd65f4asd5f4as5df",
"timestamp": "2018-05-29 17:25:34"
}<p>生成url参数串:</p> <blockquote>aimncm=54854185&df4[0]=dfadsf&dfsd3a=56fdg&dfsd3a=56fdg&name=4sd65f4asd5f4as5df&timestamp=2018-05-29 17:25:34</blockquote> <p>拼接 key :</p> <blockquote>aimncm=54854185&df4[0]=dfadsf&dfsd3a=56fdg&dfsd3a=56fdg&name=4sd65f4asd5f4as5df&timestamp=2018-05-29 17:25:34base64:Z9I7IMHdO+T9qD3pS492GWNxNkzCxinuI+ih4xC4dWY=</blockquote> <p>md5加密</p> <blockquote>ddab78e7edfe56594e2776d892589a9c</blockquote> <h1>redis-token 认证</h1> <h3>插件介绍</h3> <p>把token保存在redis。同时支持登录过期时间设置,登录之前,登录之后事件处理。</p> <h3>配置 Auth guard</h3> <p>在 config/auth.php 文件中,你需要将 guards/driver 更新为 redis-token:</p>
'defaults' => [
'guard' => 'api',
'passwords' => 'users',],...
'guards' => [
'api' => [
'driver' => 'redis-token',
'provider' => 'users',
],],<h3>更改 Model</h3> <p>如果需要使用 redis-token 作为用户认证,我们需要对我们的 User 模型进行一点小小的改变,实现一个接口,变更后的 User 模型如下:</p>
<?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();
}
}<h3>登录</h3>
/**
* 登录
* @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); }
<h3>退出</h3>
/**
* 退出登录.
@method logout
@return \Illuminate\Http\JsonResponse
@author luffyzhao@vip.126.com
*/
public function logout()
{
auth('api')->logout();return $this->respondWithSuccess([], '退出成功'); }
```
事件
方法
原文地址:https://segmentfault.com/a/1190000015903727