我建立了一个php mvc框架,这是我的htaccess文件。它可以找到,但是,当我返回索引页面后,它找不到默认的平台,控制器和方法,而其他链接可以找到,只是找到了索引页面。我尝试在获取值后取消设置默认平台,控制器和方法,但仍无法正常工作
RewriteEngine on
Options -Indexes
Options -Multiviews
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !-l
#RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
RewriteRule ^([a-zA-Z_-]*)/?([a-zA-Z_-]*)?/?([a-zA-Z_-]*)$ index.php?platform=$1&controller=$2&action=$3 [NC,L]
RewriteRule ^([a-zA-Z_-]*)/?([a-zA-Z_-]*)?/?([a-zA-Z_-]*)/?([0-9]*)$ index.php?platform=$1&controller=$2&action=$3&id=$4 [NC,L]
在我的控制器中,URL正在工作,可以传递参数并打开链接。 我在浏览器中的网址:blog.com/admin/products/list
$id = (int)$_GET['id'];
echo 'i am del';
echo 'my id is :'.$id;
echo '<br>';
echo "<a href='/'>index</a>";
echo '<br>';
echo "<a href='/admin/products/list'>List</a>";
但是当我单击索引(blog.com)时,出现消息:致命错误:未捕获的错误:找不到类'\ Controller \ Controller';如果可以,则应类似于“ \ Controller ** Admin **** ProductsController **** list **” 默认的平台,控制器和方法不见了; 这是我的php文件:
private static function initRoutes()
{
//unset($p);
$p = $_GET['platform'] ?? "Admin";
$c = $_GET['controller'] ?? "Products";
$a = $_GET['action'] ?? "list";
$p = ucfirst(strtolower($p));
$c = ucfirst(strtolower($c));
$a = strtolower($a);
define('PLATFROM_NAME', $p);
define('CONTROLLER_NAME', $c);
define('ACTION_NAME', $a);
define('__URL__', CONTROLLER_PATH . $p . DS);
define('__VIEW__', VIEW_PATH . $p . DS); //view path
}
加载课程:
private static function initAutoLoad()
{
spl_autoload_register(function ($class_name) {[enter image description here][1]
$namespace = dirname($class_name);
$class_name = basename($class_name);
if (in_array($namespace, array('Core', 'Lib')))
$path = FRAMEWORK_PATH . $namespace . DS . $class_name . '.class.php';
elseif ($namespace == 'Model')
$path = MODEL_PATH . $class_name . '.class.php';
elseif ($namespace == 'Traits')
$path = TRAITS_PATH . $class_name . '.class.php';
else
$path = CONTROLLER_PATH . PLATFROM_NAME . DS . $class_name . '.class.php';
if (file_exists($path) && is_file($path))
require $path;
});
}
对象:
private static function initDispatch()
{
$controller_name = '\Controller\\' . PLATFROM_NAME . '\\' . CONTROLLER_NAME . 'Controller';
$action_name = ACTION_NAME . 'Action';
$obj = new $controller_name();
$obj->$action_name();
}
答案 0 :(得分:0)
initAutoLoad
和.htaccess
文件无关:
initDispatch
没有创建正确的
类名(在自动加载之前) \Controller\\Controller
是一个类名,它告诉我PLATFROM_NAME
和CONTROLLER_NAME
都是空的。
initRoutes
定义了这两个变量。我能想到的唯一解释:
initDispatch
在initRoutes
之前被调用
安装XDebug并将断点设置为initRoutes
是找出答案的最快方法。