Php slim框架中控制器类的自动加载
我正试图建立一个网站与斯利姆和自动加载我的控制器类的路线。我目前正在设置基本结构,并使用一条路径进行测试,该路径只包含一个简单的“测试”输出 我以前做过定义Php slim框架中控制器类的自动加载,php,composer-php,slim,autoload,Php,Composer Php,Slim,Autoload,我正试图建立一个网站与斯利姆和自动加载我的控制器类的路线。我目前正在设置基本结构,并使用一条路径进行测试,该路径只包含一个简单的“测试”输出 我以前做过定义spl\u autoload\u register函数的工作,但由于slim和composer不推荐这种方法,所以我想正确地完成它,我不想尝试自动加载我的类 我的项目设置如下: 控制器下同名文件中的类BlockController位于用名称空间MyAPI\Controller定义的名称空间中 app/Controller/BlockCont
spl\u autoload\u register
函数的工作,但由于slim和composer不推荐这种方法,所以我想正确地完成它,我不想尝试自动加载我的类
我的项目设置如下:
控制器下同名文件中的类BlockController
位于用名称空间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();
use MyAPI\Controller\BlockController;
$container["BlockController"] = function ($container) {
return new BlockController($container);
};
$app->group('/block', function() use ($container) {
$this->get('[/]', 'BlockController::getList');
});
app/routes.php(非常简单,将通过更多路由文件进行扩展):
app/Routes/BlockRoute.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();
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/下的所有内容都应具有基本名称空间MyAPI。
如中所述,我计划使用composer的to autoload功能来实现这一点,因此我修改了我的composer.json
,并添加了以下内容:
{
"require": { .. },
"autoload": {
"psr-4": {
"MyAPI\\": "app"
}
}
}
编辑:在Adam Lavin的回答之后更新了应用程序文件夹的路径
之后,我运行了composer update
。这是进行这些更改的正确命令吗?还是应该使用composer安装
?在autoload部分中添加这些内容后,找不到我需要做的更多信息
当我现在使用php Web服务器运行站点并导航到此路由/block
时,我得到以下RuntimeException:
可调用的BlockController::getList不存在
文件:C:\Prog\src\vendor\slim\slim\CallableResolver.php
所以问题是BlockController没有正确地被包括/自动加载,但我不明白为什么或者到底是什么问题。我试图找到一些使用slim+composer+自动加载类的工作配置示例,但找不到相关的内容
感谢您的任何输入。由于您将MyApp\\\
指向。/src
(与composer相同的目录),自动加载程序将尝试在src/Controllers/BlockController.php
中查找控制器
它应该指向。/src/app
,但由于composer.json
位于src
文件夹中,因此可以在生成的composer.json
文件中将其简化为app
{
"require": { .. },
"autoload": {
"psr-4": {
"MyAPI\\": "app"
}
}
}
此外,在您的示例中,BlockController
的命名空间是MoinAPI\Controllers
,应该是MyAPI\Controllers
最后,在slim中,您使用单冒号而不是双冒号来表示可调用路由BlockController::getList
应该是BlockController:getList
从docker容器中运行此,或者使用composer使用的相同php二进制文件
composer dump-autoload -o -vvv #-o fixed my problem in my case
即使我从公用文件夹运行站点?我现在试过了,然后运行了composer update
——这足以应用这些更改吗?它不会更改错误消息,仍然是相同的可调用BlockController::getList不存在
。请尝试使用打印生成自动加载文件的composer dumpautoload
,然后完成。在此之后重新启动Web服务器,效果与之前相同。您可以在BlockController上重新检查名称空间吗?我只是注意到示例中的情况不正确MoinAPI\Controller
@JackO'neill查看更新答案的最后一部分。虽然只是供参考,但您的一些文件中仍然有“MoinAPI”,您应该更改这些文件。