2017-02-22 113 views
-1

Я пытаюсь построить загрузчик для загрузки различных контроллеров с помощью своих методов (по мере необходимости) в контроллер. Я набросал простой код на моем домашнем контроллере, чтобы вызвать LeftController (теперь это фиктивный контроллер, но я намерен использовать этот контроллер в качестве меню).Вызов различных методов контроллера из загрузчика

require 'controller/LeftController.php'; 
$LeftController = new LeftController(); 
$LeftController->index(); 

Это работает в HomeController. Он загружает контроллер LeftController и отображает индекс метода().

На основании моего загрузчика на приведенном выше коде, это то, что я сделал до сих пор

class Loader 
{ 

    public function controller($controller) 
    { 
     $file = 'controller/' . $controller . '.php'; 
     $class = $controller; 

     if (file_exists($file)) { 
      require($file); // require 'controller/LeftController.php'; 
      $controller = new $class(); //$LeftController = new LeftController(); 

      var_dump($controller); 
     } 
    } 
} 

Это тоже работает и контроллер конкретизируется. Я вижу результат с помощью var_dump().

Теперь мне нужно вызвать метод, так как мы видим в верхней части кода $LeftController->index();, но на этот раз класс Loader.

Один из способов сделать это, если я добавлю $controller->index() сразу после $controller = new $class();, но это всегда вызовет метод index() контроллера.

Как закодировать эту часть метода так, чтобы я мог вызвать любой метод, связанный с контроллером, а не только с индексом().

+0

Это ** способ ** слишком широко. – yivi

ответ

0

Вы можете передать метод аргумент с контроллером:

public function controller($controller, $method) 

, а затем вызвать его на вновь созданный объект:

$controller->$method() 

Однако,

его Кажется, вы пытаетесь изобрести колесо. Часть, где вы проверяете наличие файлов, включаете ее и создаете экземпляр класса, называется autoloading.

Код может выглядеть следующим образом:

public function controller($controller, $method) 
{ 
    $instance = new $controller(); 
    return $instance->$method(); 
} 

Хотя самозарядная часть использует spl_autoload_register() для управления поиском и включения файлов.

Функция spl_autoload_register() регистрирует любое количество автозагрузчиков, позволяя автоматически загружать классы и интерфейсы, если они в настоящее время не определены.

Таким образом, вы можете использовать код, у вас уже есть, и абстрагировать от действия экземпляра класса:

spl_autoload_register(function autoloader($controller) { 
    $file = 'controller/' . $controller . '.php'; 
    if (file_exists($file)) { require($file); } 
});