2016-11-17 75 views
1

我很尴尬。PHP如果条件

我有三个函数来检查用户当前登录是什么:

public function isAuthor(User $user) 
{ 
    return $user->getId() === $this->getDestination(); 
} 

public function isSupervisor(User $user) 
{ 
    return $user->getId() === $this->getFirstApprover(); 
} 

public function isSecondApprover(User $user) 
{ 
    return $user->getId() === $this->getSecondApprover(); 
} 

然后,我想里面添加我的行动的条件来检查,如果用户是任何上述三人。如果他不是其中之一,应该拒绝访问。用户有时可能不止一个,但大多只有三个中的一个。

我是这样的第一想法,但显然它不能正常工作

if (!$object->isAuthor($this->getUser()) || !$object->isSupervisor($this->getUser()) || !$object->isSecondApprover($this->getUser())) { 
    throw new AccessDeniedException(); 
} 

会有什么检查,如果用户是他们中的一个最好的办法?我应该创建一个全新的功能吗?

我应该使用这样的事:

if (!$object->isAuthor($this->getUser())) { 
    throw new AccessDeniedException(); 
} elseif (!$object->isSupervisor($this->getUser())) { 
    throw new AccessDeniedException(); 
} 

我可以请有从别人的一些想法和投入?因为我现在很困惑。 还在这里一个新手

+4

在第一条件条件试验中使用'&&而不是'||' – jitendrapurohit

+1

*“但显然它不能工作”* - 为什么不呢?你只是混淆了你的布尔逻辑。你想'不是X并且不是Y AND不是Z',换句话说*“不是这些”*。目前,你正在表达*“如果这些中的任何一个是假的”* ... – deceze

回答

1

您的逻辑将工作,这是只是一个“反向”布尔逻辑,很复杂编辑按照。它有一个错误,使用& &而不是||。

一种替代

if (! ( $object->isAuthor($this->getUser()) || 
     $object->isSupervisor($this->getUser()) || 
     $object->isSecondApprover($this->getUser())) 
{ 
    throw new AccessDeniedException(); 
} 

另一种选择,你可以在 “对象” 类写一个函数:

public function hasAccessLevelX(User $user) 
{ 
    return in_array($user->getId(), [ 
      $this->getDestination(), 
      $this->getFirstApprover(), 
      $this->getSecondApprover() 
    ]); 
} 

if (!$object->hasAccessLevelX($this->getUser())) { 
    throw new AccessDeniedException(); 
} 

我会用后者。

0

使用下面的代码:

常用功能

public function userLogin(User $user) 
{ 
    $userId = $user->getId(); 
    if($userId == $this->getDestination() || 
     $userId == $this->getFirstApprover() || 
     $userId == $this->getSecondApprover()) 
    { 
     return TRUE;  
    } 
    return FALSE; 
} 

使用/通用功能的呼叫

if ($object->userLogin($this->getUser()) == FALSE) { 
    throw new AccessDeniedException(); 
} 
+0

请投票的人说出原因吗?我认为这看起来不错。 –

+0

谢谢......我也担心为什么下来选民没有写出适当的评论和理由。再次感谢。接受如果对你有用。 @JackCoolen – RJParikh

+0

这是错误的命名和返回值。 “userLogin是0”是什么意思*?没什么。这是一个暗含意义的幻数。这应该是'userIsLoggedIn'并返回'boolean',这是自我解释。 – deceze