如何使用动态调用的控制器动态调用函数?

How can I dynamically call a function with a controller that is called dynamically?

我试图通过实施动态路由器来改进我的迷你网站,所以我做了以下

<?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']();

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

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

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

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

了解这个:

$controller = new $controllerName();

使用这个:

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

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

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

所以,按照同样的原则,你最好遵循一个约定,在同一个命名空间中定义你的控制器,这样你就可以这样做:

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

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

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