Laravel 5.5中Auth::check()失效:上传记录缺失user_id
问题分析与解决方案
咱们先理清楚你的核心问题:Blade视图里的Auth::check()能正常判断用户是否登录,但调用newUserUpload方法后,数据库记录的user_id字段始终为空。这说明视图渲染和模型方法执行时的Auth上下文可能存在差异,下面是几个常见的排查方向和解决办法:
1. 先确认方法执行时的Auth状态是否真的有效
虽然视图显示用户已登录,但有可能在触发newUserUpload的请求中,Auth会话并没有正确传递。比如:
- 如果是AJAX/前端请求,有没有正确携带会话Cookie?(比如前端没设置
withCredentials: true) - 上传路由有没有排除
web中间件?web中间件包含会话管理和Auth初始化,没加的话Auth状态会失效
你可以临时在方法里加日志排查:
public function newUserUpload(string $save_path){ // 临时打印Auth状态到日志 \Log::info('Auth check result: ' . Auth::check()); \Log::info('Current user ID: ' . Auth::id()); $this->photo_moderation_src = $save_path; if(Auth::check()){ $this->user_id = Auth::id(); } $this->save(); return null; }
执行上传后查看日志,如果显示Auth check result: false,那就是请求层面的会话传递问题,得先解决这个。
2. 检查模型的字段填充权限
确认你的模型$fillable属性里包含了user_id:
class YourModel extends Model { protected $fillable = ['photo_moderation_src', 'user_id']; // 确保user_id在允许填充列表里 }
虽然直接给模型属性赋值通常不受$fillable限制,但如果模型设置了严格的填充规则,也可能导致字段无法保存。另外也可以试试设置protected $guarded = [](允许所有字段填充)来排除这个可能性。
3. 换一种方式获取用户ID
有时候Auth::id()可能会有缓存或上下文问题,直接获取用户实例再取ID会更可靠:
public function newUserUpload(string $save_path){ $this->photo_moderation_src = $save_path; $user = auth()->user(); // 直接获取用户实例 if($user){ $this->user_id = $user->id; } $this->save(); return null; }
4. 确认路由中间件配置
确保上传路由应用了web中间件。Laravel的web中间件组包含会话启动、CSRF保护等Auth必需的逻辑,如果上传路由放在api中间件组下,默认是无状态的,Auth::check()会返回false。
正确的路由配置应该是这样:
// 放在routes/web.php里(默认已应用web中间件) Route::post('/upload', [YourUploadController::class, 'handleUpload']); // 或者手动指定中间件 Route::post('/upload', [YourUploadController::class, 'handleUpload'])->middleware('web');
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

