Symfony 3.4:测试时如何处理私有服务警告并修改容器配置?
Hey there! Let's break down why you're seeing this warning only in your tests (and not with Postman) and cover a few solid solutions to fix it.
Why the Warning Only Shows Up in Tests
First, quick context: When you call your API via Postman, Symfony's routing system uses a controller resolver that doesn't require your controller service to be public. But when using the test client (static::createClient()), Symfony's test kernel pulls the controller directly from the container—hence the warning about private services being deprecated for this use case.
Solution 1: Override Service Defaults for the Test Environment
The cleanest way to handle this is to create a test-specific service configuration that makes all services public (since tests often need wider access to services). Here's how:
- Create or edit the file
/config/services_test.yml(if it doesn't exist already). - Add the following configuration to override default service visibility for tests:
services: _defaults: public: true # Optional: Add other test-specific service configurations here
This ensures all services are public when running tests, eliminating the warning without affecting your production/development environments.
Solution 2: Make Only the Affected Controller Public
If you don't want to make all services public, you can explicitly set just your UsersController to public in its service definition. Update your /src/UsersBundle/Resources/config/services.yml like this:
services: _defaults: public: false # Keep your existing default settings (autowire, autoconfigure, etc.) # Explicitly mark the UsersController as public UsersBundle\Controller\UsersController: public: true # Retain any existing configuration for this controller (tags, arguments, etc.)
This targets only the controller triggering the warning, keeping your other services private as per best practices.
Solution 3: Simplify Test Client Initialization
Double-check how you're creating the test client. In your code, you're passing $this->defaults to createClient()—ensure those defaults aren't overriding test environment settings that force the container to fetch private services. If you don't need custom defaults, simplify it to:
$client = static::createClient();
Bonus: Long-Term Best Practice
While these fixes work perfectly for Symfony 3.4, if you ever plan to upgrade to newer versions (like 4.0+), you'll want to shift away from fetching controllers directly from the container. For now, though, the above solutions are fully valid for your current setup.
内容的提问来源于stack exchange,提问作者KodeFor.Me

