You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
<?php
namespace App\Utilities\Polices;
use App\Documents\PolicyDocument; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Response;
class BasePolicy { use PolicyConditions;
public function __construct(PolicyDocument|null $policy = null, Model|null $model = null) { $this->policy = $policy; $this->model = $model; }
public static function allow(PolicyDocument $policy, Model|null $model = null) { (new static($policy, $model))->applyCheck(); }
public static function when(PolicyDocument $policy, Model|null $model = null): bool { return (new static($policy, $model))->applyCheck(false); }
public function applyCheck($throwException = true): bool { $pass = false;
foreach ($this->policy?->needs ?? [] as $condition) { $pass = $this->checkCondition($condition); if ($pass) break; }
if (!$pass && $throwException) { abort(Response::HTTP_FORBIDDEN, 'this action is forbidden.'); } return $pass; }
public function checkCondition($conditions): bool { $conditionsMatch = true; foreach ($conditions as $condition) { [$function, $param] = str_contains($condition, ":") ? explode(':', $condition) : [$condition, null];
$conditionsMatch = $conditionsMatch && call_user_func_array([static::class, $function], (empty($param) ? [] : [$param]));
if (!$conditionsMatch) break; }
return $conditionsMatch; } }
|