【发布时间】:2021-11-07 20:17:48
【问题描述】:
我正在开发一个大型 Laravel 项目,该项目有 5 种用户类型、大约 50 个模型和相同数量的控制器。
每种用户类型都有自己的权限,根据不同的因素从单独的表中计算出来,因此简单的模型策略不起作用。
到目前为止,我所做的是为每个模型创建一个策略并在那里进行计算:
class MyModelPolicy {
function someActionName(){
// Check whether user have the permission or not.
// I only return a simple true/false here, as I might need to
// reuse this somewhere else.
return $resultAsBoolean;
}
}
现在,在控制器中,我使用了一个辅助函数,它使用 Gate 外观并引发自定义异常:
function checkUserAccess( $someActionName, $args = [ 'some arguments' ] ){
$gate = Gate::inspect( $someActionName, $args );
if( $gate->denied() ) {
// Throw exception here
throw new PermissionDeniedException( 'message here' );
}
}
还有控制器本身:
public function store(){
// Check permissions
checkUserAccess('permissions to check');
// All good, continue
}
对于最后一部分,我定义了一个自定义异常,它扩展了基本的 Laravel 扩展类,并有一个 render() 方法来决定要做什么:
class PermissionDeniedException extends Exception {
public function render(){
/**
* Our custom permissionDeniedException has been
* triggered. Do the right action based on the
* current situation. This will always terminate the app.
*/
}
}
现在我知道使用异常来控制流不是一个好主意,但是由于这个异常会完全终止应用程序,所以我对使用它并不感到太糟糕。但是,这里唯一的问题是我的控制器的每个方法(总共大约 350 个)现在都可以抛出异常。我想通过将所有方法设置为私有来解决这个问题,然后使用__call() 魔术方法并且只从那里抛出一个异常。
对于这种情况有没有更好的解决方案?还是当项目变得过于复杂时这是不可避免的?
【问题讨论】:
标签: php laravel authorization