laravel 開發輔助工具

laravel 開發輔助工具

配置

添加服務提供商

將下面這行添加至 config/app.php 文件 providers 數組中:php

'providers' => [
  ...
  App\Plugins\Auth\Providers\LaravelServiceProvider::class
 ]

插件及文檔

Repository 模式

插件介紹

首先須要聲明的是設計模式和使用的框架以及語言是無關的,關鍵是要理解設計模式背後的原則,這樣才能無論你用的是什麼技術,都可以在實踐中實現相應的設計模式。laravel

按照最初提出者的介紹,Repository 是銜接數據映射層和領域層之間的一個紐帶,做用至關於一個在內存中的域對象集合。客戶端對象把查詢的一些實體進行組合,並把它 們提交給 Repository。對象可以從 Repository 中移除或者添加,就比如這些對象在一個 Collection 對象上進行數據操做,同時映射層的代碼會對應的從數據庫中取出相應的數據。git

從概念上講,Repository 是把一個數據存儲區的數據給封裝成對象的集合並提供了對這些集合的操做。github

Repository 模式將業務邏輯和數據訪問分離開,二者之間經過 Repository 接口進行通訊,通俗點說,能夠把 Repository 看作倉庫管理員,咱們要從倉庫取東西(業務邏輯),只須要找管理員要就是了(Repository),不須要本身去找(數據訪問),具體流程以下圖所示:web

建立 Repository

不使用緩存

php artisan make:repo User

使用緩存

php artisan make:repo User --cache
建立 UserRepository 時會詢問是否建立Model ,若是Model以存在,須要把 AppRepositoriesModulesUserProvider::class 的Model替換成當前使用的Model

配置Providers

將下面這行添加至 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

建立 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

請求參數:api

phone=18565215214&name=成龍&date=2018-08-21

生成的sql

WHERE (phone = 18565215214) AND (name like '成龍%') AND (date > '2018-05-05' AND status = 1)

Excels導出輔助插件

插件介紹

Excels導出輔助插件

建立 Excels

php artisan make:excel User

上面命令會建立一個 AppExcelsModulesUserExcel::class 的類

編寫Search

<?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 寫進日誌-事件

介紹

把sql語句記錄到日誌裏

使用

在 laravel 自帶的 EventServiceProvider 類裏 listen 添加

'Illuminate\Database\Events' => [
    'luffyzhao\laravelTools\Listeners\QueryListeners'
 ]

生成事件

php artisan event:generate

Controller Traits

介紹

controller公用方法

使用方法

在 AppHttpControllersController 類中 use luffyzhaolaravelToolsTraitsResponseTrait

Sign 加簽

插件介紹

請求參數加簽驗證

配置 Sign

若是你使用的是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');
    }
);
加簽方式

rsamd5

參數排序
  • 準備參數
  • 添加 timestamp 字段
  • 而後按照字段名的 ASCII 碼從小到大排序(字典序)
  • 生成 url 參數串
  • 拼接 key 而後 md5 或者 rsa

以下所示:

{
    "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&timestamp=2018-05-29 17:25:34

拼接 key :

aimncm=54854185&df4[0]=dfadsf&dfsd3a=56fdg&dfsd3a=56fdg&name=4sd65f4asd5f4as5df&timestamp=2018-05-29 17:25:34base64:Z9I7IMHdO+T9qD3pS492GWNxNkzCxinuI+ih4xC4dWY=

md5加密

ddab78e7edfe56594e2776d892589a9c

redis-token 認證

插件介紹

把token保存在redis。同時支持登陸過時時間設置,登陸以前,登陸以後事件處理。

配置 Auth guard

在 config/auth.php 文件中,你須要將 guards/driver 更新爲 redis-token:

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

...

'guards' => [
    'api' => [
        'driver' => 'redis-token',
        'provider' => 'users',
    ],
],

更改 Model

若是須要使用 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([], '退出成功');
    }

事件

方法

相關文章
相關標籤/搜索