8
votes

Puis-je refactoriser ma configuration de plusieurs types d'utilisateurs en utilisant la même table différemment / d'une manière de gâteau plus?

J'ai un My_USERS Table et j'ai maintenant besoin de le refroidir en supprimant la colonne de rôle en faveur de la prise en charge de plusieurs rôles par utilisateur. Donc, par exemple, les 3 types d'utilisateurs que je traite sont:

  1. combattant
  2. arbitre
  3. manager

    Donc, la configuration de la table ressemble à ceci:

    users.php xxx

    Myuserstable.php xxx

    FighterStable.php xxx

    Référestable.php et managerstable.php sont similaires à FighterStable mais ont leurs propres règles de validation et peuvent avoir leurs propres propriétés virtuelles d'entité spéciale et ce qui n'est pas.

    Question: Y a-t-il un moyen de structuration de plus en gâteaux, ou plus particulièrement d'une autre façon de faire le avant tout pour distinguer le rôle? Eu l'exigence de rôle est resté 1: 1 avec les utilisateurs, j'ai peut-être peut-être fait quelque chose comme ceci: xxx

    J'apprécierais tout aperçu restructurer cela.


5 commentaires

Je ne vois pas une raison pour laquelle les types d'utilisateurs sont-ils nécessaires pour étendre l'objet Tableau des utilisateurs? Si c'est juste une validation, vous pouvez créer différents ensembles de règles de validation et définir lequel est utilisé. Ainsi, les utilisateurs hausseur de FighterPerfiles, Abrifiless, AdminProfiles + Un ensemble de règles pour chacun devraient faire le travail. book.cakephp.org/3.0/fr/ orm / ...


Une autre raison est que les entités pourraient partager des méthodes similaires. Par exemple, si je voulais une propriété virtuelle _getfullname, je peux le spécifier dans Myuserentality et les autres l'auront. Sans parler de toute autre méthode courante, telle que la recherche d'une «numéro d'identité de l'organisation» existante que tous auront et ne peuvent pas être dupliqués.


Utilisez des traits, des héritages ou des comportements? Ou ce github.com/usemuffin/sti également si chaque type d'utilisateur a une carte d'identité, il suffit de bouger cet identifiant à la table des utilisateurs?


J'utilise déjà la configuration que j'ai spécifiée. Désolé si cela était déroutant, mais je me demandais des questions n ° 1-3, qui incluent si je pouvais éviter les "Gotchas". En ce qui concerne la table des utilisateurs, je voulais le garder pur si / lorsque quelqu'un migre / met à jour le schéma de CakeC / utilisateurs.


Copiez simplement la table des utilisateurs vers une migration de niveau d'application? Je n'ai jamais été un fan de garder ces types de migrations dans un plugin car la table des utilisateurs est très susceptible d'obtenir des extras que le plugin ne couvrira pas. Vous pouvez toujours ajouter des champs simples sur votre migration de niveau d'application sur cette table si vous ne souhaitez pas déplacer toute la migration.


3 Réponses :


0
votes

Je ne sais pas si j'ai bien compris les idées, mais peut-être que ce code sera utile. Il utilise quelque chose comme des alias d'espace de noms.

Fichier FighterStable.php: P>

namespace App\Model\Table;

use Cake\ORM\Query;
use CakeDC\Users\Model\Table\UsersTable as FighterUsersTable;

class FightersTable extends FighterUsersTable
{
    // Yous callbacks (like beforeFind)
    ...
}


1 commentaires

ERR - J'ai déjà eu cette configuration (bien que mes principaux utilisateurs prouvent les utilisateurs de Cakec), je me demandais simplement s'il y a une meilleure façon de restructurer ce que j'ai actuellement.



2
votes

Qu'est-ce que j'ai typiquement fait / vu dans une situation dans laquelle vous avez plusieurs rôles, utilisez une table pour stocker les rôles (appelons-le d'USERRoles) et une autre table de recherche (appelons cet USERROREASSIGNEMENTS) qui connecte l'utilisateur à un rôle spécifique. Donc, par exemple, vos myuserstables contiendraient une relation de hasmany avec USERROREASSIGNEMENTS. Cela éliminerait le besoin de champ de rôle ainsi que les tables distinctes de chaque rôle. Votre méthode FindRole () ressemblerait à ceci comme suit: xxx

vous pouvez chaîner un premier () appelez-le si vous vous attendez que si un utilisateur en ait une rôle; Toutefois, cette configuration est agréable car si un utilisateur peut avoir plusieurs rôles que vous pouvez simplement chaîner un toarray () appeler et renvoyer un tableau de rôles appartenant à l'utilisateur.


3 commentaires

Je fais déjà quelque chose comme ça, mais qu'en est-il de la configuration du modèle que j'ai avec avant et plusieurs tables? Y a-t-il une alternative?


Je ne comprends pas. Dans le code que vous avez posté, vous ne faites pas quelque chose comme ça. Si vous modélisez votre dB comme je l'ai suggéré, il n'est pas nécessaire d'exécuter un appel avant ()


La façon dont je crée ces utilisateurs est différente, avec différents champs requis pour chaque utilisateur et un processus séparé, je les divisons donc en plug-ins distincts pour chaque type d'utilisateur pour gérer les modifications du modèle. J'aurais toujours besoin d'un moyen de "définir" le type de processus de validation à utiliser en fonction du rôle, de sorte que je devrais donc définir le rôle sur l'utilisateur à un moment donné. Je pensais que les modèles Split étaient plus faciles en termes de cela et j'aurais dû ajouter ceci à la question.



5
votes

Vous pouvez définir appartenance d'appartenance code> Association à utiliser FindbyRole CODE> Finder : xxx pré>

Bien sûr, vous devrez définir le Finder dans MyUSERS CODE>: P>

$this->MyUsers->behaviors()->get('Role')->config([
   'roles' => ['manager'], 
]);


6 commentaires

Réponse géniale, ce que je cherchais. J'ai principalement scindé mes modèles en classes en raison de la flexibilité d'avoir des entités distinctes et une personnalisation plus facile pour la validation. Savez-vous s'il est possible de définir une entité si vous avez une association d'auto-références?


Merci, content d'aider. Je ne vois pas cela documenté et devinez que ce n'est pas le cas. Je vois dans DOC que la touche EntityClass est utilisée pour configurer l'objet de la table, peut-être que cela fonctionnera également en référence. Une autre solution pourrait probablement utiliser la même entité et l'usine pour en avoir besoin. Ça ne fonctionnera-t-il pas pour vous?


Comme vous avez la requête dans Finder, vous pouvez appeler $ Query-> Carte (Fonction ($ entité) {retour $ entity-> Tospecificity ();});


Ou, probablement plus simple: $ Query-> map (fonction ($ entité) {retour nouvelle autre activité ($ entité-> toarray ());});


Merci - et totalement oublié de cliquer sur le bouton Bounty :)


@meperomuraliev c'était une bonne question. C'est probablement la première fois que je suis confronté à la question de savoir comment quelque chose pourrait être fait de la manière du cadre (B / C franchement, vous aviez déjà une solution de travail avant même de demander). Je me sens comme si j'ai besoin d'apprendre sur la manière de poser un tel type de question pour le cadre, je viens de commencer à travailler avec ... et c'est ce que je prévois d'apprendre à faire. C'était un plaisir pour moi de répondre à cela. Merci!