我正在尝试通过前端控制器设计深入研究 MVC。
我想通过使用一行来调用我的整个应用程序,例如在index.php中:
require_once(myclass.php);
$output = new myClass();
我很想摆脱 require_once 行,但我不知道如何在不包含它的情况下加载我的类?
无论如何,我的主要问题是如何使用一个前端类加载各种控制器、模型和视图等。到目前为止我已经想出了:
class myClass
{
private $name;
public $root = $_SERVER['DOCUMENT_ROOT'];
private $route = array("Controller" => "", "Model" => "", "View" => "", "Paremeters" => "");
function __construct()
{ $uri = explode("/",$_SERVER['REQUEST_URI']);
if(isset($uri[2])) {$this->route['Controller'] = $uri[2];}
if(isset($uri[3])) {$this->route['Model'] = $uri[3];}
if(isset($uri[4])) {$this->route['View'] = $uri[4];}
if(isset($this->route['Controller']))
{
include($this->root."/".$this->route['Controller'].".php");
}
}
}
但这似乎有点令人费解,而且有些过头了。另外,一旦我将新类包含在 __construct 中,我应该如何加载它?
我很抱歉缺乏知识,我已经在谷歌上搜索了很多次,但我不断出现相同的页面,这些页面似乎并没有扩展我对此事的知识。
如果您的网址肯定会是http://domain.com/[控制器]/[操作]/ http://domain.com/%5Bcontroller%5D/%5Baction%5D/参数,那么你的前端控制器可能如下所示:
<?php
class Application
{
public function __construct()
{
$this->setupAutoloader();
$this->route();
}
private function setupAutoloader()
{
// do your autoloading here
}
private function route()
{
$request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$controller = isset($request[0]) ? ucwords(array_shift($request)) . 'Controller' : 'HomeController';
$action = isset($request[0]) ? array_shift($request) : 'index';
$parameters = $request;
$response = call_user_func_array(array($controller, $action), $parameters);
}
}
从这里,您可以添加自动加载器实现,对响应执行任何您想要的操作,然后从您的索引.php如下:
<?php
require 'path/to/Application.php';
$application = new Application();
不幸的是,如果第一个文件存储在文件系统的其他位置,那么您总是必须包含它,但如上所述,您可以从这里自动加载其他类,例如库、控制器、模型等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)