我在不使用框架的情况下从头开始编写我的小学习项目。不幸的是,我找不到任何关于如何正确配置路由的明确信息。
原则上,与预期的行为 - 一切正常。
但是,例如,如果它直接访问 index.php 文件,则会发生错误(就像任何其他 php 文件一样)。如果您访问一个文件夹,那么您也可以访问它,这意味着已经可以看到项目结构。
即使只是在地址行中写入随机字符,路由器也会尝试执行相应的方法。
我想摆脱这些缺点,以便在访问路径中不存在或未指定的文件时,将文件夹转移到例如主页。
下面我附上路由器、路由和.htaccess的内容。
路线.php:
return array(
'ajax/delFile/([0-9]+)' => 'ajax/delFile/$1',
'ajax/delMessage/([0-9]+)' => 'ajax/delMessage/$1',
'ajax/addPost/([0-9]+)' => 'ajax/addPost/$1',
'ajax/addPost' => 'ajax/addPost',
'editMessage/([0-9]+)' => 'message/editMessage/$1',
'message/search' => 'message/searchMessage',
'logout' => 'logout/logout',
'ajax/register' => 'ajax/registerUser',
'ajax/login' => 'ajax/loginUser',
'sign-up' => 'signup/show',
'message/([0-9]+)' => 'message/show/$1',
'' => 'index/showAllMessages',
);
路由器:
class Router
{
private $routes;
public function __construct()
{
$routesPath = __DIR__ . '/../../App/Config/routes.php';
$this->routes = require_once ($routesPath);
}
/**
* Получаем строку запроса
*
* @return bool|string Строка запроса, либо false если строка запроса отсутствует
*/
private function getURI()
{
if (!empty($_SERVER['REQUEST_URI'])) {
return trim(str_replace('mvcguestbook', '', $_SERVER['REQUEST_URI']), '/');
} else {
return false;
}
}
public function run()
{
$uri = $this->getURI();
//Проверяем наличие запроса в routes.php
foreach ($this->routes as $uriPattern => $path) {
//Ищем в URI совпадение с регулярным выражением uriPattern
if(preg_match("~$uriPattern~i", $uri)) {
//Формируем из URI внутренний маршрут
$internalRoute = preg_replace("~$uriPattern~i", $path, $uri);
//Определяем контроллер, экшн и параметры
$segments = explode('/', $internalRoute);
$controllerName = 'App\\Controllers\\' . ucfirst(array_shift($segments) . 'Controller');
$actionName = 'action'. ucfirst(array_shift($segments));
$controllerObject = new $controllerName;
$result = $controllerObject->$actionName($segments);
if ($result != null) {
break;
}
}
}
}
}
.ht 访问:
AddDefaultCharset utf-8
RewriteEngine on
RewriteBase /mvcguestbook
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php
我们得出结论,对于其他人来说,这可能是有用的:
1) 移除最后一个空路由,
}else{...}如果循环体还没有被执行,则通过-单独处理。2)例如,您现在有一个空控制器 =
'',将其更改为'(.*)',并将正则表达式本身更改为 :"~^$uriPattern$~i"附言
通常,框架有系统路由之类的东西,通常它们被设置在其余的地方(并且它们应该立即与自定义的分开)。
default_controller(通常显示在一个空的 urishka 上,作为主要的)
404(如果找不到路由)
错误(如果脚本中有错误,则调用此控制器,通常是set_error_handler()、set_exception_handler()、register_shutdown_function())
这是 3 个系统路由的示例,可能还有更多。