如何在Apiato框架的控制器函数中获取user_id以解决数据库非空约束错误
解决Apiato框架中Upload控制器无法获取当前登录用户ID的问题
嘿,看你的错误信息和代码,问题很明确:auth()->id()没拿到当前登录用户的ID,导致user_id为空触发了数据库的非空约束错误。咱们一步步来搞定它:
1. 先确认请求带了有效的JWT Token
Apiato默认用JWT做身份验证,所以你在Postman里发请求时,必须在请求头里加Authorization: Bearer {你的用户登录后得到的Token},而且这个Token得是没过期、有效的哈。
2. 给Upload方法加上Apiato的身份验证中间件
你现在的upload方法直接用了原生的Request类,没经过Apiato的身份验证流程,所以auth()助手根本拿不到用户。Apiato推荐用自定义的Request类来处理请求,既做验证又自动应用身份验证中间件。
先创建一个CreateBlogRequest类:
<?php namespace App\Containers\UserRegistration\UserContainer\UI\API\Requests; use App\Ship\Parents\Requests\Request; class CreateBlogRequest extends Request { // 这里可以设置允许访问的角色/权限,暂时空着也没问题 protected array $access = [ 'permissions' => '', 'roles' => '', ]; protected array $decode = []; protected array $urlParameters = []; // 给请求字段加验证规则,根据你的需求调整 public function rules(): array { return [ 'name' => 'required|string', 'price' => 'required|numeric', 'image' => 'required|string', 'rating' => 'required|integer|min:1|max:5', 'country' => 'required|string', 'description' => 'required|string', ]; } // 授权验证,用Apiato自带的方法 public function authorize(): bool { return $this->check([ 'hasAccess', ]); } }
然后修改BlogController的upload方法,用这个自定义Request:
// 记得引入刚创建的Request类 use App\Containers\UserRegistration\UserContainer\UI\API\Requests\CreateBlogRequest; public function upload(CreateBlogRequest $request ){ $blog = new BlogModel(); $blog->name = $request->input('name'); $blog->price = $request->input('price'); $blog->image = $request->input('image'); $blog->rating = $request->input('rating'); $blog->country = $request->input('country'); $blog->description = $request->input('description'); // 现在auth()->id()应该能正确拿到用户ID了 $blog->user_id = auth()->id(); $blog->save(); return response()->json(['success'=>'successfully added','blogs'=>$blog]); }
3. 确认Auth配置用对了用户模型
检查一下config/auth.php里的配置,确保用户提供者指向你的UserContainer模型:
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Containers\UserRegistration\UserContainer\Models\UserContainer::class, ], ],
4. 更稳妥的获取用户方式
为了避免意外,你可以先拿到用户实例再赋值,顺便做个判断:
$user = auth()->user(); if (!$user) { return response()->json(['error' => '请先登录'], 401); } $blog->user_id = $user->id;
额外建议:遵循Apiato的Action模式
Apiato鼓励把业务逻辑放到Action类里,控制器只做请求转发,这样代码更清晰也符合框架架构。比如创建一个CreateBlogAction:
<?php namespace App\Containers\UserRegistration\UserContainer\Actions; use App\Containers\UserRegistration\UserContainer\Models\BlogModel; use App\Ship\Parents\Actions\Action; use Illuminate\Http\Request; class CreateBlogAction extends Action { public function run(Request $request) { $user = auth()->user(); return BlogModel::create([ 'name' => $request->name, 'price' => $request->price, 'image' => $request->image, 'rating' => $request->rating, 'country' => $request->country, 'description' => $request->description, 'user_id' => $user->id ]); } }
然后控制器改成这样:
use App\Containers\UserRegistration\UserContainer\Actions\CreateBlogAction; public function upload(CreateBlogRequest $request ){ $blog = app(CreateBlogAction::class)->run($request); return response()->json(['success'=>'successfully added','blogs'=>$blog]); }
按上面的步骤来,应该就能解决user_id为空的问题啦!
内容的提问来源于stack exchange,提问作者Devops Training
相关产品推荐
相关产品推荐

