编程语言
首页 > 编程语言> > php-如何在Silverstripe中将对象访问权限限制为$has_one成员?

php-如何在Silverstripe中将对象访问权限限制为$has_one成员?

作者:互联网

我正在一个Silverstripe 4.3.1项目上,该项目的对象带有通过$has_one附加的所有者成员:

class Object extends DataObject
{
    private static $has_one = [
        'Member' => Member::class,
    ];

我们希望将查看/编辑对象的能力限制为Admins&所有者成员.

这是我们使用的代码:

public function canView($member = null)
{
    return Permission::check('ADMIN') or
        $this->Member()->ID === Security::getCurrentUser()->ID or
        $this->Member()->ID === $member->ID;
}

public function canEdit($member = null)
{
    return Permission::check('ADMIN') or
        $this->Member()->ID === Security::getCurrentUser()->ID or
        $this->Member()->ID === $member->ID;
}

据我所知,此方法过去一直有效,但是最近的框架升级或代码更改已破坏了它.

当前,我们收到以下PHP错误:

尝试在包含$this-> Member()-> ID的行上获取非对象的属性

谁能指出正确的方向来解决这些错误?

解决方法:

可能某些对象实例没有成员集.在那些情况下,调用此-> Member()-> ID会出错,因为Member()返回null.

首先,我们应该检查$this-> Member()是否用于对象.如果不是,我们可以返回false.

public function canView($member = null)
{
    if (Permission::check('ADMIN')) {
        return true;
    }

    if (!$this || !$this->exists()) {
        return false;
    }

    if (!$this->Member() || !$this->Member()->exists()) {
        return false;
    }

    if ($this->Member()->ID === $member->ID) {
        return true;
    }

    if ($this->Member()->ID === Security::getCurrentUser()->ID) {
        return true;
    }

    return false;
}

public function canEdit($member = null)
{
    if (Permission::check('ADMIN')) {
        return true;
    }

    if (!$this || !$this->exists()) {
        return false;
    }

    if (!$this->Member() || !$this->Member()->exists()) {
        return false;
    }

    if ($this->Member()->ID === $member->ID) {
        return true;
    }

    if ($this->Member()->ID === Security::getCurrentUser()->ID) {
        return true;
    }

    return false;
}

标签:silverstripe,silverstripe-4,php
来源: https://codeday.me/bug/20191211/2106057.html