【问题标题】:Autoload for controller classes in slim framework超薄框架中控制器类的自动加载
【发布时间】:2018-02-11 15:15:39
【问题描述】:

我正在尝试构建一个纤薄的站点,并为路由自动加载我的控制器类。我目前正在设置基本结构并使用单个路由进行测试,只不过是一个简单的“测试”输出。

我以前通过定义 spl_autoload_register 函数来完成这些工作,但由于 slim 和 composer 不推荐这种方法,所以我想把它做对,我不想自动加载我的类。

我的项目是这样设置的:

Controller下同名文件内的类BlockControllernamespace 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(很简单,会扩展更多的Route-files):

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 的回答后更新了 app-folder 的路径

在那之后我跑了composer update。对于这些更改,这是正确的命令吗?或者我应该使用composer install?在自动加载部分中添加这些内容后,找不到更多信息。

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

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

所以问题是 BlockController 没有正确包含/自动加载,但我不明白为什么或究竟是什么问题。我试图找到一些使用 slim+composer+自动加载类的工作配置示例,但找不到相关的东西。

任何意见表示赞赏。

【问题讨论】:

    标签: php composer-php slim autoload


    【解决方案1】:

    由于您将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

    【讨论】:

    • 即使我从公用文件夹运行该站点?我现在尝试了并运行composer update - 这足以应用这些更改吗?它不会改变错误信息,还是一样的Callable BlockController::getList does not exist ..
    • 尝试使用composer dumpautoload
    • 打印Generating autoload files 并在此之后完成。之后重启网络服务器,效果和之前一样..
    • 你能仔细检查 BlockController 上的命名空间吗?我只是注意到它在示例中不正确。 MoinAPI\Controller
    • @JackO'neill 请参阅更新答案的最后一部分。虽然只是一个仅供参考,但您的一些文件中仍然有“MoinAPI”,您应该更改这些文件。
    【解决方案2】:

    在 docker 容器中运行,或者使用 composer 使用的相同 php 二进制文件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2018-07-31
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多