wake-up-neo.net

Wie lädt man einen Controller von einem anderen Controller in Codeigniter?

Ich möchte einen Controller von einer Funktion in einem anderen Controller laden, da ich die Bibliothek, die ich in mein Projekt integriert habe, nicht in den Controller laden möchte, weil ich ihn sauber und verwandt halten möchte.

Ich habe es mit Modulen versucht, musste aber trotzdem Controller in die URL setzen 

http://example.com/maincontroller/function
http://example.com/othercontroller/function

Ich habe einen Standardcontroller, damit ich http://example.com/function laden kann. Wie kann ich also von einer Funktion aus auf den Controller zugreifen, damit ich den Controller nicht in die URL eingeben muss.

Ich bin immer noch bereit, HMVC zu verwenden, wenn ich die Controller-Funktion von der Haupt-Controller-Funktion laden kann. 

29
Luis Liz

Sie können einen Controller nicht von einem Controller in CI laden - es sei denn, Sie verwenden HMVC oder etwas anderes. 

Sie sollten ein wenig über Ihre Architektur nachdenken. Wenn Sie eine Controller-Methode von einem anderen Controller aus aufrufen müssen, sollten Sie diesen Code wahrscheinlich für einen Helfer oder eine Bibliothek zusammenfassen und ihn von beiden Controllern aufrufen.

UPDATE

Nachdem Sie Ihre Frage noch einmal gelesen haben, ist mir klar, dass Ihr Endziel nicht unbedingt HMVC ist, sondern die URI-Manipulation. Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, als würden Sie versuchen, URLs zu erstellen, wobei der erste Abschnitt der Methodenname ist und der Controller-Name ganz weggelassen wird.

Wenn dies der Fall ist, erhalten Sie eine sauberere Lösung, wenn Sie creative mit Ihren Routen erhalten. 

Für ein wirklich einfaches Beispiel, Sie haben zwei Controller, controller1 und controller2. Controller1 hat eine Methode method_1 - und controller2 hat eine Methode method_2.

Sie können Routen wie folgt einrichten:

$route['method_1'] = "controller1/method_1";
$route['method_2'] = "controller2/method_2";

Dann können Sie Methode 1 mit einer URL wie http://site.com/method_1 und Methode 2 mit http://site.com/method_2 aufrufen.

Dies ist zwar ein hartcodiertes, sehr einfaches Beispiel - aber es könnte Ihnen helfen, dorthin zu gelangen, wo Sie sein müssen, wenn Sie lediglich den Controller aus der URL entfernen müssen.


Sie können auch mit die Controller neu zuordnen .

Aus den Dokumenten: "Wenn Ihr Controller eine Funktion namens _remap () enthält, wird diese immer aufgerufen, unabhängig davon, was Ihr URI enthält.":

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}
21
swatkins

ja kannst du (für Version 2)

laden Sie so in Ihren Controller

 $this->load->library('../controllers/whathever');

und rufen Sie die folgende Methode auf:

$this->whathever->functioname();
42
Geomorillo

sie können eine Controller-Methode nicht direkt von einem anderen Controller aus aufrufen 

meine Lösung ist, Vererbungen zu verwenden und Ihren Controller vom Bibliothekscontroller zu erweitern 

class Controller1 extends CI_Controller {

    public function index() {
        // some codes here
    }

    public function methodA(){
        // code here
    }
}

in Ihrem Controller nennen wir es Mycontoller, es erweitert Controller1

include_once (dirname(__FILE__) . "/controller1.php");

class Mycontroller extends Controller1 {

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

    public function methodB(){
        // codes....
    }
}

und Sie können methodA von mycontroller aufrufen

http://example.com/mycontroller/methodA

http://example.com/mycontroller/methodB

diese Lösung hat für mich funktioniert

15
Moes

Ich hatte ein ähnliches Problem. Ich wollte zwei Controller haben:

homepage.php - öffentlich zugängliche Homepage

home.php - Startbildschirm, nachdem ein Benutzer angemeldet war

und ich wollte, dass sie beide von 'mydomain.com' lesen

Ich konnte dies erreichen, indem ich in meiner Routenkonfiguration 'hompepage' als Standard-Controller festlegte und eine Startseite der Startseite.php hinzufügte

function _remap()
{
  if(user_is_logged_in())
  {
    require_once(APPPATH.'controllers/home.php'); 
    $oHome =  new Home();
    $oHome->index();
  }
  else
  {
    $this->index();
  }
}
8
Keith Ritter

Während die oben genannten Methoden funktionieren könnten, ist hier eine sehr gute Methode.

Erweitern Sie den Core-Controller um einen MY-Controller, und erweitern Sie diesen MY-Controller für alle anderen Controller. Zum Beispiel könnten Sie Folgendes haben:

class MY_Controller extends CI_Controller {
    public function is_logged()
    {
        //Your code here
    }
public function logout()
    {
        //Your code here
    }
}

Dann könnten Ihre anderen Controller dies wie folgt erweitern:

class Another_Controller extends MY_Controller {
    public function show_home()
    {
         if (!$this->is_logged()) {
           return false;
         }
    }
public function logout()
    {
        $this->logout();
    }
}
1
Smith

Ich hatte Session-Datei nicht gefunden Fehler während verschiedene Möglichkeiten ausprobiert, schließlich wie folgt erreicht. Die Funktion wurde als statisch (was ich in einem anderen Controller aufrufen möchte) gemacht und wie aufgerufen

require_once('Welcome.php');
Welcome::hello();
0
Rajesh

Erstellen Sie einen Helfer mit dem von mir erstellten Code und nennen Sie ihn controller_helper.php.

Laden Sie Ihren Helfer automatisch in die autoload.php-Datei unter config.

Rufen Sie aus Ihrer Methode controller('name') auf, um den Controller zu laden. 

Beachten Sie, dass name der Dateiname des Controllers ist.

Diese Methode hängt '_controller' an Ihren Controller 'name' an. Um eine Methode in der Steuerung aufzurufen, führen Sie einfach $this->name_controller->method(); aus, nachdem Sie die Steuerung wie oben beschrieben geladen haben.

<?php

if(!function_exists('controller'))
{
    function controller($name)
    {
        $filename = realpath(__dir__ . '/../controllers/'.$name.'.php');

        if(file_exists($filename))
        {
            require_once $filename;

            $class = ucfirst($name);

            if(class_exists($class))
            {
                $ci =& get_instance();

                if(!isset($ci->{$name.'_controller'}))
                {
                    $ci->{$name.'_controller'} = new $class();
                }
            }
        }
    }
}
?>
0
Taurai Muzopa

Я пришел сюда, потому что мне нужно было создать функцию {{ render() }} in Twig, чтобы имитировать поведен. Die Suche nach dem richtigen Partner für einen Partner in der Kategorie "Sport & Freizeit".

Даже если вы не являетесь пользователем Zweig, вы все равно можете воспользоваться этим помощником и использовать его в своих представлениях для рендеринга контроллера, используя <?php echo twig_render('welcome/index', $param1, $param2, $_); ?>. Wenn Sie einen Artikel kaufen, werden Sie diesen Artikel sofort erhalten.

Вот:

helpers/twig_helper.php

<?php

if (!function_exists('twig_render'))
{

    function twig_render()
    {
        $args = func_get_args();
        $route = array_shift($args);
        $controller = APPPATH . 'controllers/' . substr($route, 0, strrpos($route, '/'));

        $explode = explode('/', $route);
        if (count($explode) < 2)
        {
            show_error("twig_render: A twig route is made from format: path/to/controller/action.");
        }

        if (!is_file($controller . '.php'))
        {
            show_error("twig_render: Controller not found: {$controller}");
        }
        if (!is_readable($controller . '.php'))
        {
            show_error("twig_render: Controller not readable: {$controller}");
        }
        require_once($controller . '.php');

        $class = ucfirst(reset(array_slice($explode, count($explode) - 2, 1)));
        if (!class_exists($class))
        {
            show_error("twig_render: Controller file exists, but class not found inside: {$class}");
        }

        $object = new $class();
        if (!($object instanceof CI_Controller))
        {
            show_error("twig_render: Class {$class} is not an instance of CI_Controller");
        }

        $method = $explode[count($explode) - 1];
        if (!method_exists($object, $method))
        {
            show_error("twig_render: Controller method not found: {$method}");
        }

        if (!is_callable(array($object, $method)))
        {
            show_error("twig_render: Controller method not visible: {$method}");
        }

        call_user_func_array(array($object, $method), $args);

        $ci = &get_instance();
        return $ci->output->get_output();
    }

}

Weitere Informationen zu Twig:

libraries/Twig.php

$this->_twig_env->addFunction('render', new Twig_Function_Function('twig_render'));

Usage

{{ render('welcome/index', param1, param2, ...) }}
0
Alain Tiemblo