【发布时间】:2019-08-28 13:28:36
【问题描述】:
我有一个与 Post 模型有 HasMany 关系的 User 模型。当我在 Nova 的用户资源中包含 HasMany 的字段时,我看到有 Create post button。如何删除/隐藏该按钮?
【问题讨论】:
标签: php laravel-5 eloquent laravel-nova eloquent-relationship
我有一个与 Post 模型有 HasMany 关系的 User 模型。当我在 Nova 的用户资源中包含 HasMany 的字段时,我看到有 Create post button。如何删除/隐藏该按钮?
【问题讨论】:
标签: php laravel-5 eloquent laravel-nova eloquent-relationship
如果您像我一样,您最不想做的事情是通过设置策略来设置阻止创建 HasMany 规则引用的子资源的策略。原因是在HasMany 的“有”一侧将这个addX() 策略设置为false 不仅会阻止从资源详细信息视图创建子资源,还会在创建子资源时产生权限错误-resource 从其页面视图,特别是该策略禁止创建引用“父”或“Has”的资源。当您想到addClassName() 的许可声明有多广泛时,这实际上并不令人惊讶。
因此,我的解决方案最终不得不成为丑陋的 CSS。只是为什么这是对创建按钮进行页面相关隐藏的唯一方法。这应该是Nova/*.php 视图文件中的HasMany::make("")->canCreate(false) 声明。
无论如何这里是 CSS,希望它可以帮助某人。
div[dusk="parent-class-detail-component"] div[dusk="has-many-child-class-index-component"] a[dusk='create-button'] {
display: none;
}
【讨论】:
这个问题在laravel nova official documentation得到解答
就我而言,我有 user 模型和 order 模型,user Hasmany order 我添加了
public function addOrder()
{
return false;
}
关于用户政策现在创建角色按钮在用户详细信息页面上消失了 this is a screenshot of user detail page
【讨论】:
如果有人仍在寻找解决方案,您可以在策略中授权附加/分离资源:
https://nova.laravel.com/docs/2.0/resources/authorization.html#authorizing-attaching-detaching
所以在这种情况下,您有一个UserPolicy,您可以向其中添加一个函数:
attachPost(User $user, User $model, Post $post)
{
return false;
}
$user 变量是登录的用户,$model 变量是查看的用户页面。
【讨论】:
你需要做两件事。
在您的帖子资源中
公共静态函数可授权() { 返回真; }
现在为除创建之外的所有方法创建 Post 和 return true 策略,创建 return false 和 AuthServiceProvider.php
放
protected $policies = [
Post::class => PostPolicy::class,
];
你就完成了。
【讨论】:
您可以通过 Policies 实现此目的。
根据文档:
如果存在策略但缺少特定操作的方法,则不允许用户执行该操作。因此,如果您已定义策略,请不要忘记定义其所有相关授权方法。
因此,在您的情况下,如果您想完全隐藏按钮,只需为您的资源 (PostPolicy) 创建一个策略,并且不要实现 create 方法。
【讨论】: