当我的类在同一名称空间中时,为什么不能找到它?

时间:2013-08-15 05:14:05

标签: laravel laravel-4 composer-php

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

folder structure

我正在使用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
{
}

My 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}}

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

我在添加psr-0条目时运行composer dump-autoloadinstall。所以我不确定我还需要做什么。我对作曲家很陌生,所以在这一点上我已经迷失了问题所在。

提前致谢。

6 个答案:

答案 0 :(得分:1)

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

我认为您需要在此处更新您的角色和权限命名空间类名称:

文件:vendor / entrust / config / config.php:

(默认只是"角色"和#34;权限"没有命名空间,因此当您将实施移动到一个时,它不起作用。)

您还有两个选择:

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

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

答案 1 :(得分:1)

Confide和Entrust都在全局命名空间中寻找角色和权限模型。由于您更改了这两个模型的命名空间,因此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'=> “应用程序\模块\核心\角色”, 'permission'=> '应用\模块\核心\权限',

  • php artisan clear-compiled

  • php artisan optimize

答案 2 :(得分:0)

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

Workrach包及其类由Laravel自动处理 - 无需配置任何内容。

此处有更多信息:http://laravel.com/docs/packages

答案 3 :(得分:0)

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

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

作者摘要(Boris Strahija):

Laravel 4主要基于作曲家包,这是一件好事,但有时开发人员(比如我自己)喜欢将他们的代码分成模块。在构建大型项目时,这尤其好。现在使用捆绑系统在Laravel 3中相当容易,但是在Laravel 4中,很多人建议构建包,因为L4具有很好的工作台功能。这一切都很好,但有时我喜欢将我的应用程序特定控制器和视图分成模块,而不必通过工作台来完成它。

简而言之,你必须

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

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

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

或者像这样翻译短语:

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

最后,要测试模块,您可以创建一些路径,但这取决于您如何使用代码。

答案 4 :(得分: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

答案 5 :(得分:0)

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

use App\Modules\Core\Models\Permission;