我如何用更好的方式隐藏 Laravel 模型字段

问题描述 投票:0回答:2

在我的例子中,我隐藏了我的雄辩领域:

public function __construct(array $attributes = array())
{
    parent::__construct($attributes);
    $user = auth()->user();
    $hiddenFields = [];
    if(!$user || $user && $user->id !== $this->user_id) {
        $hiddenFields = [
            'phone', 'employees', 'email',
            'created_at', 'updated_at', 'id', 'description'
        ];
    }
    $this->hidden = array_merge($this->hidden, $hiddenFields);
}

可以更好地隐藏字段吗?

php laravel eloquent
2个回答
1
投票

您可以直接在模型中使用

$visible
$hidden
,因此在调用
->toArray()
时,它们不会显示。

文档: https://laravel.com/docs/master/eloquent-serialization#hiding-attributes-from-json


1
投票

构造函数中的用户调用将始终看到 null,因为所需的中间件尚未运行,请参阅https://stackoverflow.com/a/39175335/11995193。请注意,这假设您已从控制器发布了代码。

对于课程的其余部分,我个人会添加轻微重构以使代码更具可读性:

class SomeClassName
{
    /**
     * @var array
     */
    protected $defaultHiddenFields = [
        'phone',
        'employees',
        'email',
        'created_at',
        'updated_at',
        'id',
        'description'
    ];

    /**
     * @var array
     */
    protected $hidden = [];

    /**
     * @param  array  $attributes
     */
    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        $this->middleware(function ($request, $next) {
            $this->user = auth()->user();

            return $next($request);
        });

        $this->hidden = array_merge($this->hidden, $this->getHiddenUserFields());
    }

    /**
     * @return array
     */
    private function getHiddenUserFields(): array
    {
        $validUser = !$this->user || ($this->user && ($this->user->id !== $this->user_id));

        return $validUser ? $this->defaultHiddenFields : [];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.