Slim4控制器在本地主机中正确自动加载,但在远程服务器上未加载 ( "callable controller does not exist" )



我第一次使用Slim 4 PHP框架开发应用程序,它在本地主机上工作得很好,但我有一个在远程服务器上运行它的问题。当运行所有路由时,我得到以下错误,例如example.com/myapp/app.php/program:

Uncaught RuntimeException: Callable AppControllerProgramController::list() does not exist in /.../vendor/slim/slim/Slim/CallableResolver.php

以下是环境和主要php文件的基本配置:

  • localhost:Windows 10,Apache 2.4.53,PHP 8.1.12 (xampp)

  • 远程服务器:Debian,Apache 2.4.54,PHP 8.1.12

composer.json

{
"autoload": {
"psr-4": {
"App\": "app/"
}
}
}

app.php

use PsrHttpMessageResponseInterface as Response;
use PsrHttpMessageServerRequestInterface as Request;
use SlimFactoryAppFactory;
use SlimViewsTwig;
use SlimViewsTwigMiddleware;
require __DIR__ . '/vendor/autoload.php';
require_once './app/config-dev.php'; // contains all CONFIG_ vars
$app = AppFactory::create();
# set app's base path from config
$app->setBasePath(CONFIG_BASE_PATH);
$twig = Twig::create(CONFIG_TWIG_DIR, ['cache' => CONFIG_TWIG_CACHE]);
$app->add(TwigMiddleware::create($app, $twig));
if (CONFIG_DEBUG) {
$app->addRoutingMiddleware();
$app->addErrorMiddleware(true, true, true);
}
# routing
require_once './app/routing.php';
$app->run();

app/routing.php

use AppControllerProgramController;
$app->get('/program', [ProgramController::class, 'list'])
->setName('program');
// ...

应用程序/控制器/ProgramController.php

namespace AppController;
use PsrHttpMessageResponseInterface as Response;
use PsrHttpMessageServerRequestInterface as Request;
class ProgramController
{
public function __construct()
{
// ...
}

public function list(Request $request, Response $response, array $args): Response
{
// ...
}
}

我尝试了不同形式的命名空间和注册控制器的不同策略,例如:$app->get('/program', 'AppControllerProgramController:list')->setName('program');

我也试过运行composer dump-autoload,但没有任何工作。

这是个愚蠢的问题。保存控制器的文件夹以小写字母命名为"控制器",但命名空间是"AppController",因此无法找到它。这在区分大小写的UNIX系统上是至关重要的,但在文件路径不区分大小写的Windows上工作得很好。将文件夹名称更改为"Controller"后可以正常工作。

最新更新