You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:52:45