Mezzio Zend Service Manager-尝试使用phpdebugbar时未找到服务异常

Mezzio Zend Service Manager-尝试使用phpdebugbar时未找到服务异常,mezzio,zend-servicemanager,phpdebugbar,Mezzio,Zend Servicemanager,Phpdebugbar,我正在尝试在一个干净的Zend表达式框架应用程序中使用 我知道如果使用pimple,本页上的说明建议使用此DI配置: $container[Psr\Http\Message\ResponseInterface::class] = new Zend\Diactoros\ResponseFactory(); $container[Psr\Http\Message\StreamFactoryInterface] = new Zend\Diactoros\StreamFactory(); 所以我试着用

我正在尝试在一个干净的Zend表达式框架应用程序中使用

我知道如果使用pimple,本页上的说明建议使用此DI配置:

$container[Psr\Http\Message\ResponseInterface::class] = new Zend\Diactoros\ResponseFactory();
$container[Psr\Http\Message\StreamFactoryInterface] = new Zend\Diactoros\StreamFactory();
所以我试着用这个我用的是zend service manager:

return [
    'dependencies' => [
        'factories' => [
            Psr\Http\Message\ResponseInterface::class => new Zend\Diactoros\ResponseFactory(),
           'Psr\Http\Message\StreamFactoryInterface' => new Zend\Diactoros\StreamFactory(),
        ],
    ],
];
但我遇到了以下错误:

PHP Fatal error:  Uncaught Zend\ServiceManager\Exception\ServiceNotFoundException: Unable to resolve service "Psr\Http\Message\ResponseInterface" to a factory; are you certain you provided it during configuration? in /www/develop.expressive.centralsemi.com/htdocs/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:687
我也试过:

return [
    'dependencies' => [
        'factories' => [
            Psr\Http\Message\ResponseInterface::class => new Zend\Diactoros\ResponseFactory(),
            Psr\Http\Message\StreamFactoryInterface::class => new Zend\Diactoros\StreamFactory(),
        ],
    ],
];
这是:

return [
    'dependencies' => [
        'factories' => [
            Psr\Http\Message\ResponseInterface::class => Zend\Diactoros\ResponseFactory::class,
            Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
        ],
    ],
];
但还是没有运气

诚然,我不熟悉Zend/Diactoros,但我不明白Zend\Diactoros\ResponseFactory是如何成为工厂的,因为它没有调用方法。所以我觉得这是我问题的核心。我是否应该为此创建自己的工厂?我觉得这样做不是有意的

请注意,我也尝试过遵循这些说明。虽然没有错误,但它似乎根本没有出现:

我肯定我遗漏了一些关键部分,但我遗漏了什么

My composer.json:

{
    "name": "zendframework/zend-expressive-skeleton",
    "description": "Zend expressive skeleton. Begin developing PSR-15 middleware applications in seconds!",
    "type": "project",
    "homepage": "https://github.com/zendframework/zend-expressive-skeleton",
    "license": "BSD-3-Clause",
    "keywords": [
        "skeleton",
        "middleware",
        "psr",
        "psr-7",
        "psr-11",
        "psr-15",
        "zf",
        "zendframework",
        "zend-expressive"
    ],
    "config": {
        "sort-packages": true
    },
    "extra": {
        "zf": {
            "component-whitelist": [
                "zendframework/zend-expressive",
                "zendframework/zend-expressive-helpers",
                "zendframework/zend-expressive-router",
                "zendframework/zend-httphandlerrunner",
                "zendframework/zend-expressive-fastroute",
                "zendframework/zend-expressive-twigrenderer"
            ]
        }
    },
    "support": {
        "issues": "https://github.com/zendframework/zend-expressive-skeleton/issues",
        "source": "https://github.com/zendframework/zend-expressive-skeleton",
        "rss": "https://github.com/zendframework/zend-expressive-skeleton/releases.atom",
        "slack": "https://zendframework-slack.herokuapp.com",
        "forum": "https://discourse.zendframework.com/c/questions/expressive"
    },
    "require": {
        "php": "^7.1",
        "zendframework/zend-component-installer": "^2.1.1",
        "zendframework/zend-config-aggregator": "^1.0",
        "zendframework/zend-diactoros": "^1.7.1 || ^2.0",
        "zendframework/zend-expressive": "^3.0.1",
        "zendframework/zend-expressive-helpers": "^5.0",
        "zendframework/zend-stdlib": "^3.1",
        "zendframework/zend-servicemanager": "^3.3",
        "zendframework/zend-expressive-fastroute": "^3.0",
        "zendframework/zend-expressive-twigrenderer": "^2.0"
    },
    "require-dev": {
        "filp/whoops": "^2.1.12",
        "php-middleware/php-debug-bar": "^3.0",
        "phpunit/phpunit": "^7.0.1",
        "roave/security-advisories": "dev-master",
        "squizlabs/php_codesniffer": "^2.9.1",
        "zendframework/zend-expressive-tooling": "^1.0",
        "zfcampus/zf-development-mode": "^3.1"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/App/src/",
            "PhpDebugBar\\": "src/PhpDebugBar/src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "AppTest\\": "test/AppTest/"
        }
    },
    "scripts": {
        "post-create-project-cmd": [
            "@development-enable"
        ],
        "development-disable": "zf-development-mode disable",
        "development-enable": "zf-development-mode enable",
        "development-status": "zf-development-mode status",
        "expressive": "expressive --ansi",
        "check": [
            "@cs-check",
            "@test"
        ],
        "clear-config-cache": "php bin/clear-config-cache.php",
        "cs-check": "phpcs",
        "cs-fix": "phpcbf",
        "serve": "php -S 0.0.0.0:8080 -t public/",
        "test": "phpunit --colors=always",
        "test-coverage": "phpunit --colors=always --coverage-clover clover.xml"
    }
}

尝试先创建别名,然后将其提供给工厂

return [
    'dependencies' => [
        'factories' => [
            Psr\Http\Message\ResponseInterface::class => Zend\Diactoros\ResponseFactory::class,
           'Psr\Http\Message\StreamFactoryInterface' => Zend\Diactoros\StreamFactory::class,
        ],
        'aliases' => [
           ClassThatImplementsResponseInterface::class => Psr\Http\Message\ResponseInterface::class,
           ClassThatImplementsStreamFactoryInterface::class => 'Psr\Http\Message\StreamFactoryInterface',
        ]
    ],
];
更新: @d.lanza38发现这是wright配置

return [
    'dependencies' => [
        'invokables' => [
            Zend\Diactoros\ResponseFactory::class => Zend\Diactoros\ResponseFactory::class,
            Zend\Diactoros\StreamFactory::class => Zend\Diactoros\StreamFactory::class,
        ],
        'aliases' => [
            Psr\Http\Message\ResponseFactoryInterface::class => Zend\Diactoros\ResponseFactory::class,
            Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
        ]
    ],
];

尝试先创建别名,然后将其提供给工厂

return [
    'dependencies' => [
        'factories' => [
            Psr\Http\Message\ResponseInterface::class => Zend\Diactoros\ResponseFactory::class,
           'Psr\Http\Message\StreamFactoryInterface' => Zend\Diactoros\StreamFactory::class,
        ],
        'aliases' => [
           ClassThatImplementsResponseInterface::class => Psr\Http\Message\ResponseInterface::class,
           ClassThatImplementsStreamFactoryInterface::class => 'Psr\Http\Message\StreamFactoryInterface',
        ]
    ],
];
更新: @d.lanza38发现这是wright配置

return [
    'dependencies' => [
        'invokables' => [
            Zend\Diactoros\ResponseFactory::class => Zend\Diactoros\ResponseFactory::class,
            Zend\Diactoros\StreamFactory::class => Zend\Diactoros\StreamFactory::class,
        ],
        'aliases' => [
            Psr\Http\Message\ResponseFactoryInterface::class => Zend\Diactoros\ResponseFactory::class,
            Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
        ]
    ],
];

我正在写另一个答案,因为它更容易阅读。 好啊我刚刚重新安装了Zend Expressive 3,并且:

编写器要求-开发php中间件/php调试栏 作曲家转储自动加载 已创建/config/autoload/debugbar.local.php 为此,您需要创建一个新的JavaScriptRenderFactory。当前设置的是错误的配置键ConfigProvider::class,而不是'config':

class NewJavascriptRendererFactory
{
    public function __invoke(ContainerInterface $container): JavascriptRenderer
    {
        $debugbar = $container->get(DebugBar::class);
        $config = $container->get('config');
        $rendererOptions = $config['phpmiddleware']['phpdebugbar']['javascript_renderer'];


        $renderer = new JavascriptRenderer($debugbar);
        $renderer->setOptions($rendererOptions);

        return $renderer;
    }
}
在/confog/atuoload/dependencies.global.php中添加了以下别名和工厂 在/config/pipeline.php中添加了一个新管道 正如我在前面的评论中提到的,我还配置了,所以我不需要为每个服务创建工厂


我正在写另一个答案,因为它更容易阅读。 好啊我刚刚重新安装了Zend Expressive 3,并且:

编写器要求-开发php中间件/php调试栏 作曲家转储自动加载 已创建/config/autoload/debugbar.local.php 为此,您需要创建一个新的JavaScriptRenderFactory。当前设置的是错误的配置键ConfigProvider::class,而不是'config':

class NewJavascriptRendererFactory
{
    public function __invoke(ContainerInterface $container): JavascriptRenderer
    {
        $debugbar = $container->get(DebugBar::class);
        $config = $container->get('config');
        $rendererOptions = $config['phpmiddleware']['phpdebugbar']['javascript_renderer'];


        $renderer = new JavascriptRenderer($debugbar);
        $renderer->setOptions($rendererOptions);

        return $renderer;
    }
}
在/confog/atuoload/dependencies.global.php中添加了以下别名和工厂 在/config/pipeline.php中添加了一个新管道 正如我在前面的评论中提到的,我还配置了,所以我不需要为每个服务创建工厂


我想出来了。上的说明是正确的。所需的唯一附加步骤是向配置中添加可调用项和别名项

我的文件位于/config/autoload/zend-expressive-tooling-factories.global.php中:


我最初只是有别名部分,而不是可调用部分。一旦我加上这些,一切都正常了。

我明白了。上的说明是正确的。所需的唯一附加步骤是向配置中添加可调用项和别名项

我的文件位于/config/autoload/zend-expressive-tooling-factories.global.php中:


我最初只是有别名部分,而不是可调用部分。一旦我加上这些,一切都正常了。

谢谢@Razvan。我应该用什么来代替实现ResponseInterface::class的类和实现StreamFactoryInterface::class的类?我是否应该编写自己的实现?我想这就是Zend\Diactoros应该提供的。@d.lanza38我想这就是你打算做的。告诉我你打算做什么,这样我才能更好地理解。如果您只想发出一个自定义响应,例如不同的代码:$this->responseFactory->createResponse404尝试使用它,这样您就不必担心自定义工厂的问题,并且如果我不太清楚的话,可以将Zend\Diactoros\responseFactory提供给要从中发出响应的类构造函数,我试图在一个全新的Zend表达框架应用程序中使用php中间件/phpdebugbar。我发现了两套完全不同的说明,它们解释了如何操作,这让我有点困惑。我不想提供404响应或类似的服务,只是想让“php中间件/phpdebugbar”正常工作。在您的回答中,我不确定实现ResponseInterface的类和实现StreamFactoryInterface的类的等价物是什么。谢谢@Razvan。我应该用什么来代替实现ResponseInterface::class的类和实现StreamFactoryInterface::class的类?我是否应该编写自己的实现?我想这就是Zend\Diactoros应该提供的。@d.lanza38我想这就是你打算做的。告诉我你打算做什么,这样我才能更好地理解。如果您只想发出自定义响应,例如不同的代码:$this->responseF
actory->createResponse404尝试使用它,这样您就不必担心自定义工厂,并将Zend\Diactoros\ResponseFactory提供给要从何处发出响应的类构造函数。如果我有点不清楚,我尝试在新的Zend表达式框架应用程序中使用php中间件/phpdebugbar。我发现了两套完全不同的说明,它们解释了如何操作,这让我有点困惑。我不想提供404响应或类似的服务,只是想让“php中间件/phpdebugbar”正常工作。在您的回答中,我不确定实现响应接口的类和实现流工厂接口的类的等价物是什么。非常感谢@Razvan Ionascu提供详细的答案。我仍然遇到一些问题,但让我看一看,看看我可能会有什么不同。但是很快,我想确认一些事情。我应该将'base_url'=>'/razvan.ionascu/ze-api/public'更改为'base_-url'=>'/my/path/to/public',?我应该将JavascriptRenderer::class=>NewJavaScriptRenderFactory::class更改为\DebugBar\JavascriptRenderer::class=>PhpDebugBar\Message\NewJavaScriptRenderFactory::class,?这个$renderer=new JavascriptRenderer$DebugBar;是指DebugBar\JavascriptRenderer。在/config/autoload/dependencies.global.php中,ResponseFactory::class和StreamFactory::class是指“Zend\Diactoros”中的,对吗?请注意:我创建了一个模块PhpDebugBar\Message,其中包含您定义的NewJavaScriptRenderFactory。模块已注册,所有内容均已完成。是的,请将基本url更改为您的公用url,否则调试栏中的资源将无法使用。我认为,如果你改变你所说的,你会改变它应该会很好。如果id不让我知道:。祝你好运。你也可以试着使用这个:这样你就不会有任何与工厂有关的头痛了。非常感谢@Razvan Ionascu提供的详细答案。我仍然遇到一些问题,但让我看一看,看看我可能会有什么不同。但是很快,我想确认一些事情。我应该将'base_url'=>'/razvan.ionascu/ze-api/public'更改为'base_-url'=>'/my/path/to/public',?我应该将JavascriptRenderer::class=>NewJavaScriptRenderFactory::class更改为\DebugBar\JavascriptRenderer::class=>PhpDebugBar\Message\NewJavaScriptRenderFactory::class,?这个$renderer=new JavascriptRenderer$DebugBar;是指DebugBar\JavascriptRenderer。在/config/autoload/dependencies.global.php中,ResponseFactory::class和StreamFactory::class是指“Zend\Diactoros”中的,对吗?请注意:我创建了一个模块PhpDebugBar\Message,其中包含您定义的NewJavaScriptRenderFactory。模块已注册,所有内容均已完成。是的,请将基本url更改为您的公用url,否则调试栏中的资源将无法使用。我认为,如果你改变你所说的,你会改变它应该会很好。如果id不让我知道:。祝你好运。你也可以试着用这个:这样你就不会有任何与工厂有关的头痛了。
return [
    'dependencies' => [
        'invokables' => [
            Zend\Diactoros\ResponseFactory::class => Zend\Diactoros\ResponseFactory::class,
            Zend\Diactoros\StreamFactory::class => Zend\Diactoros\StreamFactory::class,
        ],
        'aliases' => [
            Psr\Http\Message\ResponseFactoryInterface::class => Zend\Diactoros\ResponseFactory::class,
            Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
        ]
    ],
];