2009-11-18 2 views
2

Je suis très nouveau dans le codeigniter mais je comprends bien le POO et le MVC car je fais beaucoup de développement de Rails. Une chose que je n'ai pas encore compris est comment écrire une méthode de niveau de classe dans codeigniter et y accéder dans un contrôleur. Par exemple, jeMéthodes de classe et méthodes d'instance dans codeigniter, comment les utiliser?

<?php 
class User_model extends Model { 
    function user_model() 
    { 
     parent::Model(); 
    } 

    public static function get_total_users_count(){ 
     $results = $this->db->query("SELECT * FROM bhr_users GROUP BY userid"); 
     if($results){ 
      return $results->num_rows(); 
     } 
     return 0; 
    } 
} 
?> 

Je pense que ce que je l'ai fait ici est mis en place une méthode de niveau de classe pour mon modèle que je devrais être en mesure d'appeler avec User_model::get_total_users_count() Maintenant, dans mon contrôleur qui un programmeur précédent appelé « Bienvenue » I quelque chose comme:

<?php 

class Welcome extends Controller { 

    function Welcome() 
    { 
     parent::Controller(); 
     $this->load->model('bhr_model'); 
      $this->load->model('user_model'); 
    } 

    function index() 
    { 

     $invite = $this->uri->segment(3); 
     if($invite == 'invitefriends') { 
      $pagedata['invitefriends'] = $invite; 
     } else { 
      $pagedata['invitefriends'] = ''; 
     } 

     $pagedata['numberofpeople'] = User_model::get_total_users_count(); 
     $this->load->view('default_page', $pagedata); 
    } 
} 

l'appel de méthode ci-dessus pour get_total_users_count ne fonctionne pas parce qu'il dit parce que je suis en utilisant la méthode db sur une fonction de niveau de classe get_total_users_count. En d'autres termes $ ceci n'a pas de méthode db quand je référence une classe. Maintenant, ma question est un peu plus théorique. J'ai toujours pensé que les méthodes d'instance ne devraient être utilisées que lorsqu'une méthode agit sur une instance spécifique d'une classe. Ça a du sens, non? Cependant, get_total_users_count agit sur tous les "utilisateurs" et les compte. Il semble juste que cela devrait être une méthode au niveau de la classe. Êtes-vous d'accord? Si oui, savez-vous comment je peux accéder à la base de données à partir du cadre dans une fonction de niveau classe?

Merci!

Répondre

7

Puisque vous n'êtes pas instanciation User_model, vous devez obtenir l'instance CI, utilisez que pour vos requêtes db.

get_total_users_count intérieur():

$ci_ins =& get_instance(); 
$ci_ins->db->query(); 
+0

Pourquoi le downvote? Cela répond à la question "comment je peux accéder à la base de données à partir du cadre dans une fonction de niveau classe" – putolaruan

0
$pagedata['numberofpeople'] = $this->user_model->get_total_users_count(); 

C'est la méthode CI.

+0

qui ne répond pas vraiment à la question théorique à portée de main. Une fonction pour obtenir le nombre total d'utilisateurs ne fonctionne pas sur une instance d'utilisateur, donc il devrait probablement s'agir d'une méthode de classe – Tony

+0

Le meilleur moyen est alors de créer une instance du super objet CI –

1

get_total_user_count est plus d'une fonction pour une passerelle de table utilisateur. Le modèle de l'utilisateur devrait avoir des choses comme getUsername et getLastLogin.

utilisateur Table passerelle devrait avoir des choses comme findUserById, createNewUser et getTotalUserCount

+0

suggérez-vous d'ajouter une classe de passerelle pour chaque table.J'ai envie d'utiliser votre méthodologie dont j'aurais éventuellement besoin. Je ne suis pas en désaccord avec lui, il semble juste exagéré – Tony

+0

oui, c'est ce que je suggère. Cela rend les choses beaucoup plus propres, et cela a plus de sens, puisque vous avez raison de dire que la fonction n'agit pas sur une instance d'utilisateur spécifique. http://martinfowler.com/eaaCatalog/tableDataGateway.html – Galen

+1

point intéressant, je vais envisager de le faire. cependant, je pourrais argumenter que toutes les méthodes de niveau de classe sont la passerelle et toutes les méthodes de niveau d'instance ne sont pas ... et il n'y a aucun besoin de créer deux classes séparées – Tony

2

fonctionne CodeIgnighter est par instanciation vos modèles que vous les chargez. Ce que Thorpe Obazee a dit est la manière correcte de codeIgnighter d'utiliser votre modèle.

Ce que vous demandez, c'est si vous pouvez utiliser une méthode statique comme vous vous y attendez dans la plupart des cas, ce qui n'est pas le cas. Pour accomplir ce que vous cherchez, mives indique get_instance() qui est la bonne façon d'obtenir l'objet CI principal. Je m'en sers comme moi pour faire ce que tu fais.

3

Vous pouvez faire de votre classe une aide pour qu'elle ne soit pas chargée en tant qu'instance. Seul le code sera inclus de sorte que vous pouvez simplement l'appeler comme:

$sample = class_name::method(); 
Questions connexes