【问题标题】:Problem with spatie/laravel-menu and spatie/laravel-persmissionsspatie/laravel-menu 和 spatie/laravel-permissions 的问题
【发布时间】:2020-09-15 11:16:53
【问题描述】:

我在我的 laravel 项目中使用 spatie/laravel-menu 和 spatie/laravel-permissions。

我创建了一个权限,将其分配给一个角色,并将该角色分配给我的用户。这工作正常。 然后我使用这样的宏以中间件方式生成了一个菜单:

\Menu::macro('main', function () use ($request) {
    return \Menu::new()
        ->withoutWrapperTag()
        ->withoutParentTag()
        ->setActiveClassOnLink()
        ->route('preparation', 'Anstehende Termine')
        ->route('postprocessing', 'Nachbereitung')
        ->routeIfCan('administrate', 'protocols', 'Protokolle')
        ->addItemClass('nav-link')
        ->setActive($request->url());
});

在我的应用程序中,我有两个具有不同连接的用户模型: App\User; 将 connection_a 与数据库 db_a 和 App\DirectoryA\User; 使用 connection_b 和数据库 db_b

在 auth 配置中定义了第一个,并且使用 Auth::user()->can('administrate') 可以正常工作,即使在定义菜单的中间件中也是如此。

由于我通过routeIfCan 添加了菜单项,因此出现错误。它告诉

未找到基表或视图:1146 表 'db_b.permissions' 不存在(SQL:选择 permissions.*、model_has_permissions.model_id as pivot_model_idmodel_has_permissions.permission_id as pivot_permission_id, model_has_permissions.model_type as pivot_model_type from permissions inner join model_has_permissions on permissions.id = model_has_permissions.permission_id @987645434@ =@9876454341@ 1 和model_has_permissions.model_type = 应用\用户)

这里出了什么问题?它应该使用App\User 模型。在框架抛出异常的地方放置一个dd(),向我展示了正确的连接......

请帮忙。

【问题讨论】:

    标签: php laravel menu laravel-permission


    【解决方案1】:

    这意味着表permissions 不存在于您的数据库中,也许您在安装laravel-permission 后忘记运行php artisan migrate

    【讨论】:

    • 是的,我跑了php artisan migrate。但正如您在错误描述中看到的那样,它使用了错误的数据库 - db_b。此数据库属于具有第二个连接和数据库的第二个用户 (App\DirectoryA\User)。相反,它应该使用具有正确连接和数据库的第一个 (App\User)。在这个数据库中存在permissions 表。
    • hmm 我从不尝试在一个项目中连接 2 个不同的数据库,默认 migration 将在您在 .env 中定义的 db 上运行,但如果您有多个数据库连接,您可能需要编辑迁移检查 @987654322 @ ,在 .env 上建立 2 个连接并编辑 migration 以设置特定连接,或者如果您无法通过 laravel 中的代码修复,只需将丢失的表复制到您想要的另一个数据库
    • 据我所知,无法为迁移指定连接,因为指定了默认连接。除此之外,表格位于正确的位置 - 默认连接。一切都使用默认连接,但此时除外。在 auth 配置中,上述两个模型中的第一个模型也被定义为默认值。真是令人沮丧……
    • 我的意思是“不必为迁移指定连接”...
    • 我查看了教程,但没有找到任何可以帮助的内容。
    【解决方案2】:

    一位 spatie 的成员帮助解决了这个问题:

    在底层,routeIfCan 调用 app(Gate::class)->allows($ability, $ablityArguments)。我假设 Gate 的行为与 Auth::user() 在涉及多个守卫时略有不同。 我在 routeIfCan 中没有看到太多空间来添加额外的 $guard 或 $connection 参数,所以我建议你使用 $menu->addIf(Auth::user()->can('administrate'), ...)而是。

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2017-03-11
      • 2018-07-09
      • 2021-08-22
      相关资源
      最近更新 更多