45 votes

Codeigniter : appeler une méthode d'un contrôleur à partir d'un autre

J'ai deux contrôleurs a y b .

Je voudrais appeler une méthode du contrôleur a d'une méthode de contrôle b .

Quelqu'un peut-il m'expliquer comment y parvenir ?

0 votes

Même si ce n'est pas la meilleure approche, elle est modulaire : ( [stackoverflow.com/a/6091913/1057527) [http://stackoverflow.com/a/](http://stackoverflow.com/a/6091913/1057527)[http://stackoverflow.com/a/6091913/1057527])

0 votes

Il y a un fil de discussion pertinent sur le site Forum EllisLab

0 votes

Le lien de @machineaddict est cassé. Peut-être corriger le markdown ? Editar : Ah, oui. Je suis trop vieux pour faire ça. :-( stackoverflow.com/questions/6091100/ C'est le bon lien.

32voto

Aren Points 17843

Ce comportement n'est pas pris en charge par le système MVC. Si vous voulez exécuter une action d'un autre contrôleur, il suffit de rediriger l'utilisateur vers la page souhaitée (c'est-à-dire la fonction du contrôleur qui consomme l'url).

Si vous voulez une fonctionnalité commune, vous devez créer une bibliothèque qui sera utilisée dans les deux contrôleurs différents.

Je ne peux que supposer que vous voulez construire votre site de manière un peu modulaire. (C'est-à-dire réutiliser la sortie d'une méthode de contrôleur dans d'autres méthodes de contrôleur). Il y a quelques plugins / extensions pour CI qui vous aident à construire de cette façon. Cependant, le moyen le plus simple est d'utiliser une bibliothèque pour construire des "contrôles" communs (c'est-à-dire charger le modèle, rendre la vue dans une chaîne). Vous pouvez ensuite retourner cette chaîne et la transmettre à la vue de l'autre contrôleur.

Vous pouvez charger dans une chaîne de caractères en ajoutant true à la fin de l'appel de la vue :

$string_view = $this->load->view('someview', array('data'=>'stuff'), true);

16voto

Rkk Points 69

test.php Fichier contrôleur :

Class Test {
 function demo() {
  echo "Hello";
 }
}

test1.php Fichier contrôleur :

Class Test1 {
 function demo2() {
  require('test.php');
  $test = new Test();
  $test->demo();
 }
}

13 votes

Utiliser un tel besoin avec un allumeur de code n'est pas une bonne idée.

1 votes

Cela va à l'encontre du but de la POO de l'IC.

10voto

prash.patil Points 46
Very simple way in codeigniter to call a method of one controller to other controller

1. Controller A 
   class A extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
    }
    function custom_a()
    {
    }
}

2. Controller B 

   class B extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
    }
    function custom_b()
    {
            require_once(APPPATH.'controllers/a.php'); //include controller
            $aObj = new a();  //create object 
            $aObj->custom_a(); //call function
    }
}

5voto

DODMax Points 50

Je suis d'accord que la façon de faire est de rediriger vers le nouveau contrôleur dans les cas habituels.

J'ai rencontré un cas d'utilisation où j'avais besoin d'afficher la même page à 2 types d'utilisateurs différents (l'utilisateur backend prévisualisant la page d'un utilisateur frontend) donc à mon avis ce dont j'avais besoin était d'appeler véritablement le contrôleur frontend depuis le contrôleur backend.

J'ai résolu le problème en rendant la méthode frontale statique et en l'enveloppant dans une autre méthode. J'espère que cela vous aidera !

//==========
// Frontend
//==========
function profile()
{
   //Access check

   //Get profile id
   $id = get_user_id();

   return self::_profile($id);
}

static function _profile($id)
{
   $CI = &get_instance();
   //Prepare page
   //Load view
}

//==========
// Backend
//==========
function preview_profile($id)
{
   $this->load->file('controllers/frontend.php', false);

   Frontend::_profile($id);
}

4voto

torr Points 2299

J'ai posté une question assez similaire il y a quelque temps, mais concernant une modèle sur CI.

Renvoyer deux résultats de requête distincts dans une fonction modèle

Bien que votre question ne soit pas exactement la même, je pense que la solution suit le même principe : si vous proposez de faire ce que vous mentionnez dans votre question, il y a peut-être quelque chose qui ne va pas dans la façon dont vous codez et un remaniement pourrait être nécessaire.

Le message à retenir est que ce que vous demandez n'est pas la bonne solution pour travailler avec MVC.

La meilleure pratique consiste à utiliser un modèle pour placer des fonctions réutilisables et les appeler dans un contrôleur qui transmet les données par l'intermédiaire d'une vue. encore mieux utiliser des aides ou des bibliothèques (pour les fonctions qui peuvent être nécessaires à plusieurs reprises).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X