我正在开发一个应用程序与Slim 4 PHP框架的第一次,它在localhost工作得很好,但我有一个问题与运行它在远程服务器.我得到以下错误时,运行所有路由,例如example.com/myapp/app.php/program
:Uncaught RuntimeException: Callable \App\Controller\ProgramController::list() does not exist in /.../vendor/slim/slim/Slim/CallableResolver.php
下面是两个环境和主php文件的基本配置:
- Windows 10操作系统,Apache 2.4.53,PHP 8.1.12(xampp)
- 远程服务器:Debian软件开发工具,Apache 2.4.54,PHP 8.1.12
编写器.json
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
应用程序.php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Slim\Views\Twig;
use Slim\Views\TwigMiddleware;
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();
应用程序/路由.php
use App\Controller\ProgramController;
$app->get('/program', [ProgramController::class, 'list'])
->setName('program');
// ...
应用程序/控制器/程序控制器.php
namespace App\Controller;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class ProgramController
{
public function __construct()
{
// ...
}
public function list(Request $request, Response $response, array $args): Response
{
// ...
}
}
我已经尝试了不同形式的名称空间和不同的注册控制器的策略,例如:$app->get('/program', '\App\Controller\ProgramController:list')->setName('program');
我也试过运行composer dump-autoload
,但没有任何效果。
1条答案
按热度按时间aurhwmvo1#
这是一个愚蠢的问题。控制器所在的文件夹名为“controller”,用小写字母,但命名空间是\App\Controller,因此找不到它。这在区分大小写的UNIX系统上很重要,但在文件路径不区分大小写的Windows上运行良好。将文件夹名更改为“Controller”后运行良好。