PHP MVC路由报错:请求的资源/未在服务器找到
PHP MVC路由无法识别,资源找不到问题
我正在尝试用MVC模式和路由创建PHP项目,但服务器无法正确识别路由。用php -S localhost:3000运行项目时,路由完全失效,提示“请求的资源/未在服务器找到”,自定义Exception也未触发。试过XAMPP,问题依旧。
以下是相关代码文件:
routes.php
<?php function load(string $controller, string $action){ try{ $controllerNamespace = "app\controllers\{$controller}"; if(!class_exists($controllerNamespace)){ throw new Exception("O controlador {$controller} não existe!"); } $controllerInstance = new $controllerNamespace(); if(!method_exists($controllerInstance, $action)){ throw new Exception("O método {$action} não existe no controlador {$controller}!"); } $controllerInstance->$action((object)$_REQUEST); } catch(Exception $e){ echo $e->getMessage(); }; } $router = [ 'GET'=> [ '/' => fn() => load('HomeController','index'), '/contact' => fn() => load('ContactController','index') ], 'POST'=> [ '/contact' => fn() => load('ContactController','store') ] ]; ?>
index.php
<?php require "../vendor/autoload.php"; require "../app/routes/routes.php"; try { $uri = parse_url($_SERVER['REQUEST_URI'])['path']; $request = $_SERVER['REQUEST_METHOD']; if (!isset($router[$request])) { throw new Exception("A routa não existe"); } if (!array_key_exists($uri, $router[$request])) { throw new Exception("A routa não existe"); } $controller = $router[$request][$uri]; $controller(); } catch (Exception $e) { $e->getMessage(); } ?>
ContactController.php
<?php namespace app\Controller; class ContactController{ public function index(){ return Controller::view('contact'); } public function store($params){ var_dump($params->nome); } } ?>
composer.json
{ "name": "pedroneto/teste_roteamento", "description": "estudos de rotas em PHP", "autoload": { "psr-4": { "app\\": "app/" } }, "require": { "league/plates": "^3.5" } }
问题排查与解决
- 内置服务器路由转发配置
PHP内置服务器默认不会将所有请求转发到index.php,需要指定入口文件启动:
php -S localhost:3000 -t public public/index.php
(根据你的项目目录结构调整public/index.php的路径)
- 命名空间大小写不匹配
routes.php中控制器命名空间用了小写app\controllers,但ContactController.php的命名空间是大写app\Controller,PSR-4自动加载对大小写敏感,统一修改:
将routes.php中的$controllerNamespace = "app\controllers\{$controller}";改为"app\Controller\{$controller}"
确保控制器文件所在目录为app/Controller,与命名空间对应
- 异常信息未输出
index.php的catch块仅调用$e->getMessage()但未输出,修改为:
catch (Exception $e) { echo $e->getMessage(); }
- 缺失基础Controller类
ContactController调用了Controller::view()但未定义该基础类,创建app/Controller/Controller.php:
<?php namespace app\Controller; use League\Plates\Engine; class Controller { protected static function view(string $view, array $data = []) { $templates = new Engine('../app/views'); echo $templates->render($view, $data); } }
并让ContactController继承该类:
class ContactController extends Controller { // 原有代码 }
- 更新Composer自动加载
修改命名空间后,重新生成自动加载文件:
composer dump-autoload
内容的提问来源于stack exchange,提问作者Pedro Neto
相关产品推荐
相关产品推荐

