检查php bin/console debug:autowiring
时,我收到以下错误:
In FileLoader.php line 168:
Class Symfony\Bundle\FrameworkBundle\Test\WebTestCase not found in /vagrant/mysymfony/app/config/services.yml (whic
h is being imported from "/vagrant/mysymfony/app/config/config.yml").
In WebTestCase.php line 17:
Class Symfony\Bundle\FrameworkBundle\Test\WebTestCase not found
In WebTestCase.php line 21:
Class Symfony\Bundle\FrameworkBundle\Test\KernelTestCase not found
In KernelTestCase.php line 24:
Class PHPUnit\Framework\TestCase not found
错误是由以下文件引起的:
<?php
/**
* This file is part of the RestExtraBundle package [1].
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this[1] source code.
*
* @license MIT License
* [1] https://github.com/willdurand/BazingaRestExtraBundle
*/
namespace AppBundle\Test;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase as BaseWebTestCase;
/**
* @author William Durand <william.durand1@gmail.com>
*/
abstract class WebTestCase extends BaseWebTestCase
{
protected function assertJsonResponse($response, $statusCode = 200)
{
$this->assertEquals(
$statusCode, $response->getStatusCode(),
$response->getContent()
);
$this->assertTrue(
$response->headers->contains('Content-Type', 'application/json'),
$response->headers
);
}
protected function jsonRequest($verb, $endpoint, array $data = array())
{
$data = empty($data) ? null : json_encode($data);
return $this->client->request($verb, $endpoint,
array(),
array(),
array(
'HTTP_ACCEPT' => 'application/json',
'CONTENT_TYPE' => 'application/json'
),
$data
);
}
}
该文件位于以下目录结构中:
.
├── AppBundle.php
├── Controller
│ ├── DefaultController.php
│ └── FooController.php
└── Test
└── WebTestCase.php
以下文件中使用了WebTestCase
类:
<?php
namespace Tests\AppBundle\Controller;
use AppBundle\Test\WebTestCase;
class FooControllerTest extends WebTestCase
{
public function testFooAction()
{
$client = static::createClient();
$crawler = $client->request('GET', '/foo');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
$this->assertJsonResponse($client->getResponse());
}
}
在tests
目录中的以下路径中:
.
└── AppBundle
└── Controller
├── DefaultControllerTest.php
└── FooControllerTest.php
测试运行没有任何问题,我实际上偶然发现了这个错误。如果我从测试中删除该文件及其任何引用,那么我可以毫不费力地检查debug:autowiring
。但是我无法弄清楚我在这里缺少什么。我想这与文件放置有什么关系,但我真的不知道。你能借我一把手吗?
另外,如果我没有检查该命令,我就不会注意到这些错误。为了避免将代码提交到将来会产生此类错误的存储库,Symfony会在某处记录这些错误吗?或者我是否必须手动检查每个debug
命令?
提前感谢您的帮助。
添加vagrant/mysymfony/app/config/services.yml
# Learn more about services, parameters and containers at
# https://symfony.com/doc/current/service_container.html
parameters:
#parameter_name: value
services:
# default configuration for services in *this* file
_defaults:
# automatically injects dependencies in your services
autowire: true
# automatically registers your services as commands, event subscribers, etc.
autoconfigure: true
# this means you cannot fetch services directly from the container via $container->get()
# if you need to do this, you can override this setting on individual services
public: false
# makes classes in src/AppBundle available to be used as services
# this creates a service per class whose id is the fully-qualified class name
AppBundle\:
resource: '../../src/AppBundle/*'
# you can exclude directories or files
# but if a service is unused, it's removed anyway
exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
# controllers are imported separately to make sure they're public
# and have a tag that allows actions to type-hint services
AppBundle\Controller\:
resource: '../../src/AppBundle/Controller'
public: true
tags: ['controller.service_arguments']
# add more services, or override services that need manual wiring
# AppBundle\Service\ExampleService:
# arguments:
# $someArgument: 'some_value'
答案 0 :(得分:2)
我从Symfony IRC频道收到了一条建议。一位名叫Remco的人告诉我要将Test
文件夹包含在excludes
services.yml
中。现在运行debug:autowiring
并没有给我任何错误。
我告诉他在这里回答我的问题,但显然他没有StackOverflow帐户,所以我会自己写一下,但所有的功劳都归功于他。谢谢。我还要感谢Nikita的时间和帮助。
如果其他人遇到同样的问题,services.yml
会是这样的:
# Learn more about services, parameters and containers at
# https://symfony.com/doc/current/service_container.html
parameters:
#parameter_name: value
services:
# default configuration for services in *this* file
_defaults:
# automatically injects dependencies in your services
autowire: true
# automatically registers your services as commands, event subscribers, etc.
autoconfigure: true
# this means you cannot fetch services directly from the container via $container->get()
# if you need to do this, you can override this setting on individual services
public: false
# makes classes in src/AppBundle available to be used as services
# this creates a service per class whose id is the fully-qualified class name
AppBundle\:
resource: '../../src/AppBundle/*'
# you can exclude directories or files
# but if a service is unused, it's removed anyway
exclude: '../../src/AppBundle/{Entity,Repository,Tests,Test}'
# controllers are imported separately to make sure they're public
# and have a tag that allows actions to type-hint services
AppBundle\Controller\:
resource: '../../src/AppBundle/Controller'
public: true
tags: ['controller.service_arguments']
# add more services, or override services that need manual wiring
# AppBundle\Service\ExampleService:
# arguments:
# $someArgument: 'some_value'