【问题标题】:How can I dynamically call a function with a controller that is called dynamically?如何使用动态调用的控制器动态调用函数?
【发布时间】:2018-07-07 11:33:34
【问题描述】:

我正在尝试通过实现动态路由器来改进我的迷你网站,所以我做了以下操作

<?php

use App\Controller\Autoloader;
use App\Controller\PostController;
require_once("controller/Autoloader.php");

Autoloader::register(); 


$url = $_SERVER['REQUEST_URI'];

$url = explode('/', $url);
array_shift($url);
$base = $url[0];
$url = $url[1];
$page = "";
$function = "";
$controller = "";
 $urlArray = array(
'base' => $base,
'page' => $page,
'parameters' => array(
    "controller" => $controller,
    "function" => $function
)
 );
 $url = explode("?", $url);
 $urlArray["page"] = $url[0];


 $url = explode("&", $url[1]);

 $urlArray['parameters']['controller'] = str_replace("controller=", "",       $url[0]);
 $urlArray['parameters']['function'] = str_replace("action=", "", $url[1]);

 $controllerName = $urlArray['parameters']['controller'];
 $controller = new $controllerName();

 $controller->$urlArray['paremeters']['function']();

因为我的网址是 cleperduv2/index.php?controller=PostController&action=listPosts

我想调用控制器 PostController.php 上的函数 listPosts

(!) 致命错误:在第 40 行的 C:\wamp64\www\cleperduv2\index.php 中找不到类“PostController”

【问题讨论】:

  • 你在加载PostController的类吗?为什么不使用框架?
  • 看起来你的控制器在App/Controller/PostController,不是吗?
  • 是的,我的控制器在 App/Controller/PostController 中,只是为了确保我创建的自动加载器使用静态路由器加载所有类(仅包含 if 条件)。非常感谢您的宝贵时间
  • 即使我直接设置包含控制器名称的变量(如 $controllerName = "PostController";

标签: php function dynamic controller router


【解决方案1】:

看起来像是有命名空间的东西, 你有没有试过这样称呼它: $namespace = "App\Controller\\"; $controllerName = $namespace . $urlArray['parameters']['controller']; $controller = new $controllerName;

您可以下拉 PostController 的 use 命名空间语句,这样您的所有控制器都将根据需要动态地被要求、声明和实例化!

【讨论】:

    【解决方案2】:

    如果你想让 php 解释类名,你应该真正使用控制器的完整路径;

    这句话的意思:

    $controller = new $controllerName();
    

    使用这个:

    $controller = new "App\Controller\PostController";
    

    如果你曾经使用过 laravel,你可能会注意到,在 larevels 路由中,控制器是由完整的类名指定的。即:

    Route::get('/myIndexPage', 'Namespace1\Namespace2\MyController@index');
    

    因此,根据相同的原则,您最好遵循约定在同一个命名空间中定义您的控制器,这样您就可以这样做:

    $controller = new "App\Controllers\$controllerName";
    

    【讨论】:

    • 感谢您的宝贵时间,但现在我在同一行得到了这个!解析错误:语法错误,第 40 行 C:\wamp64\www\cleperduv2\index.php 中的意外 '"'
    • 您可能在没有注意到的情况下转义了双引号。你能发布你的第 40 行吗?
    • 这里是:$controller = new "App/Controller/$controllerName";
    • 请注意,我使用“使用命名空间 App\Controller\PostController; 之后由自动加载器使用
    • 用反斜杠试试,不行,把你的文件贴出来让我看看。
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2011-05-13
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多