在 slim 框架中自动加载控制器 类

Autoload for controller classes in slim framework

我正在尝试使用 slim 构建一个站点并自动加载我的控制器 classes 用于路由。我目前正在设置基本结构并使用单一路由进行测试,只有一个简单的 "Test" 输出。

我之前通过定义一个 spl_autoload_register 函数来完成这些工作,但是由于 slim 和 composer 不推荐这种方法,所以我想正确地做这件事并且我不想自动加载我的 class是的。

我的项目是这样设置的:

Controller下同名文件中的classBlockControllernamespace MyAPI\Controller;

定义的命名空间中

app/Controller/BlockController.php

namespace MyAPI\Controller;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

class BlockController
{
    public function getList(Request $request, Response $response, $args)
    {
        return $response->withStatus(200)
            ->withHeader('Content-Type', 'text/html')
            ->write("Test");
    }
}

我正在加载依赖项和设置,然后加载我的所有路由(目前仅包含一些用于测试我的体系结构的小路由):

public/index.php:

require __DIR__ . '/../vendor/autoload.php';
$settings = require __DIR__ . '/../app/settings.php';

$app = new \Slim\App($settings);

require __DIR__ . '/../app/dependencies.php';
require __DIR__ . '/../app/routes.php';

$app->run();

app/routes.php(很简单,会用更多的路由文件扩展):

require 'Routes/BlockRoute.php';

app/Routes/BlockRoute.php:

use MyAPI\Controller\BlockController;

$container["BlockController"] = function ($container) {
    return new BlockController($container);
};

$app->group('/block', function() use ($container) {
    $this->get('[/]', 'BlockController::getList');
});

因此 BlockRoute.php 中的第一个命令是使用 BlockController 命名空间。 app/ 下的所有内容都应该有 Base-Namespace MyAPI。 如 slim-documentation 中所述,我计划使用作曲家的自动加载功能来做到这一点,因此我修改了我的 composer.json 并添加了以下内容:

{
  "require": { .. },
  "autoload": {
    "psr-4": {
      "MyAPI\": "app"
    }
  }
}

编辑: 在 Adam Lavin 回答后更新了应用程序文件夹的路径

之后我运行composer update。这是进行这些更改的正确命令吗?或者我应该使用 composer install?在 autoload-section 中添加这些内容后,找不到更多信息我必须做什么。

当我 运行 现在使用 php 网络服务器的站点并导航到此路由 /block 时,我得到以下 RuntimeException: 可调用BlockController::getList不存在

文件:C:\Prog\src\vendor\slim\slim\Slim\CallableResolver.php

所以问题是 BlockController 没有得到 included/autoloaded 正确,但我不明白为什么或到底是什么问题。我试图找到一些使用 classes 的 slim+composer+autoloading 的工作配置示例,但找不到相关的东西。

感谢任何意见。

由于您将 MyApp\ 指向 ../src(与 composer 相同的目录),自动加载器将尝试在 src/Controllers/BlockController.php 中找到控制器。

它应该指向 ../src/app,但由于 composer.jsonsrc 文件夹中,因此可以在结果 composer.json 中简化为 app文件。

{
  "require": { .. },
  "autoload": {
    "psr-4": {
      "MyAPI\": "app"
    }
  }
}

此外,在您的示例中,BlockController 的命名空间是 MoinAPI\Controllers,应该是 MyAPI\Controllers

最后,在 slim 中,您使用单个冒号而不是双冒号来引用可调用路由。 BlockController::getList 应该是 BlockController:getList

运行 这个 来自 docker 容器,或者使用作曲家使用的相同 php 二进制文件。

composer dump-autoload -o -vvv #-o fixed my problem in my case