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

时间:2017-09-02 23:51:28

标签: php composer-php slim autoload

我正在尝试使用slim和自动加载路由的控制器类来构建一个站点。我目前正在设置基础结构并使用单一路径进行测试,只需一个简单的“测试”输出。

我主要通过定义spl_autoload_register函数来完成这些工作,但由于这种方法不是苗条和作曲家所推荐的,所以我想做正确的事情,而不是试图自动加载我的课程。

我的项目设置如下:

enter image description here

在Controller下具有相同名称的文件中的类BlockController位于使用namespace MyAPI\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");
    }
}

我正在加载依赖项和设置,之后我的所有路由(目前只包含一些小路径来测试我的架构):

公开/ 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文件进行扩展):

require 'Routes/BlockRoute.php';

应用/路线/ 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 webserver运行该站点并导航到此路由/block时,我收到以下RuntimeException: Callable BlockController :: getList不存在

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

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

任何意见都赞赏。

2 个答案:

答案 0 :(得分:1)

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

它应该指向../src/app,但由于composer.json位于src文件夹中,因此可以在生成的app文件中将其简化为composer.json

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

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

最后,在苗条的情况下,你使用单个冒号代替双重来指代可调用的路线。 BlockController::getList应为BlockController:getList

答案 1 :(得分:0)

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

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