Laravel Lighthouse:CanDirective:如何定义自定义错误消息



我为模型创建了一个自定义策略,该策略逻辑与GraphQL突变配合使用非常好。我只是想知道我能以某种方式将自定义错误消息作为GraphQL响应传递吗?

这是一个策略类的例子:

use AppModelsMyModel;
use AppModelsUser;
use IlluminateAuthAccessHandlesAuthorization;
class MyModelPolicy
{
use HandlesAuthorization;

public function update(User $user, MyModel $my_object)
{
if (!$my_object->checkSomething()) {
// Throws an exception
$this->deny('My custom error message should be delivered to the GraphQL client..');
}

return true;
}
}

但异常中的消息被丢弃:

  • 由Laravel 5在这里:https://github.com/illuminate/auth/blob/8f0603a1d5b90c045a1ce5365ead0f0ba20fc6ce/Access/Gate.php#L279-L281
  • 或由Laravel 6(及以后(在这里:https://github.com/illuminate/auth/blob/478cf31f02831ec45194fec5428f666f85b4f1b0/Access/Gate.php#L277

考虑https://lighthouse-php.com/master/digging-deeper/error-handling.html#user-友好的错误。

webonyx/graphql.php提供graphql\Error\ClientAware接口,该接口可以由Exceptions实现,以控制它们如何呈现给客户端。

默认情况下,如果关闭调试模式,则不会向客户端显示异常消息。

由于在使用$this->deny()时不能直接控制抛出的消息,因此可以在Lighthouse中注册一个错误处理程序来识别抛出的AuthorizationException并将其转换为ClientAware异常。

https://lighthouse-php.com/master/digging-deeper/error-handling.html#registering-错误处理程序

您可以使用try-catch来抛出您的自定义响应,尽管我个人从未在模型中使用过try-catch块(仅在控制器中(

public function update(User $user, MyModel $my_object)
try {
if (!$my_object->checkSomething()) {
// Throws an exception
throw new Exception('YourCustomException');
$this->deny('My custom error message should be delivered to the GraphQL client..');
}

return true;
}catch (Exception $e) {
if ($e->getMessage() == 'YourCustomException') {
$data = [
'status' => 'error',
'message' => 'YourCustomException is not authorized.',
];
return response($data, 200);
}
}

您可以相应地更改您的状态代码和消息。这里response()是HTTP响应对象。

相关内容

  • 没有找到相关文章

最新更新