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