2016-11-17 4 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

* ", но, очевидно, оно не может работать" * - Почему бы и нет? Вы просто перепутали логическую логику. Вы хотите, чтобы 'is not X AND не Y AND не является Z', другими словами *" не является ни одним из этих "*. В настоящее время вы выражаете * «если какой-либо из них ложный» * ... – deceze

ответ

1

Ваша логика будет работать, это просто «обратная» логическая логика, complicat чтобы следовать. У него есть ошибка, используйте & & вместо ||.

Одна альтернатива:

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

Другой альтернативой, вы могли бы написать функцию в классе "Object":

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 is 0» * означает *? Ничего особенного. Это волшебное число с подразумеваемым значением. Это должно быть 'userIsLoggedIn' и возвращать' boolean', это самоочевидно. – deceze

Смежные вопросы