2010-11-03 1 views
-2

Я пишу структуру микро MVC, и я хочу иметь возможность запускать функцию на основе действия в указанном URL-адресе. Я сейчас занимаюсь:Вызвать функцию, основанную на переменной в родительском контроллере

function action($id, $function){ 

${$id}->{$function}(); 

} 

Где $ id - модель/просмотр/контроллер для загрузки, а функция $ - действие. Это, видимо, работает, но не в MainController. Я бы поставил его в сценарий запуска, который был бы ограниченным, так как я хочу, чтобы люди могли запускать действие изнутри представления, чтобы они могли выполнять разные действия на основе того, что они дают этой функции.

Fatal error: Call to a member function testFunction() on a non-object in /home/cherwell/public_html/scott/develop/simple/system/controllers/MainController.php on line 20 

Кто-нибудь знает дорогу вокруг него, чтобы я мог вызвать функцию из дочернего контроллера из MainController?

Cheers!

EDIT: Я сделал работу действий, выполнив:

if($action != false){ 

${$id}->{$action}(); 

} else { 

include("system/views/".$id.".php"); 
} 

$ ID и $ действия всегда определены, поэтому он прекрасно работает. Единственная проблема у меня есть сейчас, что любые функции должны иметь все глобал (его длинный список):

global $id; 
global ${$id}; 
global $site; 
global $start; 
global $action; 
global $param; 
global $helper; 
global $model; 

, если они нуждаются в каких-либо из них (которые, как они делают, если вам нужно вызвать методы из maincontroller/helper/model) ...

Я не знаю, почему переменные не передаются в функции. Я также объявил класс для соответствующего идентификатора ...

EDIT 2: Пример.

function testFunction(){ 
global $helper; 
$helper->test(); 

$this->render("home"); 

} 

Works, но когда я удалить глобальный $ помощника; не удается. Даже если у меня есть загрузка глобалов в старте, конструкция дочернего и родительского, она все равно терпит неудачу. Это также происходит для каждой функции (требующей глобальных переменных). Может ли кто-нибудь помочь?

ответ

0

Я закончил тем, что делает функцию __init() в главном контроллере, который был призван на загрузку сайта. Работает красиво. Теперь модели/помощники/просмотр и контроллер работают отлично.

Спасибо за помощь! :)

0

В этом случае $ {$ id} имеет значение null, поскольку он не был установлен. Вы пытаетесь сделать что-то вроде следующего?

function action($id, $function){ 

    $controller = new $id(); 
    $controller->{$function}(); 

} 
1

Вы пытались использовать функцию, предназначенную для предотвращения такого рода кодирования?

function action($id, $function, $params = array()) 
{ 
    if(!is_object($id)) 
    { 
     $id = new $id; //Or just use globalization or something to bring it in scope. 
    } 

    call_user_func_array(array($id,$function),$params); 
} 
0

Как насчет:

$app = new myApp(); 
function action ($action) 
{ 
    global $app; 
    if (!method_exists($app,$action)) return; 
    $app->$action(); 
}