我想在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}'