Files
xin-procurement/app/Http/Controllers/Mini/BaseMiniController.php
T
2026-08-14 15:22:19 +08:00

87 lines
2.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers\Mini;
use App\Exceptions\RepositoryException;
use App\Models\StoreModel;
use App\Models\UserModel;
use Illuminate\Http\Request;
use Modules\Common\Http\Controllers\BaseController;
use Modules\SystemUser\Models\SysAccessToken;
/**
* 小程序端控制器基类
*
* 无 #[RequestAttribute],不会被 AnnoRoute 注册为路由。
* 提供当前用户获取与门店绑定前置校验。
*/
abstract class BaseMiniController extends BaseController
{
/**
* 当前小程序用户(auth:sanctum 注入的 tokenable
*/
protected function currentUser(Request $request): UserModel
{
$user = UserModel::find($request->user()->id);
if ($user === null || $user->status === UserModel::STATUS_DISABLED) {
throw new RepositoryException('账号不存在或已被停用');
}
return $user;
}
/**
* 可选登录场景手动识别当前用户(路由关闭 authorize 时使用)
*
* 手动解析 Bearer token;未携带 token、token 无效或非小程序用户时返回 null(不抛错)。
*/
protected function optionalUser(Request $request): ?UserModel
{
$token = $request->bearerToken();
if (empty($token)) {
return null;
}
$accessToken = SysAccessToken::findToken($token);
if ($accessToken === null || $accessToken->tokenable_type !== UserModel::class) {
return null;
}
$user = UserModel::find($accessToken->tokenable_id);
if ($user === null || $user->status === UserModel::STATUS_DISABLED) {
return null;
}
return $user;
}
/**
* 门店端前置校验
*/
protected function ensureStoreBound(UserModel $user): StoreModel
{
if ($user->store_id <= 0) {
throw new RepositoryException('尚未绑定门店,请联系客服处理');
}
$store = StoreModel::find($user->store_id);
if ($store === null || $store->status !== StoreModel::STATUS_NORMAL) {
throw new RepositoryException('门店不存在或已停用,请联系客服处理');
}
return $store;
}
/**
* 用户当前绑定的正常门店(未绑定/已停用返回 null,不抛错)
*/
protected function boundStore(UserModel $user): ?StoreModel
{
if ($user->store_id <= 0) {
return null;
}
$store = StoreModel::find($user->store_id);
if ($store === null || $store->status !== StoreModel::STATUS_NORMAL) {
return null;
}
return $store;
}
}