2011-07-31 2 views
0

J'ai 3 tables qui contiennent des informations sur l'utilisateur, une pour les étudiants, une pour les enseignants et une pour les administrateurs.

Ils ne sont aucunement liés. Je ne voulais pas créer un tableau de bord pour les administrateurs, où une liste d'étudiants et d'enseignants apparaît.

La seule façon que j'ai trouvée pour y parvenir était d'utiliser la variable $uses dans le contrôleur Administrators. Cependant, j'ai lu dans de nombreux endroits que c'est une mauvaise pratique.

Des solutions?

Répondre

3

Un autre, peut-être plus pratique est l'utilisation de ClassRegistry::init('MyModel')->myMethod() (more reading @ Cake API)

Ce ne charge que l'objet quand il est utilisé, par opposition à loadModel ou uses, avec ClassRegistry les modèles sont traités comme des singletons.

-

que vous faites quelque chose de mal: vous avez besoin d'un accès à un modèle qui n'a rien à voir avec votre contrôleur de courant.

Il y a beaucoup de conditions où vous auriez besoin d'accéder à tous les de vos données modèles, d'un contrôleur, mais jamais une réponse définitive sur la façon de le faire sans convention casser!

+0

Pas une meilleure pratique .. ici, il est de la bouche du cheval: https://groups.google.com/forum/#!msg/cake-php/E3xXtOsBAxc/mMfAOBBFTHkJ –

2

Vous pouvez toujours utiliser un autre modèle qui ne se rapporte pas à l'aide

$this->loadModel('NewModelName'); 

Ensuite, vous pouvez accéder à nouveau modèle chargé par:

$this->NewModelName->add(); // whatever method model has defined 

Pourquoi préfèrent loadModel() sur les utilisations?

Pour améliorer les performances. Comment? utilise appelle la fonction loadModel elle-même pour charger tous les modèles que vous spécifiez dans uses array. Mais le problème est de savoir si une seule de vos actions nécessite un modèle particulier, quelle est la bonne chose à inclure dans chaque action. par exemple. Seule l'action add() nécessite un modèle indépendant, mais si vous l'avez spécifié dans array, quelle que soit l'action appelée, un modèle complètement indépendant va se charger. Pour le dire simplement, ce sera inefficace. C'est comme si vous aviez déclaré des variables dans un programme en C mais ne les utilisiez jamais. Dans le cas d'un compilateur C vous avertira que vous n'utilisez pas vos variables, mais malheureusement, le gâteau ne peut pas vous le dire.

Son bien d'utiliser utilise si toutes vos actions doivent charger ce modèle, utilisez loadModel() sinon.

+0

quelle est la différence entre ceci et la méthode $ uses? – AlexBrand

+0

'$ uses' est une mauvaise pratique! –

+1

lol juste parce que? – AlexBrand

1

Vous avez probablement pas lu ma réponse à votre autre question :))

J'ai 3 tables qui contiennent des informations utilisateur, un pour les étudiants, l'un pour les enseignants et un pour les administrateurs. Ils ne sont aucunement liés. Je ne voulais pas créer un tableau de bord pour les administrateurs, où une liste d'étudiants et d'enseignants apparaît.

Le problème est que vous séparez des données similaires en 3 tables différentes, dans ce cas, des informations utilisateur. Ainsi, lorsque vous essayez de gérer ces données, vous frappez un mur de briques: parce que vous omettez les relations lorsque vous les séparez en 3 tables. La seule façon que j'ai trouvée pour réaliser cela était d'utiliser la variable $ uses dans le contrôleur Administrators.

Vous avez eu une mauvaise idée de l'automate. Chaque contrôleur gère le flux de données d'un modèle particulier (et des modèles associés). Cela ne signifie pas que vous devez rester dans le contrôleur Admin pour faire des choses administratives. Quel modèle vous voulez manipuler décide ce contrôleur que vous devez être.

Cependant, je l'ai lu dans beaucoup d'endroits que cela est une mauvaise pratique.Maintenant, pour la question principale: l'utilisation de $ uses est un drapeau rouge indiquant que vous faites quelque chose de mal: vous avez besoin d'accéder à un modèle qui n'a rien à voir avec votre contrôleur actuel. Maintenant, il y a toujours des exceptions dans la programmation, parfois nous devons avoir accès à ce modèle. C'est là que loadModel entre en jeu. Parce que cela devrait être rare. Si vous avez besoin du modèle, vous devrez appeler beaucoup loadmodel, ce qui est fastidieux, ce qui est pour $ uses, mais cela signifie que quelque chose ne va pas avec la conception de votre application :))

vous pouvez dire que l'utilisation de $ uses est un signe de mauvaise décision (dans la conception de DB ou dans la structure de l'application); et utilise donc beaucoup loadModel.

Editer: Any solutions? J'ai donné une solution dans votre autre question. Mais si vous voulez les avoir tous en un seul endroit, vous pouvez avoir 1 table d'utilisateurs avec des informations d'utilisateur. Chaque utilisateur peut hasOne Student, Teacher, Administrator et un champ 'group' pour décider quel groupe est l'utilisateur. La troisième solution utilise $ uses. Son impact sur les performances ne sera vraiment pas un problème. Mais ce sera très compliqué lorsque vous développerez votre application. C'est ce dont vous avez besoin de vous inquiéter. Par exemple, je peux dire que, si vous utilisez Auth, vous aurez besoin de le modifier un peu pour le faire fonctionner avec 3 modèles. Si vous utilisez la table des utilisateurs, ce sera beaucoup plus facile.

+0

Donc vous dites avoir une seule table d'utilisateurs, puis une table d'étudiants, d'enseignant et d'admin qui aura simplement une colonne id et une colonne user_id? Souhaitez-vous conserver la conception actuelle, créer des actions d'administration dans les contrôleurs des étudiants et des enseignants, puis utiliser ajax pour obtenir le tout sur une seule page? – AlexBrand

+0

Oui pour la première question.Pour le 2nd: si vous conservez le design actuel, utilisez $ uses dans admin controller est le moyen le plus simple (ne vous inquiétez pas de l'impact sur les performances). Je ne suis pas à votre place pour savoir ce qu'il y a de mieux à long terme et toutes les solutions sont acceptables. alors choisissez-en un que vous avez envie d'utiliser. –

Questions connexes