vista una otro otra llamar funcion desde dentro controlador cargar php codeigniter hmvc

php - una - Cómo cargar un controlador desde otro controlador en codeigniter?



llamar un controlador desde otro controlador laravel (8)

Quiero cargar un controlador desde una función en otro controlador porque la biblioteca que integé a mi proyecto no quiero cargarlo al controlador porque quiero mantenerlo limpio y relacionado.

Intenté usar módulos, pero todavía tenía que poner el controlador en la url como

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

Tengo el controlador predeterminado, así que puedo cargar http://example.com/function así que ¿cómo podría acceder al controlador desde una función desde main para no tener que poner el controlador en la url?

Todavía estoy dispuesto a usar HMVC si puedo cargar la función del controlador desde la función del controlador principal.


Crea un ayudante utilizando el código que he creado a continuación y nómbralo controller_helper.php.

Autoload su ayudante en el archivo autoload.php en config .

Desde su método, llame al controller(''name'') para cargar el controlador.

Tenga en cuenta que el name es el nombre del archivo del controlador.

Este método agregará ''_controller'' a su controlador ''name'' . Para llamar a un método en el controlador solo ejecuta $this->name_controller->method(); después de cargar el controlador como se describe arriba.

<?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(); } } } } } ?>


Estaba teniendo el error de archivo de sesión no encontrado mientras intenté varias formas, finalmente lo logré así. Hice la función como estática (que quiero llamar en el otro controlador) y me llamó como

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


No puede cargar un controlador desde un controlador en CI, a menos que use HMVC o algo así.

Deberías pensar un poco en tu arquitectura. Si necesita llamar a un método de control desde otro controlador, probablemente debería abstraer ese código a un ayudante o biblioteca y llamarlo desde ambos controladores.

ACTUALIZAR

Después de leer su pregunta nuevamente, me doy cuenta de que su objetivo final no es necesariamente HMVC, sino la manipulación de URI. Corrígeme si me equivoco, pero parece que estás tratando de lograr URL con la primera sección como nombre del método y omitiendo el nombre del controlador por completo.

Si este es el caso, obtendría una solución más limpia al ser creativo con sus rutas .

Para un ejemplo realmente básico, digamos que tiene dos controladores, controller1 y controller2 . Controller1 tiene un método method_1 - y controller2 tiene un método method_2 .

Puede configurar rutas como esta:

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

Luego, puede llamar al método 1 con una URL como http://site.com/method_1 y al método 2 con http://site.com/method_2 .

Sin embargo, este es un ejemplo muy básico y codificado, pero podría llevarlo a donde necesita estar si todo lo que necesita hacer es eliminar el controlador de la URL.

También podría ir con la reasignación de sus controladores .

De los documentos: "Si su controlador contiene una función llamada _remap (), siempre se llamará independientemente de lo que contenga su URI":

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


Si bien los métodos anteriores podrían funcionar, este es un muy buen método.

Extienda el controlador del núcleo con un controlador MY, luego extienda este controlador MY para todos sus otros controladores. Por ejemplo, podrías tener:

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

Entonces sus otros controladores podrían extender esto de la siguiente manera:

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


Tuve un problema similar. Yo quería tener dos controladores:

homepage.php - página de inicio pública

home.php - pantalla de inicio una vez que el usuario inició sesión

y quería que ambos leyeran de ''midominio.com''

Pude lograr esto estableciendo ''hompepage'' como el controlador predeterminado en la configuración de mi ruta y agregando una función de reasignación a homepage.php

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


Vine aquí porque necesitaba crear una función {{ render() }} en Twig, para simular el comportamiento de Symfony2. Renderizar los controladores desde la vista es realmente genial para mostrar widgets independientes o productos ajax-recargables.

Incluso si no eres un usuario de Twig, puedes tomar este asistente y usarlo como quieras en tus vistas para renderizar un controlador, usando <?php echo twig_render(''welcome/index'', $param1, $param2, $_); ?> <?php echo twig_render(''welcome/index'', $param1, $param2, $_); ?> . Esto hará eco de todo lo que tu controlador haya emitido.

Aquí está:

ayudantes / 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(); } }

Específico para los usuarios de Twig (adapte este código a su implementación de Twig):

bibliotecas / Twig.php

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

Uso

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


no puede llamar un método de controlador desde otro controlador directamente

mi solución es usar herencias y extender tu controlador desde el controlador de la biblioteca

class Controller1 extends CI_Controller { public function index() { // some codes here } public function methodA(){ // code here } }

en su controlador lo llamamos Mycontoller extenderá Controller1

include_once (dirname(__FILE__) . "/controller1.php"); class Mycontroller extends Controller1 { public function __construct() { parent::__construct(); } public function methodB(){ // codes.... } }

y puedes llamar a methodA desde mycontroller

http://example.com/mycontroller/methodA

http://example.com/mycontroller/methodB

esta solución funcionó para mí


sí puedes (para la versión 2)

cargue así dentro de su controlador

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

y llame al siguiente método:

$this->whathever->functioname();