binarycamp/shared-library

一个简单的Laravel包,包含常见的Utils类和基本功能

v0.1.16 2024-02-28 22:15 UTC

README

运行以下命令以获取最新版本

composer require binarycamp/shared-library

添加服务提供者

将服务提供者添加到config/app.php配置文件中的providers数组中,如下所示

'providers' => [
    ...
    BinaryCamp\sharedLibrary\Providers\BinaryCampSharedLibraryServiceProvider::class,
]

发布配置 运行以下命令以发布包配置文件

php artisan vendor:publish --provider="BinaryCamp\sharedLibrary\Providers\BinaryCampSharedLibraryServiceProvider"

现在你应该有一个 config/shared_library.php 文件,允许你配置此包的基本设置。

环境变量

要启用自动数据库查询生成,请将以下环境变量添加到.env文件中

IS_QUERY_LOG_ENABLE=true

或者你可以手动声明查询日志生成方法

AppLog::setQueryLogStatus(status: true)->createQueryLog(file_name: "my_query_log");

创建应用程序日志

AppLog::createLog(action: "MY_EVENT_NAME", data: ["data1" => "John", "data2" => "Dao"],  type: AppLogLevel::Info);

如果你想设置不同的日志通道,那么

AppLog::setChanel(chanel: config("logging.channels.daily"))->createLog(action: "MY_EVENT_NAME", data:["data1" => "John", "data2" => "Dao"], type: AppLogLevel::Info);

数据库事务

AppDB::transaction(function () use ($param1, $param2){
       //operation 1
            
       //operation 2
}, $attempt = 2);

或者你可以声明如下

try {
    AppDB::beginTransaction();

    //operation 1

    //operation 2
            
    AppDB::commit();
}catch (\Throwable $exception){
    AppDB::rollBack()->createLog($exception);
}

API响应

成功响应

Return AppResponse::setSuccess(status_code: 100,  status_message: "Operation Successful", data: ["data1" => "John", "data2" => "Dao"],  http: 200)
            ->toJson();

如果你想要记录API响应,那么

AppResponse::setSuccess( status_code: 100,  status_message: "Operation Successful", data: ["data1" => "John", "data2" => "Dao"],  http: 200)
            ->createLog(action: "User Save Event")
            ->toJson();

失败响应

AppResponse::setError( status_code: 99,  status_message: "Operation Failed",  errors: [],  http: 404)
            ->toJson();

如果你想要记录API响应,那么

AppResponse::setError( status_code: 99,  status_message:"Operation Failed", errors: [],  http:404)
            ->createLog(action: "User Save Event")
            ->toJson();

身份验证

生成公钥和私钥

php artisan generate:jwtKey
    {audience : You must select an Audience. Audience is configured in shared_library.php file}
    {version : version of the key}
    {--length=4096}
    {--force=0}
    
    //example
    
    php artisan generate:jwtKey USERS  v2 --force=1

路由配置

Route::middleware('AppAuth')->get('/auth-check', function (Request $request) {

    if (AppAuth::check()){
        $authObj = AppAuth::getAuthInfo();

        return AppResponse::setSuccess(100, 'Auth Checked Successfully', [
            'authObj' => $authObj
        ], HttpCode::ACCEPTED)
            ->toJson();
    }
});

在上面的示例中,AppAuth中间件被分配。这里AppAuth是中间件的名称。

通过电子邮件和密码生成令牌

Route::post('login', function (Request $request){
    $userObj = \App\Models\User::query()->where('email', $request->email)->first();

    if (!empty($userObj)){

        AppAuth::setAudience("USERS")->setCustomClaim([
                'user_id' => $userObj->id,
                'company_id' => $userObj->company_id,
                'usergroup_ids' => $userObj->usergroup_ids,
                'name' => $userObj->name,
                'email' => $userObj->email,
                'phone' => $userObj->phone,
                ]
        )->login();

        return AppResponse::setSuccess(100, 'Token Generated Successfully', [
            'access_token' => AppAuth::getToken(),
            'refresh_token' => AppAuth::getRefreshToken(),
            'authObj' => AppAuth::getAuthInfo(),
        ], HttpCode::ACCEPTED)
            ->toJson();
    }
});

此受众来自config目录下名为shared_library.php的配置文件。

通过刷新令牌生成令牌

Route::post('/refresh', function (Request $request){
    $refresh_token = $request->refresh_token;

    try {
        AppAuth::setToken($refresh_token)->validate()->verify();

        //we can allow only one time access token by a refresh token
        AppAuth::blackList();
        
        $payload = AppAuth::getPayload();

        $user_id = $payload['sub'];
        $userObj = \App\Models\User::query()->find($user_id);


        AppAuth::setAudience($payload['aud'])->setCustomClaim([
                'user_id' => $userObj->id,
                'company_id' => $userObj->company_id,
                'usergroup_ids' => $userObj->usergroup_ids,
                'name' => $userObj->name,
                'email' => $userObj->email,
                'phone' => $userObj->phone,
            ]
        )->login();

        return AppResponse::setSuccess(100, 'Token Generated Successfully', [
            'access_token' => AppAuth::getToken(),
            'refresh_token' => AppAuth::getRefreshToken(),
            'authObj' => AppAuth::getAuthInfo(),
        ], HttpCode::ACCEPTED)
            ->toJson();


    }catch (\Throwable $exception){
        return AppResponse::setError(99, "Invalid Token", [], 400)
            ->toJson();
    }
    
});

权限中间件

Route::middleware(['AppAuth', 'AppPermission'])->get('/check-permission', function (Request $request) {


    return AppResponse::setSuccess(100, 'Permission Checked Successfully', [
        'authObj' => AppAuth::getAuthInfo()
    ], HttpCode::ACCEPTED)
        ->toJson();
})->name('acl.check.permission');

要检查权限,需要AppAuth中间件。然后需要放置AppPermission。