2010-03-02 14 views
12

Pourquoi mon modèle ne charge-t-il pas la bibliothèque de chiffrement?Charger une bibliothèque dans un modèle dans CodeIgniter

class User_model extends Model { 

    function User_model() { 
    parent::Model(); 
    $this->check_login(); 
    } 

    function check_login() { 
    $this->load->library('encrypt'); 
    $email = $this->encrypt->decode($email); 
    .... 
    } 
} 

Cela me donne une erreur de PHP: Appel à un décodage de fonction membre() sur un non-objet en ligne X - où X est le $ this-> encrypt-> decode ($ email); ligne?

Edité pour montrer que le problème était que check_login a été appelé par le constructeur

Répondre

5

j'appelle check_login à partir du constructeur, et qui était à l'origine des problèmes.

La solution consiste à appeler $this->_assign_libraries(); juste après le chargement d'une bibliothèque dans un constructeur.

Merci à ce fil forum CodeIgnitor: http://codeigniter.com/forums/viewthread/145537/

+3

Je sais que ce fil de discussion est très ancien, mais si vous voyez ceci, sachez que la version actuelle de CI vous permet de charger des bibliothèques dans des modèles sans aucun problème. –

20

Vous n'avez pas besoin de charger la bibliothèque dans le modèle, les modèles sont toujours appelés des CONTROLEURS il vous suffit de charger les bibliothèques dans le contrôleur, et les fonctions seront disponibles dans les modèles appelés de lui!

Cordialement,
Pedro

+10

Oui, mais le chargement des bibliothèques là où elles sont nécessaires minimise les problèmes de dépendance. – Summer

+1

Alors chargez-le dans la fonction de contrôleur juste qui appellent le modèle – Pedro

+11

Quelle idée merdique! Sérieusement, Une autre gaffe à courte vue par l'équipe CodeIgniter! Un modèle est un endroit parfait pour consommer une bibliothèque API qui traite de l'obtention de données d'application! Forcer moi à charger une bibliothèque dans le contrôleur dont dépend une classe Model sous-jacente! ?? Que se passe-t-il? Vis ça!Appelez $ this -> _ assign_libraries(); terminé! – Bretticus

3

Les bibliothèques devraient automatiquement être affectés à l'instance modèle il devrait fonctionner correctement. N'oubliez pas que si vous ne pouvez pas accéder au super-global, vous pouvez toujours utiliser $ ci = & get_instance() pour le récupérer sans frais supplémentaires pour votre mémoire. Mais quand même ... votre exemple de code devrait fonctionner>. <

2

J'ai essayé beaucoup d'entre eux, mais à la fin, ce que je faisais est-ce dans un modèle:

$this->load->library('mylib'); 
$mylib= new Mylib(); 
$mylib->somemethod(); 

Cela fonctionne pour moi.

0

vous pouvez modifier le nom de l'objet pour la bibliothèque que vous chargez beacause CI a également obtenu la classe Crypter

faire juste

$this->load->library('encrypt',NULL,'myencryptobj'); 
$this->myencryptobj->yourfunction(); 

Hope this helps

0

i était également confronté à la question de facebook api, alors j'ai essayé required_once le fichier lib de facebook dans le modèle. ça a marché pour moi.

require_once "application/libraries/facebook.php"; puis faites son objet si vous en avez besoin.

Questions connexes