2016-11-17 13 views
1

私は恥ずかしいです。PHPの場合

私は、ユーザーの現在のログに記録されたが何であるかを確認するために3つの機能を持っている:

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(); 
} 

そして私は、ユーザーが上記の3つを言及したのいずれかであるかどうかを確認するために私の行動の内側に条件を追加します。彼がそれらのいずれかでない場合、アクセスは拒否される必要があります。ユーザーは複数の場合もありますが、主に3つのうちの1つだけです。

私はこのような何かの最初の考えていたが、明らかにそれは、ユーザがそれらの一つであるかどうかを確認するための最良の方法だろう何

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

最初のif条件の試行で '||'の代わりに '&&'を使用してください。 – jitendrapurohit

+1

* "明らかに動作しません" * - なぜですか?ブール論理を混ぜ合わせただけです。あなたは 'Xではなく、Yではなく、Zでない '、言い換えれば*は「これらのどれも」*ではありません。現在、あなたは*「これらのどれかが間違っていれば」を表現しています* ... – deceze

答えて

1

あなたのロジックは動作しますが、それはですちょうど "逆"論理論理、complicatに従う。それにはバグがあります。||の代わりに& &を使用してください。

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