这是我的php项目的结构
文件 index.php 和 config.php 位于根文件夹中。
在 config.php 文件中,我定义了libs文件夹的路径
<?php
require 'config.php';
function __autoload($class) {
require LIBS. $class. ".php";
}
$bootstrap = new Bootstrap();
$bootstrap->init();
//Composer autoloader
require 'vendor/autoload.php';
这是 index.php 文件夹
<?php
class Bootstrap {
private $_url = null;
private $_controller = null;
private $_controllerPath = '/../controllers/';
private $_modelPath = 'models/';
private $_errorFile = 'error.php';
private $_defaultFile = 'home.php';
public function init(){
$this->_parseUrl();
if(empty($this->_url[0])){
$this->_loadDefaultController();
return false;
}
$this->_loadExistingController();
$this->_callControllerMethod();
}
private function _parseUrl(){
$url = isset($_GET['url']) ? $_GET['url'] : null;
$url = rtrim($url, '/');
$url = filter_var($url, FILTER_SANITIZE_URL);
$this->_url = explode('/', $url);
}
private function _loadDefaultController() {
require $this->_controllerPath . $this->_defaultFile;
$this->_controller = new Home();
$this->_controller->index();
}
private function _loadExistingController() {
$file = $this->_controllerPath . $this->_url[0] . '.php';
if(file_exists($file)) {
require $file;
$this->_controller = new $this->_url[0];
$this->_controller->loadModel($this->_url[0], $this->_modelPath);
} else {
$this->_error();
return false;
}
}
private function _callControllerMethod() {
if(isset($this->_url[2])) {
if(method_exists($this->_controller, $this->_url[1])) {
$this->_controller->{$this->_url[1]}($this->_url[2]);
} else {
$this->_error();
}
} else {
if(isset($this->_url[1])) {
if(method_exists($this->_controller, $this->_url[1])) {
$this->_controller->{$this->_url[1]}();
} else {
$this->_error();
}
} else {
$this->_controller->index();
}
}
}
private function _error() {
require $this->_controllerPath . $this->_errorFile;
$this->_controller = new Error();
$this->_controller->index();
exit;
}
}
这是 Bootstrap.php 文件
Bootstrap
问题是,Warning: require(/../views/error/index.php): failed to open stream: No such file or directory in C:\xampp\htdocs\project\app\libs\View.php on line 9
Fatal error: require(): Failed opening required '/../views/error/index.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\project\app\libs\View.php on line 9
类以正确的方式检测到Home控制器,但它没有找到其他控制器,例如用户控制器,并尝试使用错误控制器,但没有找到错误索引视图。
Connection.Execute strSQL, 0, adCmdText
我猜道路径有问题,但我不知道如何解决它。如何使Bootstrap找到其他控制器?也许我应该改变项目结构?这是我第一次创造一些东西,所以我只想弄明白。
答案 0 :(得分:2)
由于您正在创建一个新项目并且已经使用了composer,因此您可以按照PSR-4的自动加载规范进行操作。您无需实施自动加载器。使用composer,您甚至可以使用classmap为不遵循PSR-0/4的项目定义自动加载。但是,如果你开始一个你应该遵循PSR-0/4的新项目,那么classmap自动加载就可以用于旧的遗留代码库。
<小时/> 说,您可以更改当前代码:
更改
for connection in connections:
try:
runQuery(connection)
break;
except:
continue;
到
DEFINE('LIBS', '/app/Libs/');
define('LIBS', __DIR__ . '/app/Libs/');
是magic constant,在这种情况下表示__DIR__
目录的绝对路径。我的建议是不要依赖相对路径。出于同样的原因改变
config.php
到
require $this->_controllerPath . $this->_defaultFile;
// and
require $this->_controllerPath . $this->_errorFile;
// and
$file = $this->_controllerPath . $this->_url[0] . '.php';