我正在尝试使用slim和自动加载路由的控制器类来构建一个站点。我目前正在设置基础结构并使用单一路径进行测试,只需一个简单的“测试”输出。
我主要通过定义spl_autoload_register
函数来完成这些工作,但由于这种方法不是苗条和作曲家所推荐的,所以我想做正确的事情,而不是试图自动加载我的课程。
我的项目设置如下:
在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 +自动加载类的工作配置的例子,但找不到相关的东西。
任何意见都赞赏。
答案 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