On 05/12/2020 19:21, Marc Bennewitz wrote:
I mean on mapping something to something else defined as a single assoc array 
constant.
Something like:

enum Role {
   case User,
   case Admin,
   ...
}

enum Action {
   case Order_Edit,
   case Order_Read,
private const BY_ROLE = [
     Role::User => [self::Order_Read],
     Role::Admin => [self::Order_Read, self::Order_Edit],
   ];

   public function isAllowed(User $user) {
     return in_array($this, self::BY_ROLE[$user->role]);
   }
}


That example can be rewritten directly as a static method and match statement, which I think would look like this:

enum Action {
  case Order_Edit;
  case Order_Read;
private static function byRole(Role $role) {
    return match($role) {
       Role::User => [self::Order_Read],
       Role::Admin => [self::Order_Read, self::Order_Edit],
    };
  }

  public function isAllowed(User $user) {
    return in_array($this, self::byRole($user->role));
  }
}


The scenario can also be modelled the other way around with case methods:

enum Action {
  public function isAllowed(User $user) {
     // Default case denying all, might be useful with a long list of cases
     return false;
  }

  case Order_Edit {
     public function isAllowed(User $user) {
        return $user->role === Role::Admin;
     }
  }
  case Order_Read {
     public function isAllowed(User $user) {
        return $user->role === Role::User
               || $user->role === Role::Admin;
     }
  }
}


Regards,

--
Rowan Tommins (né Collins)
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to