可控制的行为在Cakephp3.0的插件中不起作用


Containable behavior is not working across the Plugins in Cakephp 3.0

我正在开发cakehp3.0,我喜欢使用插件,我以插件的形式编写了我的应用程序,我的问题是cakepp3.0不允许跨插件的可控制行为,这表明模型没有关联

我已经创建了两个插件Auth和Comments:

Auth插件中的控制器

  • 用户控制器
  • 角色控制器

Auth插件中的模型

在cakehp3.0中,与2.x相比,模型发生了变化,它们有实体和模型表,因此Auth模型表低于

  • 用户表格
  • 角色表

用户表:-

            <?php
        namespace Auth'Model'Table;
        use Auth'Model'Entity'User;
        use Cake'ORM'Query;
        use Cake'ORM'RulesChecker;
        use Cake'ORM'Table;
        use Cake'Validation'Validator;

        class UsersTable extends Table
        {
            public function initialize(array $config)
            {
                parent::initialize($config);
                $this->table('users');
                $this->displayField('name');
                $this->primaryKey('id');
                $this->addBehavior('Timestamp');
                $this->belongsTo('Roles', [
                    'foreignKey' => 'role_id',
                    'joinType' => 'INNER',
                    'className' => 'Auth.Roles'
                ]);
                $this->hasMany('Comments', [
                    'foreignKey' => 'user_id',
                    'className' => 'Auth.Comments'
                ]);
                $this->hasMany('Contents', [
                    'foreignKey' => 'user_id',
                    'className' => 'Auth.Contents'
                ]);
            }

            public function validationDefault(Validator $validator)
            {
                return $validator;
            }

            public function buildRules(RulesChecker $rules)
            {
                $rules->add($rules->isUnique(['email']));
                $rules->add($rules->isUnique(['username']));
                $rules->add($rules->existsIn(['role_id'], 'Roles'));
                return $rules;
            }}

角色表

        <?php
        namespace Auth'Model'Table;
        use Auth'Model'Entity'Role;
        use Cake'ORM'Query;
        use Cake'ORM'RulesChecker;
        use Cake'ORM'Table;
        use Cake'Validation'Validator;

        class RolesTable extends Table
        {
            public function initialize(array $config)
            {
                parent::initialize($config);
                $this->table('roles');
                $this->displayField('id');
                $this->primaryKey('id');
                $this->addBehavior('Timestamp');
                $this->hasMany('Users', [
                    'foreignKey' => 'role_id',
                    'className' => 'Auth.Users'
                ]);
            }
            public function validationDefault(Validator $validator)
            {

                return $validator;
            }
        }

评论Pugin

注释插件中的控制器

  • 注释控制器

评论中的模型插件

  • 备注表

        <?php
        namespace Comments'Model'Table;
        use Cake'ORM'Query;
        use Cake'ORM'RulesChecker;
        use Cake'ORM'Table;
        use Cake'Validation'Validator;
        use Comments'Model'Entity'Comment;
        class CommentsTable extends Table
        {
            public function initialize(array $config)
            {
                parent::initialize($config);
                $this->table('comments');
                $this->displayField('name');
                $this->primaryKey('id');
                $this->addBehavior('Timestamp');
                $this->addBehavior('Tree');
                $this->belongsTo('ParentComments', [
                    'className' => 'Comments.Comments',
                    'foreignKey' => 'parent_id'
                ]);
                $this->belongsTo('Users', [
                    'foreignKey' => 'user_id',
                    'className' => 'Comments.Users'
                ]);
                $this->belongsTo('Contents', [
                    'foreignKey' => 'content_id',
                    'joinType' => 'INNER',
                    'className' => 'Comments.Contents'
                ]);
                $this->hasMany('ChildComments', [
                    'className' => 'Comments.Comments',
                    'foreignKey' => 'parent_id'
                ]);
            }
            public function validationDefault(Validator $validator)
            {
                return $validator;
            }
            public function buildRules(RulesChecker $rules)
            {
                $rules->add($rules->isUnique(['email']));
                $rules->add($rules->existsIn(['parent_id'],       'ParentComments'));
                $rules->add($rules->existsIn(['user_id'], 'Users'));
                $rules->add($rules->existsIn(['content_id'], 'Contents'));
                return $rules;
            }
        }
    

现在我想让所有用户在评论控制器中获得他们的相关数据,我正在这样做:

    $this->Comments->Users->find('all',[
       'contain'=>['Roles']
    ])

这是节目的错误用户与角色没有关联,但它在旧版本的cakefp(2.7)中工作

用户与角色没有关联

不再有可包含的行为,包含现在是ORM的一部分,它通常可以很好地与插件模型/关联配合使用。我建议开始调试告诉你的非常具体的错误消息,检查为什么Comments.Users和Comments.Contents使用的是自动表(''Cake''ORM''Table的实例),而不是表类的具体实例!对我来说,看起来你想使用Auth.Users而不是Comment.Users.

我从@ndm 写的问题的第一条评论中复制了这些内容