【问题标题】:Calling various methods of a controller from the loader从加载器调用控制器的各种方法
【发布时间】:2017-07-12 22:17:09
【问题描述】:

我正在尝试构建一个加载器,以在控制器中加载各种控制器及其方法(根据需要)。我在我的家庭控制器上草绘了一个简单的代码来调用 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 = new $class(); 之后添加 $controller->index(),但这将始终调用控制器的 index() 方法。

我如何编码这个方法部分,以便我可以调用与控制器关联的任何方法,而不仅仅是 index()。

【问题讨论】:

  • 方式太宽泛了。

标签: php oop model-view-controller controller loader


【解决方案1】:

您可以通过控制器传递方法参数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多