在 slim 框架中自动加载控制器 类
Autoload for controller classes in slim framework
我正在尝试使用 slim 构建一个站点并自动加载我的控制器 classes 用于路由。我目前正在设置基本结构并使用单一路由进行测试,只有一个简单的 "Test" 输出。
我之前通过定义一个 spl_autoload_register
函数来完成这些工作,但是由于 slim 和 composer 不推荐这种方法,所以我想正确地做这件事并且我不想自动加载我的 class是的。
我的项目是这样设置的:
Controller下同名文件中的classBlockController
在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(很简单,会用更多的路由文件扩展):
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 回答后更新了应用程序文件夹的路径
之后我运行composer update
。这是进行这些更改的正确命令吗?或者我应该使用 composer install
?在 autoload-section 中添加这些内容后,找不到更多信息我必须做什么。
当我 运行 现在使用 php 网络服务器的站点并导航到此路由 /block
时,我得到以下 RuntimeException:
可调用BlockController::getList不存在
文件:C:\Prog\src\vendor\slim\slim\Slim\CallableResolver.php
所以问题是 BlockController 没有得到 included/autoloaded 正确,但我不明白为什么或到底是什么问题。我试图找到一些使用 classes 的 slim+composer+autoloading 的工作配置示例,但找不到相关的东西。
感谢任何意见。
由于您将 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 容器,或者使用作曲家使用的相同 php 二进制文件。
composer dump-autoload -o -vvv #-o fixed my problem in my case
我正在尝试使用 slim 构建一个站点并自动加载我的控制器 classes 用于路由。我目前正在设置基本结构并使用单一路由进行测试,只有一个简单的 "Test" 输出。
我之前通过定义一个 spl_autoload_register
函数来完成这些工作,但是由于 slim 和 composer 不推荐这种方法,所以我想正确地做这件事并且我不想自动加载我的 class是的。
我的项目是这样设置的:
Controller下同名文件中的classBlockController
在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(很简单,会用更多的路由文件扩展):
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 回答后更新了应用程序文件夹的路径
之后我运行composer update
。这是进行这些更改的正确命令吗?或者我应该使用 composer install
?在 autoload-section 中添加这些内容后,找不到更多信息我必须做什么。
当我 运行 现在使用 php 网络服务器的站点并导航到此路由 /block
时,我得到以下 RuntimeException:
可调用BlockController::getList不存在
文件:C:\Prog\src\vendor\slim\slim\Slim\CallableResolver.php
所以问题是 BlockController 没有得到 included/autoloaded 正确,但我不明白为什么或到底是什么问题。我试图找到一些使用 classes 的 slim+composer+autoloading 的工作配置示例,但找不到相关的东西。
感谢任何意见。
由于您将 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 容器,或者使用作曲家使用的相同 php 二进制文件。
composer dump-autoload -o -vvv #-o fixed my problem in my case