Laravel @can blade指令-如何“捕获”Response::deny()消息?

alen0pnh  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(159)

我在我的Laravel应用程序中创建了以下策略:

public function create(User $user): Response
{
    $storeLimit = 3;

    // Check if user already is a store owner (many-to-many relationship via store_user table where role = owner)
    if ($user->stores()->where('role', 'owner')->count() >= $storeLimit) {
        return Response::deny('You can`t create more stores.');
    }
    
    return Response::allow();
}

字符串
在我的.blade模板中:

@can('create', App\Models\Store::class)
     <button>Create store</button>
@else
     <p>How to display Response message here?</p>
@endcan


当使用@can指令时,如何在.blade模板中显示“deny”消息?

j8yoct9x

j8yoct9x1#

要在使用@can指令时在.blade模板中显示“deny”消息,您可以在策略方法的变量中捕获消息,然后将其传递到视图。以下是如何修改代码以实现此目的:
在Laravel策略中,修改create方法,以在用户被拒绝时捕获变量中的“deny”消息:

public function create(User $user)
{
    $storeLimit = 3;

    // Check if user already is a store owner (many-to-many relationship via store_user table where role = owner)
    if ($user->stores()->where('role', 'owner')->count() >= $storeLimit) {
        $denyMessage = 'You can`t create more stores.';
        return Response::deny($denyMessage);
    }
    
    return Response::allow();
}

字符串
在.blade模板中,您现在可以检查是否设置了$denyMessage变量,如果存在则显示它:

@can('create', App\Models\Store::class)
     <button>Create store</button>
@else
     @if(isset($denyMessage))
         <p>{{ $denyMessage }}</p>
     @else
         <p>Default deny message goes here</p>
     @endif
@endcan


通过在策略中的$denyMessage变量中捕获“deny”消息,您可以检查其是否存在于刀片模板中,并在拒绝用户创建存储的权限时显示该消息。如果未设置“deny”消息,则可以提供默认消息,如示例中所示。

相关问题