Request class return 中的授权方法可以为 HandlesAuthorization 特征定制消息吗?

Can authorize method in Request class return customized message for HandlesAuthorization trait?

我在请求 class 中有以下代码来检查用户是否有权执行更新。

HandlesAuthorization trait,默认给出默认消息。有什么办法可以return定制留言吗?我看到Request class中的授权方法只能return boolean值。

class UpdateRoleRequest extends Request
{
    private $UserPermissionsSession;

    public function __construct(IRole $Role) {
        $this->UserPermissionsSession = new UserPermissionsSession();
    }

    public function authorize() {
        $UserID = \Auth::user()->UserID;
        return $this->UserPermissionsSession->CheckPermissionExists($UserID);
    }

}

我认为您不应该查看 HandlesAuthorization 特征。您需要做的就是在您的请求 class.

中实现 failedAuthorization 方法

FormRequestclass中是这样定义的:

/**
 * Handle a failed authorization attempt.
 *
 * @return void
 *
 * @throws \Illuminate\Auth\Access\AuthorizationException
 */
protected function failedAuthorization()
{
    throw new AuthorizationException('This action is unauthorized.');
}

所以您只需要在 UpdateRoleRequest class 中覆盖此方法,例如:

protected function failedAuthorization()
{
    throw new \Illuminate\Auth\Access\AuthorizationException('User has to be an admin.');
}

为回答@Pooria Honarmand 的问题的其他人提供解决方案;
如果您已经在 authorize 方法中检查过针对不同条件的更具体的消息,并且您不想在此处重复这些检查,只需引入一个或多个基于 class 的变量。

这是一个只有一个条件会导致非标准消息的示例: private bool $hasMissingClientId = false;

public function authorize(): bool
{
    // several other checks

    if (empty($user->client_id)) {
        $this->hasMissingClientId = true;
        return false;
    }
    return true;
}

protected function failedAuthorization()
{
    if ($this->hasMissingClientId) {
        throw new AuthorizationException('User has to be assigned to specific client.');
    }
    parent::failedAuthorization();
}