54 lines
1.7 KiB
PHP
54 lines
1.7 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Mini;
|
||
|
||
use App\Exceptions\RepositoryException;
|
||
use App\Models\StoreModel;
|
||
use Illuminate\Http\Request;
|
||
use Modules\Common\Http\Controllers\BaseController;
|
||
use Modules\SystemUser\Models\SysAccessToken;
|
||
|
||
/**
|
||
* 小程序端控制器基类
|
||
*
|
||
* 无 #[RequestAttribute],不会被 AnnoRoute 注册为路由。
|
||
* 门店即用户:登录主体就是门店(store 表),提供当前门店获取与状态校验。
|
||
*/
|
||
abstract class BaseMiniController extends BaseController
|
||
{
|
||
/**
|
||
* 当前登录门店(auth:sanctum 注入的 tokenable)
|
||
*/
|
||
protected function currentStore(Request $request): StoreModel
|
||
{
|
||
$store = StoreModel::find($request->user()->id);
|
||
if ($store === null || $store->status === StoreModel::STATUS_DISABLED) {
|
||
throw new RepositoryException('账号不存在或已被停用');
|
||
}
|
||
return $store;
|
||
}
|
||
|
||
/**
|
||
* 可选登录场景手动识别当前门店(路由关闭 authorize 时使用)
|
||
*
|
||
* 手动解析 Bearer token;未携带 token、token 无效或非门店账号时返回 null(不抛错)。
|
||
*/
|
||
protected function optionalStore(Request $request): ?StoreModel
|
||
{
|
||
$token = $request->bearerToken();
|
||
if (empty($token)) {
|
||
return null;
|
||
}
|
||
$accessToken = SysAccessToken::findToken($token);
|
||
if ($accessToken === null || $accessToken->tokenable_type !== StoreModel::class) {
|
||
return null;
|
||
}
|
||
$store = StoreModel::find($accessToken->tokenable_id);
|
||
if ($store === null || $store->status === StoreModel::STATUS_DISABLED) {
|
||
return null;
|
||
}
|
||
|
||
return $store;
|
||
}
|
||
}
|