按标准,所有的东西都放在下面App
命名空间。所以如果我有这样的结构TestController
有public function xxx(TestInterface $test);
一切正常运转。
-src
-Core
-TestInterface (App\Core)
-Api
-Controller
-TestController (App\Api\Controller)
-Domain
-Service
-TestService implements TestInterface (App\Domain\Service)
现在的问题是我的项目没有App
前缀。我的结构是这样的:
-src
-Core
-TestInterface (Core)
-Api
-Controller
-TestController (Api\Controller)
-Domain
-Service
-TestService implements TestInterface (Domain\Service)
json
"autoload": {
"psr-4": {
"": "src/"
}
},
服务.yaml
Core\:
resource: '../src/Core/*'
exclude: '../src/Core/{Entity,Migrations,Tests,Kernel.php}'
Domain\:
resource: '../src/Domain/*'
exclude: '../src/Domain/{Entity,Migrations,Tests,Kernel.php}'
Api\Controller\:
resource: '../src/Api/Controller'
tags: ['controller.service_arguments']
最有趣的是,几乎所有的东西都很好用,包括依赖注入,只要我使用直接的类名称空间。只有通过界面才能找到不起作用的东西。
这样做是可行的:public function xxx(TestService $test)
这不管用:public function xxx(TestInterface $test)
以下是错误:
Cannot resolve argument $test of "Api\Controller\TestController::xxx()":
Cannot autowire service ".service_locator.EcpiaYx": it references interface "Core\TestInterface" but no such service exists.
You should maybe alias this interface to the existing "Domain\TestService" service.
发布于 2018-06-11 17:50:45
如果我完全理解,这个问题与App
命名空间,实际上,所有这些都按预期的方式工作。如果必须添加App
前缀:
"autoload": {
"psr-4": {
"App\\": "src/" # <--- virtually mapping
}
},
正如错误中所述,只需键入提示您的接口,并将其与服务类混叠在一起:
Domain\Service\TestService:
Core\TestInterface: '@Domain\Service\TestService'
然后每次引用该接口
https://stackoverflow.com/questions/-100004840
复制相似问题