You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
    }
}

问题排查与解决

  1. 内置服务器路由转发配置
    PHP内置服务器默认不会将所有请求转发到index.php,需要指定入口文件启动:
php -S localhost:3000 -t public public/index.php

(根据你的项目目录结构调整public/index.php的路径)

  1. 命名空间大小写不匹配
  • routes.php中控制器命名空间用了小写app\controllers,但ContactController.php的命名空间是大写app\Controller,PSR-4自动加载对大小写敏感,统一修改:
    将routes.php中的$controllerNamespace = "app\controllers\{$controller}";改为"app\Controller\{$controller}"
    确保控制器文件所在目录为app/Controller,与命名空间对应
  1. 异常信息未输出
    index.php的catch块仅调用$e->getMessage()但未输出,修改为:
catch (Exception $e) {
    echo $e->getMessage();
}
  1. 缺失基础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 {
    // 原有代码
}
  1. 更新Composer自动加载
    修改命名空间后,重新生成自动加载文件:
composer dump-autoload

内容的提问来源于stack exchange,提问作者Pedro Neto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:43:21