我正在开发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 写的问题的第一条评论中复制了这些内容