我在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
{
}
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-autoload
和install
。所以我不确定我还需要做什么。我对作曲家很陌生,所以在这一点上我已经迷失了问题所在。
提前致谢。
答案 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 / config.php”并更改以下两行 'role'=> “应用程序\模块\核心\角色”, 'permission'=> '应用\模块\核心\权限',
php artisan clear-compiled
答案 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具有很好的工作台功能。这一切都很好,但有时我喜欢将我的应用程序特定控制器和视图分成模块,而不必通过工作台来完成它。
简而言之,你必须
所以现在我们的模块已经完全正常工作了。您可以添加模块特定的路由,对控制器/视图/模型进行分组,获取模块配置,如下所示:
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;