将 Apigility 应用程序迁移到 Laminas

问题描述 投票:0回答:1

我正在尝试将使用 ZF3/Apigility 制作的现有应用程序迁移到 Laminas/ApiTools。 我已经尝试过教程/指南来帮助我完成正确的迁移,但没有任何效果对我有用,所以现在我正在尝试创建一个完整的 nes Laminas 项目,并将我现有的代码推入其中。

所以我正在尝试让我的第一个控制器(基本的“ping”)正常工作。 我有我的模块,并且控制器被解析为工厂字符串:

  • module/emma/config/module.config.php 文件:
    'controllers' => [
        'factories' => [
            ...
            'emma\\V1\\Rpc\\Ping\\Controller' => \emma\V1\Rpc\Ping\PingControllerFactory::class,`
            ...
        ]
...
  • 模块/emma/src/V1/Rpc/Pinc/PingControllerFactory.php:
<?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/ 类。

但是我有什么:

  • composer.json:
...

    "autoload": {
        "psr-4": {
            "Application\\": "module/Application/src/",
            "Emma\\": "module/emma/src/"
        }
    }
...
  • config/modules.config.php:
<?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',
];

我尝试遵循模块激活烹饪书籍,但除了简单地定义类之外,我找不到任何有关如何定义显式控制器工厂类的信息,我想说我已经在这样做了......

migration laminas-api-tools laminas
1个回答
0
投票

好吧我很蠢...这是一个案例混淆...

在[“autoload”][“psr-4”]下的composer.json中,当然需要命名空间而不是模块名称。我的命名空间是小写的,模块名称以大写 E 开头...

现在我的班级被发现了!

© www.soinside.com 2019 - 2024. All rights reserved.