thinkphp5.1注解插件


前言:

thinkphp5.1中用注解的方式實現:

v0.1.0版本

  • 數據驗證器
  • 請求過濾、格式化
  • 屬性對象注入

dev-master版本 額外支持

  • 自動事務
  • 數據緩存

 

如果您覺得好用,點個star哈
github地址:https://github.com/cshaptx4869/thinkphp-annotation

 

安裝

穩定版:composer require cshaptx4869/thinkphp-annotation
最新版:composer require cshaptx4869/thinkphp-annotation:dev-master

配置

tags.php 添加行為用於控制器注解掃描

'action_begin' => [
     \Fairy\ControllerAnnotationScaner::class
]

模型中使用注解的話要 在模型中引入 ModelAnnotationScaner  的trait

use \Fairy\ModelAnnotationScaner;

添加 system.php 配置文件(可選)

return [
    'annotation' => [
        'cache' => false,// 是否開啟注解讀取緩存,默認false
        'writelist' => []// 注解讀取白名單,默認[]
        'interceptor' => [// 注解攔截器相關配置
            'enable' => true,// 默認開啟注解攔截器
            'whitelist' => []// 注解攔截器白名單,默認[]
        ],
        'validate' => [
            'callback' => function($msg) {
                // 自定義驗證錯誤信息后續處理
            }
        ]
    ]
]

PS:默認驗證器注解驗證不通過會終止程序運行並返回json格式的驗證錯誤信息。可通過配置 callback函數自定義后續處理。請注意,不同版本使用上會有些許差別。

支持的注解

v0.1.0
注解名 申明范圍 作用
@Autowire 屬性 自動注入類對象
@DynamicAutowire 方法 聲明當前方法允許屬性注入的類
@IgnoreAutowire 方法 聲明當前方法忽略屬性注入的類
@RequestParam 方法 過濾、格式化請求參數
@Validator 方法 驗證器驗證

                              

dev-master
注解名 申明范圍 作用
@Autowire 屬性 自動注入類對象
@Transaction 方法 開啟事務返回值等價於true就會自動commit,否則rollback
@RequestParam 方法 過濾、格式化請求參數
@Validator 方法 驗證器驗證
@DataCache 方法 方法數據緩存

版本差異:

dev-master新增:

Transaction 注解

Transaction 注解根據當前方法返回值自動判斷事務后續處理,如返回值等價於true就會自動commit,否則rollback。

Transaction 注解需要搭配 Autowire注解使用,且不支持在控制器中使用,推薦在模型中使用。

DataCache 注解

被DataCache注解修飾的方法的返回數據會被緩存。

ModelAnnotationScaner

支持模型中使用屬性注解

 

Autowire 注解改動:

v0.1.0 版本中 Autowire 注解必須寫class屬性,如 Autowire(class=ArticleModel::class),而在v0.1.1版本中 Autowire 注解則沒有class屬性而是通過@var ArticleModel 注解來自動識別。

使用 dev-master 版本

ArticleController 控制器:

<?php

namespace app\index\controller;

use app\index\validate\Article\SaveValidate;
use app\common\model\ArticleModel;
// 引入對應的注解
use Fairy\Annotation\Autowire;
use Fairy\Annotation\RequestParam;
use Fairy\Annotation\Validator;
use think\Request;

class ArticleController
{
    /**
     * 屬性對象注入
     * @Autowire()
* @var ArticleModel
*/ public $articleModel; /** * 數據驗證 * clsss: thinkphp定義的驗證器類名(必填) string類型 * scene: 驗證場景名 string類型 * batch:是否批量驗證 bool類型 * throw: 驗證失敗是否拋出異常 bool類型 * @Validator( * class=SaveValidate::class, * scene="save", * batch=false, * throw=false * ) * * 獲取參數 * fields: 定義要獲取的字段名,可批量設置默認值 array類型 * mapping: 轉換前台傳遞的字段名為自定義的字段名 array類型 * method: 獲取參數的方法,支持get、post、put、delte string類型 * json: 格式化json字段的數據 array類型 * * json使用示例: * json:{field1,field2,...fieldn} * 表示格式化field1,field2,...,字段的json數據 * * 支持json一維和二維字段的涮選,如 * json:{field1:{childField1,childField2...}} * 表示格式化field1字段的json數據,並只獲取field1字段下的childField1和childField2下標的值(支持深度一維和二維,會自動識別) * * @RequestParam( * fields={"title","image_url","content","category_id","is_temporary","extra":"默認值"}, * json={"category_id"}, * mapping={"image_url":"img_url"}, * method="post" * ) */ public function save(Request $request) { //獲取過濾過后的參數 $postData = $request->requestParam; return MyToolkit::success($this->articleModel->store($postData)); } }
AaaModel 模型
<?php

namespace app\common\model;

use Fairy\Annotation\Autowire;
use Fairy\Annotation\Transaction;
use Fairy\ModelAnnotationScaner;
use think\Db;
use think\Model;

class AaaModel extends Model
{
    // 模型中使用Autowire注解的trait
    use ModelAnnotationScaner;

    /**
     * @Autowire()
     * @var AccountModel
     */
    public $accountModel;
    
    /**
     * 注解控制事務
     * 返回值等價於true commit 否則 rollback
     * @Transaction()
     */
    public function store()
    {
        return Db::name('aaa')->insert(['id' => 14, 'username' => 'bob']) > 0;
    }
    /**
* 方法緩存
* @DataCache(expire="3m")
*/
public function index()
{
return Db::name('aaa')->page(1, 2)->order('id', 'desc')->select();
}
}

 

IDE 注解插件支持

一些ide已經提供了對注釋的支持,推薦安裝,以便提供注解語法提示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM