【发布时间】:2018-02-11 15:15:39
【问题描述】:
我正在尝试构建一个纤薄的站点,并为路由自动加载我的控制器类。我目前正在设置基本结构并使用单个路由进行测试,只不过是一个简单的“测试”输出。
我以前通过定义 spl_autoload_register 函数来完成这些工作,但由于 slim 和 composer 不推荐这种方法,所以我想把它做对,我不想自动加载我的类。
我的项目是这样设置的:
Controller下同名文件内的类BlockController在namespace 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