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

如何在CodeIgniter 4 Shield中添加自定义用户字段并正确处理?

在CodeIgniter 4 Shield中添加自定义用户属性的完整实现步骤

1. 扩展用户数据库表

先给users表添加自定义字段(比如first_name、last_name),通过迁移文件实现:

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddCustomUserFields extends Migration
{
    public function up()
    {
        $this->forge->addColumn('users', [
            'first_name' => [
                'type'       => 'VARCHAR',
                'constraint' => 100,
                'null'       => false,
            ],
            'last_name' => [
                'type'       => 'VARCHAR',
                'constraint' => 100,
                'null'       => false,
            ],
        ]);
    }

    public function down()
    {
        $this->forge->dropColumn('users', ['first_name', 'last_name']);
    }
}

执行迁移命令:php spark migrate

2. 自定义User模型

继承Shield的默认UserModel,扩展字段权限:

<?php

namespace App\Models;

use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;

class UserModel extends ShieldUserModel
{
    // 将自定义字段加入允许操作的列表
    protected $allowedFields = [
        'username',
        'email',
        'password_hash',
        'reset_hash',
        'reset_at',
        'reset_expires',
        'activate_hash',
        'status',
        'status_message',
        'active',
        'last_active',
        'force_pass_reset',
        'first_name',
        'last_name',
    ];
}

然后在app/Config/Auth.php中替换默认模型:

public $userModel = \App\Models\UserModel::class;

3. 处理用户创建/注册逻辑

创建用户时直接传入自定义字段即可:

$user = auth()->getProvider()->create([
    'email'         => 'test@example.com',
    'password'      => 'secure123',
    'first_name'    => 'John',
    'last_name'     => 'Doe',
]);

如果用表单注册,需要在验证规则中添加字段校验(比如app/Config/Validation.php):

public $registration = [
    'email'         => 'required|valid_email|is_unique[users.email]',
    'password'      => 'required|min_length[8]',
    'first_name'    => 'required|min_length[2]|max_length[100]',
    'last_name'     => 'required|min_length[2]|max_length[100]',
];

在注册控制器中获取表单字段并传入创建逻辑即可。

4. 访问自定义属性

登录后直接通过auth()实例访问:

// 获取当前登录用户的自定义字段
$firstName = auth()->user()->first_name;
$lastName = auth()->user()->last_name;

// 查询指定用户的自定义属性
$userModel = model(UserModel::class);
$targetUser = $userModel->find(1);
echo $targetUser->last_name;

5. 更新自定义属性

更新时直接填充字段后保存:

auth()->user()->fill([
    'first_name' => 'Jane',
    'last_name'  => 'Smith',
])->save();

注意:必须确保自定义字段被添加到模型的$allowedFields中,否则模型会忽略字段的写入操作。

内容的提问来源于stack exchange,提问作者Bünyamin Pollin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:22:15