【问题标题】:Why can't my class be found, when it's in the same namespace?为什么在同一个命名空间中找不到我的类?
【发布时间】:2013-08-15 05:14:05
【问题描述】:

我在我的 Laravel 应用程序中创建了一个 modules 文件夹。到目前为止有两个模块,但我这里只关注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}}

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

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

提前致谢。

【问题讨论】:

  • PSR-0 将命名空间映射到目录位置,您可能通过将“App\Modules”命名空间设置为一个目录“modules”来“破坏”我的位置。我没有测试过这个理论。您可能还需要将目录名称大写以匹配命名空间。同样,我还没有彻底阅读 psr-0 以了解 - 这可能是 *nix 与 Windows 的问题,而不是 PSR-0 问题。

标签: laravel laravel-4 composer-php


【解决方案1】:

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

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

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

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

您还有另外两个选择:

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

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

【讨论】:

    【解决方案2】:

    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”并更改以下两行 '角色' => '应用\模块\核心\角色', '权限' => '应用\模块\核心\权限',

    • php artisan clear-compiled

    • php 工匠优化

    【讨论】:

      【解决方案3】:

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

      工作台包及其类由 Laravel 自动处理 - 无需配置任何东西。

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

      【讨论】:

      • 我的应用程序不依赖于这些模块,它是这些模块。这就是为什么我认为工作台不适合他们。我只是想把应用程序本身分解成更易于管理的部分,我应该能够按照自己的喜好来构建它。也就是说,如果我不能让它工作,我可能正在使用工作台,是的。感谢您的评论。
      • 所以我决定将整个东西移动到一个包中,看看它是否有效,我得到了完全相同的错误消息。 PHP 致命错误:在第 604 行的 /home/wedding/quincy/workbench/pioneer/quincy-core/vendor/illuminate/database/Illuminate/Database/Eloquent/Model.php 中找不到类“权限”{“错误”:{ "type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"找不到类 'Permission'","file":"\/home\/wedding\/quincy\/workbench \/pioneer\/quincy-core\/vendor\/illuminate\/database\/Illuminate\/Database\/Eloquent\/Model.php","line":604}}
      【解决方案4】:

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

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

      作者总结(Boris Strahija):

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

      简而言之,你必须

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

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

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

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

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

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

      【讨论】:

      • 感谢您的回复。事实上,这就是我所遵循的教程。我认为这实际上可能是 Entrust 的问题。
      【解决方案5】:

      如果您查看 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
      

      【讨论】:

        【解决方案6】:

        从你的截图来看,Permission 类位于models 文件夹中,所以当你包含你的命名空间时,你应该输入

        use App\Modules\Core\Models\Permission;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-06
          • 2011-03-21
          • 2012-05-27
          • 2017-10-04
          • 1970-01-01
          • 2012-11-09
          • 1970-01-01
          相关资源
          最近更新 更多