如何使用动态调用的控制器动态调用函数?
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 语句,这样您的所有控制器都将根据需要动态地被要求、声明和实例化!
我试图通过实施动态路由器来改进我的迷你网站,所以我做了以下
<?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 语句,这样您的所有控制器都将根据需要动态地被要求、声明和实例化!