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”,您应该更改这些文件。