Sylius:如何使用自定义控制器创建自己的自定义资源而不会"can not autowire"异常?



我想在Sylius应用程序中创建自己的自定义资源,如此处所述。在描述的许多陷阱和错误之后,我还查看了一些Sylius插件并找到了这个插件,其中一切正常。

但是,在我的情况下,遵循文档和此类示例不起作用。

我以这种方式定义了资源:

resources.yml

app.custody:
driver: doctrine/orm
classes:
model: AppBundleEntityCustodyWallet
form: AppBundleFormTypeCustodyType
controller: AppBundleControllerShopCustodyController

routing.yml

account_token_custody:
path: /account/custody
methods: [GET, POST]
defaults:
_controller: app.controller.custody:custodyAction
_sylius:
template: "@AppBundle/custody.html.twig"
redirect: sylius_shop_account_dashboard

托管控制器如下所示:

use AppBundleEntityCustodyWallet;
use AppBundleFormTypeCustodyType;
use SyliusBundleResourceBundleControllerResourceController;
use SymfonyComponentFormForm;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
class CustodyController extends ResourceController
{
public function custodyAction(Request $request): Response
{
// .... code .....
}
}

但是,它会导致以下错误:

无法自动连线服务"AppBundle\Controller\Shop\CustodyController": 方法的参数"$metadata" "Sylius\Bundle\ResourceBundle\Controller\ResourceController::__construct((" 引用接口 "Sylius\Component\Resource\Metadata\MetadataInterface",但没有这样的 服务存在。是否创建了实现此接口的类?

搜索此错误将我发送到此 GitHub 问题,人们建议将此特定控制器的自动连线设置为 false。所以我做到了:

services.yml:

AppBundleControllerShopCustodyController:
autowire: false
public: true

但是这样,构造函数是在没有任何参数的情况下调用的:

参数太少,无法正常工作 Sylius\Bundle\ResourceBundle\Controller\ResourceController::__construct((, 0 传入/var/www/var/cache/dev/Container1MQRWcB/getCustodyControllerService.php 在第 16 行和预期的正好 17 行

我很好奇为什么类似的配置在我上面提到的 CmsPlugin 中工作,但在我的情况下却没有。

我怎样才能做到这一点?

基于此配置

sylius_resource:
resources:
app.custody:
driver: doctrine/orm
classes:
model: AppBundleEntityCustodyWallet
controller: AppBundleControllerShopCustodyController

Sylius 将根据资源包文档生成一些服务,包括资源控制器

只需定义控制器类,它就会定义服务,并连接正确的构造器参数。

在这种情况下,它将生成一个 id 为app.controller.custody的服务,其定义可以通过运行php bin/console debug:container app.controller.custody看到。

然后,在services.yaml有这个配置

AppBundleControllerShopCustodyController:
autowire: false
public: true

它定义了另一个 IDAppBundleControllerShopCustodyController的服务,该服务不是由 Sylius 处理的。

即使删除了该配置,错误仍然存在,因为配置了自动服务加载,这是同一页面上的另一个示例。

解决方案很简单:从该导入中排除资源控制器:

# config/services.yaml
services:
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,CustodyController.php}'

如果有许多资源控制器和/或可能更多要添加的资源控制器,那么将它们放在一个公共文件夹中并将其添加到 exlude glob 模式中可能更容易,例如:

# config/services.yaml
services:
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,ResourceController}'

相关内容

  • 没有找到相关文章

最新更新