2009-11-23 12 views
4

Mes modèles dans CodeIgniter doivent vérifier qu'un utilisateur est autorisé à effectuer l'action donnée. Dans les modèles, j'ai référencé en utilisant $ this-> session-> userdata ['user_id']. Ma question est - dois-je définir une variable à $ this-> session-> userdata ['user_id'] dans le contrôleur et le passer au modèle, ou simplement le vérifier dans le modèle?CodeIgniter Modèle/Contrôleur et ID utilisateur

Cela importe-t-il même? Je suppose que le fait de passer $ user_id dans la fonction le rendrait (légèrement) plus lisible. Quels sont les arguments et recommandations pour/contre?

Répondre

6

Vous pouvez choisir entre des données qui sont fondamentales pour votre application et des données qui sont accessoires à une fonction de membre de modèle donnée. Les choses que vous utilisez partout devraient être garanties (membres de base, globales, etc.), et les choses utilisées seulement dans la fonction courante devraient être des paramètres. Vous constaterez que l'utilisation de variables implicites (comme $this->session->userdata) dans de nombreux endroits de vos modèles et de vos vues deviendra rapidement un spaghetti et sera imprévisible si vous ne les initialisez pas correctement.

Dans mes projets CodeIgniter, j'ajoute un modèle de base personnalisé et un contrôleur qui hérite du cadre CI, en ajoutant leurs propres données de membre qui sont utilisées partout dans l'application. J'utilise ces classes de base pour fournir des données et des fonctions que tous mes modèles et contrôleurs utilisent (y compris des choses comme userID). Dans le constructeur de my_base_controller, j'appelle le constructeur de base de CI et configure les données dont tous mes contrôleurs et vues ont besoin. Cela garantit des valeurs par défaut prévisibles pour les données de classe.

+0

+1 Je fais quelque chose de similaire avec mon contrôleur de base, car un ID utilisateur est quelque chose que dans la plupart des applications vous allez vérifier partout. –

1

Strictement parlant $this->session->userdata['user_id'] appartient au contrôleur.
portent notamment sur les données uniquement ... contrôleurs, par le contrôle de la définition du flux des données ...
et l'authentification est une forme de contrôle de données ... (à mon humble avis)

Codewise, je suivre cette procédure

class MyControllerName extends Controller{ 
    function MyMyControllerName(){ 
    parent::Controller(); 
    $this->_user_id=$this->session->userdata['user_id']; //<-- define userid as a property of class 
    } 
} 

Et puis, dire un de mes fonctions foo() requiert une authentification .. je referais ce

function foo(){ 
    $this->_checkAuthentication(); //should short out if not authenticated 
    //rest of the function logic goes here 
} 

le _checkAuthentication() peut b Je simplifie comme:

function _checkAuthentication(){ 
    if(!isset($this->_user_id) && $this->_user_id<=0){ /or any other checks 
    header("Location: ".base_url()."location_of/user_not_authorised_page"); 
    exit; 
    } 
}