2016-11-17 5 views
1

Ich bin peinlich.PHP Wenn Bedingungen

Ich habe drei Funktionen zu überprüfen, was die aktuellen angemeldeten Benutzer ist:

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

Und dann will ich einen Zustand in meinen Aktionen hinzufügen zu überprüfen, ob der Benutzer eine der oben genannten drei erwähnt. Wenn er keiner von ihnen ist, sollte der Zugang verweigert werden. Ein Benutzer kann manchmal mehr als einer von ihnen sein, aber meistens nur einer der drei.

Ich war zuerst denken an so etwas, aber natürlich kann es nicht

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

Was ist der beste Weg, wenn ein Benutzer eine von ihnen ist zu prüfen sein wird? Soll ich eine ganz neue Funktion erstellen?

Sollte ich so etwas wie dieses:

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

Kann ich bitte ein paar Gedanken und Anregungen von anderen haben? Weil ich jetzt wirklich verwirrt bin. Noch ein Neuling hier

+4

Verwenden Sie '&&' anstelle von '||' in Ihrer ersten if Bedingung Versuch – jitendrapurohit

+1

* "aber offensichtlich kann es nicht funktionieren" * - Warum nicht? Sie haben nur Ihre boolesche Logik durcheinandergebracht. Du willst 'ist nicht X UND ist nicht Y UND ist nicht Z', mit anderen Worten *" ist keiner von diesen "*. Momentan drücken Sie * aus "wenn einer von ihnen falsch ist" * ... – deceze

Antwort

1

Ihre Logik funktioniert, ist es nur eine "umgekehrte" boolesche Logik, kompliziert ed, um zu folgen. Es hat einen Fehler, Verwenden Sie & & anstelle von ||.

Eine Alternative:

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

Eine weitere Alternative Sie eine Funktion in der "Objekt" Klasse schreiben konnte:

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

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

würde ich das letztere verwenden.

0

Verwenden Sie den folgenden Code:

Allgemeine Funktionen

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

Nutzung/Aufruf gemeinsame Funktion

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

Kann der, der unten abgestimmt hat, bitte sagen, warum? Ich dachte, das sieht gut aus. –

+0

Danke ... Ich bin auch besorgt, warum down Wähler nicht richtige Kommentar und Grund zu schreiben. Danke noch einmal. Akzeptieren Sie, wenn es für Sie nützlich ist. @JackCoolen – RJParikh

+0

Das ist schlechte Benennung und Rückgabewerte. Was bedeutet "userLogin ist 0" * bedeutet *? Nicht viel. Es ist eine magische Zahl mit implizierter Bedeutung. Das sollte 'userIsLoggedIn' sein und einen' boolean' zurückgeben, der selbsterklärend ist. – deceze