大佬教程收集整理的这篇文章主要介绍了php – 我可以使用相同的表以不同的方式重构我的多个用户类型的设置吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
>战士
>裁判
>经理
因此表设置如下所示:
use CakeDC\Users\Model\Table\UsersTable as BaseUsersTable; class UsersTable extends BaseUsersTable { public function initialize(array $config) { parent::initialize($config); $this->setEntityClass('Users\Model\Entity\User'); $this->belongsToMany('UserRoles',[ 'through' => 'users_user_roles' ]); $this->hasmany('UsersUserRoles',[ 'className' => 'UserS.UsersUserRoles','ForeignKey' => 'user_id','saveStrategy' => 'replace',]); } public function findRole(Query $query,array $options) { return $query ->innerJoinWith('UserRoles',function($q) use ($options) { return $q->where(['role_key' => $options['role_key']]); }); } }@H_113_1@myUsersTable.PHP
class MyUsersTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->setTable('my_users'); $this->setprimaryKey('user_id'); $this->belongsTo('Users',[ 'className' => 'UserS.Users',]); } /** * @param Cake\Event\Event $event * @param Cake\ORM\Query $query * @param ArrayObject $options */ public function beforeFind(Event $event,Query $query,\ArrayObject $options) { // set the role if (defined(static::class.'::rOLE') && mb_strlen(static::rOLE) > 0) { $role = static::rOLE; // set user conditions $query->innerJoinWith('Users',function($query) use ($rolE) { return $query->find('role',[ 'role_key' => $role,]); }); } } /** * @param \Cake\ORM\Query $query * @param array $options */ public function findByRegistrationCode(Query $query,array $options): Query { $query->where([ $this->aliasField('registration_no') => $options['registration_no'] ]); return $query; } }
use MyUsers\Model\Table\MyUsers; class fightersTable extends MyUsersTable { const ROLE = 'fighter'; public function initialize(array $config) { parent::initialize($config); $this->setEntityClass('fighters\Model\Entity\fighter'); } /** * @param Validator $validator * @return Validator $validator */ public function validationDefault(Validator $validator): Validator { $validator = parent::validationDefault($validator); $validator->allowEmpty('field'); } }
RefereesTable.PHP和ManagersTable.PHP类似于fightersTable,但有自己的验证规则,可能有自己的特殊实体虚拟属性,而不是.
问题:是否有一种更好的结构方式,或者更具体地说是另一种方法来进行beforeFind以区分角色?如果角色的要求与用户保持1:1,我可能会做这样的事情:
$this->belongsTo('fighters',[ 'conditions' => [ 'role' => 'fighter' ],'className' => 'MyUsers',]);
我很欣赏任何有关重组的见解.
$this->belongsTo('fighters',[ 'ForeignKey' => 'user_id','finder' => ['byRole' => ['role' => 'fighter']] ]);
当然,你必须在MyUsers中定义finder:
public function findByRole(Query $query,\ArrayObject $options) { $role = $options['role']; // set user conditions $query->innerJoinWith('Users',function($query) use ($rolE) { return $query->find('role',[ 'role_key' => $role,]); }); } }
我还将beforeFind逻辑提取到RoleBehavior或MultiRoleBehavior behavior中,即:
SRC /型号/性能/ RoleBehavior.PHP:
<?PHP namespace App\Model\Behavior; use Cake\ORM\Behavior; use Cake\ORM\Query; use Cake\Event\Event; /** * Role-specific behavior */ class RoleBehavior extends Behavior { /** * @var array multiple roles support */ protected $_defaultConfig = [ 'roles' => [] ]; public function initialize(array $config) { parent::initialize($config); if (isset($config['roles'])) { $this->config('roles',$config['roles'],false /* override,not merge*/); } } public function beforeFind(Event $event,\ArrayObject $options,$priMary) { // set user conditions $query->innerJoinWith('Users',function($query) use ($roles) { return $query->find('role',[ 'role_key' => $roles,]); }); } }
它使用多个角色,但如果需要,您只需将其更改为单个角色即可.以下是其他一些事情要做 – 可能将$query-> innerJoinWith(‘Users’…提取到行为中的单独方法中,并在MyUsers :: findByRole(…)中调用它…
接下来,您可以将此行为直接附加到扩展类,只需使用行为配置替换静态ROLE:
use MyUsers\Model\Table\MyUsers; class fightersTable extends MyUsersTable { public function initialize(array $config) { parent::initialize($config); $this->setEntityClass('fighters\Model\Entity\fighter'); $this->addBehavior('Role',[ 'roles' => ['fighter']]); } }
或者,您可以通过将行为附加到MyUsers表(即从控制器)来管理您的特定于角色的逻辑:
$this->MyUsers->addBehavior('Role',['roles' => ['manager']])
You also can change the behavior setup on the fly:
$this->MyUsers->behaviors()->get('Role')->config([ 'roles' => ['manager'],]);
我希望它有所帮助.
以上是大佬教程为你收集整理的php – 我可以使用相同的表以不同的方式重构我的多个用户类型的设置吗?全部内容,希望文章能够帮你解决php – 我可以使用相同的表以不同的方式重构我的多个用户类型的设置吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。