当前位置: 首页 > 知识库问答 >
问题:

Laravel/Elount模型属性可见性

罗甫
2023-03-14

以前我使用过的ORM将数据库列直接映射到类属性,这允许您查看特定的属性可见性,就像您通常会限制对某些属性(例如密码)的访问一样。

有了雄辩,我似乎无法复制这一点,因为数据库列映射到不包含可见性的内部属性数组

我的愿望是将用户密码的访问范围仅限于对象,即私有。

设置具有可见性的类属性不起作用,因为该属性超出了雄辩模型属性的范围,因此该属性未映射到列。

雄辩的$隐藏和$保护属性不起作用,因为它们处理大规模输出(toArray,toJSON)和大规模赋值,而不是直接赋值。

我试图使用访问器/变异器(getter/setter)来实现这一点,但结果参差不齐。

在访问器上指定可见性不起作用,因为调用的访问器方法(例如getPasswordAttribute)是从Eloquent\Model调用的-

但是,有效的方法是阻止雄辩的访问器将属性全部返回给$user,从而阻止任何对$user的请求-

/**
 * Return password string only for private scope
 * @return string
 */

private function getPassword ()
{
    return $this->attributes['password'];
}

/**
 * Don't return password with accessor
 * @param string $password Password
 * @return void
 * @throws Exception
 */

public function getPasswordAttribute ($password)
{
    throw new Exception ('Password access denied');
}

同样的方法也适用于任何想要setter方法可见性的突变器(setters)。

这似乎是正确的,还是有更好的“拉雷维尔认可的”处理方法

共有1个答案

凌通
2023-03-14

我不知道有哪种“批准”的方法可以这样做,但您可以随时覆盖Eloquent的\uu get()魔术方法来检查私有字段?

debug\u backtrace()检查有点粗糙;如果没有getPassword()方法(或者该类中基本上任何调用$this的方法),我实际上无法让它按预期工作-

它不应该效率太低,因为在执行回溯之前,非私有属性的in_数组检查将失败。不过,可能还有更好的方法!

private $private = array(
    'password'
);

public function __get($key)
{
    // check that the class calling __get is this class, and the key isn't 'private'
    if (in_array($key, $this->private) && debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] != get_class()) {
        throw new \Exception('Private');
    }

    // anything else can return as normal
    return parent::__get($key);
}

public function getPassword()
{
    // calling this method elsewhere should work
    return $this->password;
}

 类似资料:
  • 项(item)默认情况下拥有私有的可见性(private visibility),不过可以加上 pub (public 的前 3 个字母)修饰语(modifier)来改变默认行为。一个模块之外的作用域只能访问该模块里面的公有项(public item)。 // 一个名为 `my` 的模块 mod my { // 在模块中的项默认带有私有可见性。 fn private_functio

  • 提前感谢您的时间。如果你赶时间,跳到粗体部分。 我有一个以下用例:应用程序的每个用户都使用自己的一组前缀表来创建有说服力的模型(即,对于code_发票使用Invoice.php,对于code_客户使用Client.php)。前缀在用户表中定义(例如users.code)。 在Laravel 5.2中,我已经能够通过在用户登录后读取运行时设置的配置(或会话)变量来轻松设置雄辩模型的$table属性。

  • 问题内容: 显示属性和可见性属性之间有何区别? 问题答案: 该属性仅告诉浏览器是否显示元素。它是可见的(-您可以看到)或不可见的(-您看不到)。 该属性告诉浏览器 如何 绘制和显示元素(如果有的话)-是将其显示为元素(即,与文本和其他内联元素一起流动)还是-level元素(即,具有height和width属性,你可以设置,它的浮动等),或(即它的作用就像一个黑匣子,但奠定了直列代替)和其他一些人(

  • 问题内容: 我在div中有一个HTML 5视频。然后,我有一个自定义播放按钮-效果很好。 我已将视频的可见性设置为在加载时隐藏,并且在单击播放按钮时可见,那么如何在再次单击播放按钮时将其恢复为隐藏状态? 我基本上只是想在可见和隐藏的两种状态之间切换,除非我不能使用切换,因为那是show的隐藏div。我需要在那里,只是隐藏起来,所以它保持正确的高度。 问题答案: 使用jQuery:

  • 有没有一种方法可以在Laravel中检索具有所有属性的模型,即使这些属性为空?它似乎只返回属性不为null的模型。 原因是我有一个函数,如果模型中存在属性,它将从数组中更新模型属性。在设置模型之前,我使用property_exists()函数检查模型是否具有特定属性。数组键和模型属性应该匹配,所以它就是这样工作的。 如果模型已经设置了属性,它可以正常工作,因为属性存在并从数组中获取值。但是,如果属

  • 我们将laravel应用程序用于服务器站点restful应用程序。我们有一个存储数据的MySql数据库。为了访问数据,我们使用了laravel模型。有时我们可能需要创建自定义属性或使用访问器和变异器操作属性。事情是这样的。有时我们需要使用访问器从多个属性计算数据。例如,如果该表包含一个名为“到期日”的字段,并且我们希望定义一个自定义属性来指示到期日是否已过,那么我们将使用如下自定义属性: 我的问题