0

modules在我的 Laravel 应用程序中创建了一个文件夹。到目前为止有两个模块,但我只专注于core这里。

文件夹结构

我正在使用 Confide 和 Entrust 来构建用户功能,如下所示:

namespace App\Modules\Core;

use Zizaco\Confide\ConfideUser;
use Zizaco\Entrust\HasRole;

class User extends ConfideUser {
  use HasRole;
}

和权限:

namespace App\Modules\Core;

use Zizaco\Entrust\EntrustPermission;

class Permission extends EntrustPermission
{
}

和角色:

namespace App\Modules\Core;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{
}

我的 Composer.json 自动加载内容如下:

"autoload": {
  "classmap": [
    "app/commands",
    "app/controllers",
    "app/models",
    "app/database/migrations",
    "app/database/seeds",
    "app/tests/TestCase.php",
    "app/modules"
  ],
  "psr-0": {
    "App\\Modules\\": "modules/"
  }
},

我把 psr-0 的东西放在那里,因为我无法让它们工作。尽管我运行 composer 时输出的自动加载文件似乎有希望的条目,但它们仍然不起作用。

数据库已迁移,现在我正在尝试运行数据库种子。我的播种脚本如下:

use App\Modules\Core\User;
use App\Modules\Core\Role;
use App\Modules\Core\Permission;

class UserTablesSeeder extends Seeder {

  public function run()
  {
    DB::table('users')->insert(array(
      'email'  => 'xxx',
      'first_name'  => 'xxx',
      'password'  => 'xxxx',
      'active'  => 1
    ));

    $admin = new Role;
    $admin->name = 'Admin';
    $admin->save();

    $manageUsers = new Permission;
    $manageUsers->name = 'manage_standard_users';
    $manageUsers->display_name = 'Manage Users';
    $manageUsers->save();

    $admin->perms()->sync(array($manageUsers->id));

    $user = User::where('email','=','xxx')->first();
    $user->attachRole($admin);
  }
}

但是当我运行时php artisan db:seed出现错误:

PHP Fatal error:  Class 'Permission' not found in /home/wedding/quincy/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 604
{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class 'Permission' not found","file":"\/home\/wedding\/quincy\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Eloquent\/Model.php","line":604}}

如果我摆脱了所有的命名空间,一切都会很好,但我认为我应该保留命名空间,因为我正在尝试创建模块化。

我已经运行了composer dump-autoload,并且install当我添加了 psr-0 条目时。所以我不确定我还需要做什么。我对作曲家很陌生,所以在这一点上,我不知道问题出在哪里。

提前致谢。

4

6 回答 6

1

不知道你是否找到了答案。

我认为你需要在这里更新你的角色和权限命名空间类名:

文件:供应商/委托/配置/config.php:

(默认只是没有命名空间的“角色”和“权限”,因此当您将实现移入一个时它不起作用)。

您还有另外两个选择:

  • 在 app/config.php (Role => "Namespace") 上为完全命名空间权限和角色类添加别名。

  • 有一种机制可以用适当命名的文件覆盖包配置设置。您可以只覆盖您需要的两个条目(角色和权限命名空间)。

于 2014-12-16T20:25:40.540 回答
1

Confide 和 Entrust 都在全局命名空间中寻找 Role 和 Permission 模型。由于您更改了这两个模型的命名空间,Confide 和 Entrust 无法找到它。要解决此问题,您需要覆盖 Entrust 配置。

  • 创建目录“app/config/packages/zizaco/entrust”
  • 将文件“vendor/zizaco/entrust/src/config/config.php”复制到“app/config/packages/zizaco/entrust/config.php”
  • 编辑“app/config/packages/zizaco/entrust/config.php”并更改以下两行 'role' => 'App\Modules\Core\Role', 'permission' => 'App\Modules\Core\Permission' ,

  • php artisan 清晰编译

  • php工匠优化
于 2015-01-26T13:16:50.907 回答
0

如果您查看 Doctrine composer.json,例如/vendor/doctrine/cache/composer.json

"autoload": {
    "psr-0": { "Doctrine\\Common\\Cache\\": "lib/" }
},

这些文件位于:

/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
... and so on

按照这种逻辑,我认为您应该将文件放入:

modules/App/Modules/Core/User.php
modules/App/Modules/Core/Permission.php
modules/App/Modules/Core/Role.php
于 2013-10-24T07:28:01.173 回答
0

从您的屏幕截图中,Permission 类位于models文件夹中,因此当您包含命名空间时,您应该键入

use App\Modules\Core\Models\Permission;
于 2013-10-24T17:20:43.237 回答
0

在本地开发时,您应该依赖 Laravel 的包(例如,通过 Workbench 创建)。
包是向 Laravel 添加功能的主要方式。

Laravel 自动处理 Workbench 包及其类 - 无需配置任何东西。

更多信息在这里: http: //laravel.com/docs/packages

于 2013-08-15T06:22:26.607 回答
0

如果您想使用自己的模块而不是标准工作台包,请查看描述如何实现这一点的这篇文章:

http://creolab.hr/2013/05/modules-in-laravel-4/

作者 ( Boris Strahija ) 的总结:

Laravel 4 很大程度上基于 composer 包,这是一件好事,但有时开发人员(比如我自己)喜欢将他们的代码分成模块。这在构建大型项目时特别好。现在这在 Laravel 3 中使用 bundles 系统相当容易做到,但在 Laravel 4 中,许多人只推荐构建包,因为 L4 有一个很好的工作台功能。这一切都很好,但有时我喜欢将特定于应用程序的控制器和视图分离到模块中,而不必使用工作台进行处理。

简而言之,你必须

  • 将您的模块代码放在某个位置(例如 /app/modules/)
  • 在 autoload/classmap 下包含 composer.json 文件中的目录
  • 创建一个合适的服务提供者(Laravel 4 使用服务提供者来注册和启动包,你也可以将它与模块一起使用)
  • 注册服务提供者 - 将它们添加到提供者数组下的“app/config/app.php”中的应用程序配置中

所以现在我们的模块可以正常工作了。您可以添加模块特定的路由,对控制器/视图/模型进行分组,获取模块配置,如下所示:

Config::get('content::channels');

或者得到这样的翻译短语:

Lang::get('shop::errors.no_items_in_cart');

最后,为了测试你的模块,你可以创建一些路由,但这取决于你如何使用你的代码。

于 2013-08-16T11:54:05.600 回答