我正在尝试将使用 ZF3/Apigility 制作的现有应用程序迁移到 Laminas/ApiTools。 我已经尝试过教程/指南来帮助我完成正确的迁移,但没有任何效果对我有用,所以现在我正在尝试创建一个完整的 nes Laminas 项目,并将我现有的代码推入其中。
所以我正在尝试让我的第一个控制器(基本的“ping”)正常工作。 我有我的模块,并且控制器被解析为工厂字符串:
'controllers' => [
'factories' => [
...
'emma\\V1\\Rpc\\Ping\\Controller' => \emma\V1\Rpc\Ping\PingControllerFactory::class,`
...
]
...
<?php
namespace emma\V1\Rpc\Ping;
use Interop\Container\ContainerInterface;
use Laminas\ServiceManager\Factory\InvokableFactory;
class PingControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return new PingController();
}
}
在某些时候,我闯入了vendor/laminas/laminas-servicemanager/src/ServiceManager.php getFactory函数:
private function getFactory(string $name): callable
{
$factory = $this->factories[$name] ?? null;
$lazyLoaded = false;
if (is_string($factory) && class_exists($factory)) {
$factory = new $factory();
$lazyLoaded = true;
}
...
变量 $factory 是我的配置字符串(即“mma\V1\Rpc\Ping\PingControllerFactory”),它似乎已正确解析,但“class_exists($factory)”返回 false。它以某种方式调用以下内容:
vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php::createPrependAutoloader(array $namespaces, ClassLoader $classLoader, ArrayObject $loaded)
但是在这段代码中,$namespaces 不包含我的 emma 模块中的任何内容。所以我想我可能缺少一些配置或任何东西来告诉 Laminas 我实际上想加载 src/ 类。
但是我有什么:
...
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Emma\\": "module/emma/src/"
}
}
...
<?php
/**
* List of enabled modules for this application.
*
* This should be an array of module namespaces used in the application.
*/
return [
'Laminas\InputFilter',
...
'Application',
'Emma',
];
我尝试遵循模块激活烹饪书籍,但除了简单地定义类之外,我找不到任何有关如何定义显式控制器工厂类的信息,我想说我已经在这样做了......
好吧我很蠢...这是一个案例混淆...
在[“autoload”][“psr-4”]下的composer.json中,当然需要命名空间而不是模块名称。我的命名空间是小写的,模块名称以大写 E 开头...
现在我的班级被发现了!