Я пытаюсь построить загрузчик для загрузки различных контроллеров с их методами (по мере необходимости) в контроллере. Я набросал простой код на своем домашнем контроллере для вызова LeftController (теперь это фиктивный контроллер, но я собираюсь использовать этот контроллер в качестве меню).
require 'controller/LeftController.php';
$LeftController = new LeftController();
$LeftController->index();
Это работает в HomeController. Он загружает контроллер LeftController и отображает метод index ().
Основываясь на моем загрузчике на приведенном выше коде, это то, что я делал до сих пор
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 () контроллера.
Как мне кодировать эту часть метода так, чтобы я мог вызывать любой метод, связанный с контроллером, а не только index ().
Вы можете передать аргумент метода с вашим контроллером:
public function controller($controller, $method)
и затем вызовите его на вновь созданном объекте:
$controller->$method()
тем не мение,
кажется, вы пытаетесь изобрести колесо. Часть, в которой вы проверяете, существуют ли файлы, включаете ли вы их и создаете экземпляр класса, называется самозарядные.
Код может выглядеть так:
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); }
});
Других решений пока нет …