我正在创建一个非常基本的PHP路由/控制器,仅用于学习目的。在一些项目中使用Laravel我非常喜欢它的路由功能所以我想要复制类似的东西。
$route->map('/', function() {
echo 'Hello World!';
});
$route->map('/', array('uses' => 'PagesController@index'));
$route->start();
第一种方法效果很好,我相信它是一种匿名函数。第二种方法我可以用以下代码创建一个名为PagesController.php的文件:
Class PagesController extends Controller {
public function index()
{
echo 'Hello World';
}
}
这也有效,但它会引发错误:
Fatal error: Function name must be a string in /home/git/Codingcats-Blog/classes/Route.php on line 40
这是我的整个路由类:
class Route
{
private $request = array();
private $basePath = '/';
function map($request, $params)
{
if (array_key_exists('uses', $params))
{
$parts = explode('@', $params['uses']);
$controller = $parts[0];
$method = $parts[1];
if (!file_exists(PATH . 'controllers/' . $controller . '.php'))
exit('Controller: ' . $controller . ' does not exist.');
require_once PATH . 'controllers/' . $controller . '.php';
$controller = new $controller;
if (method_exists($controller, $method))
$this->request[$request] = $controller->$method(); // ??????
}
else
{
$this->request[$request] = $params;
}
}
function start()
{
$path = array_key_exists('PATH_INFO', $_SERVER) ? $_SERVER['PATH_INFO'] : $this->basePath;
$this->request[$path]();
}
}
我不确定// ??????
的那一行虽然我无法理解它,因为两种映射方法最终都是一个函数,并且两者都有效,只是第二次抛出错误
我可以直接使用$controller->$method();
调用该函数,但我得到Notice: Undefined index: / in...
建议赞赏:)