Installation:
composer require dennisberg91/my-test-bundle
Add the bundle to your config/bundles.php:
return [
// ...
Dennisberg91\TestBundle\Dennisberg91TestBundle::class => ['all' => true],
];
First Use Case:
Locate the MessageBuilder service in your container. Since autowiring is broken, manually define it in config/services.yaml:
services:
Dennisberg91\TestBundle\Service\MessageBuilder:
arguments: ['@some_dependency']
Verify:
Inject MessageBuilder into a controller or command to confirm functionality:
use Dennisberg91\TestBundle\Service\MessageBuilder;
class SomeController extends AbstractController
{
public function __construct(private MessageBuilder $messageBuilder) {}
}
Autowiring Fix:
MessageBuilder lacks a default constructor or proper type-hinted dependencies in its class definition.class MessageBuilder
{
public function __construct(private SomeDependency $dependency) {}
}
autoconfigure: false in services.yaml and manually configure:
services:
Dennisberg91\TestBundle\Service\MessageBuilder:
autoconfigure: false
arguments:
$dependency: '@some_dependency'
Environment Variables:
%env() syntax in config/packages/dennisberg91_test.yaml:
parameters:
message_builder.prefix: '%env(MESSAGE_BUILDER_PREFIX)%'
MessageBuilder:
class MessageBuilder
{
public function __construct(private string $prefix) {}
}
.env:
MESSAGE_BUILDER_PREFIX=Hello
Dependency Injection Workflow:
config/packages/dennisberg91_test.yaml.Dennisberg91TestExtension) to merge custom parameters.compile() method to validate/process parameters.Integration with Laravel:
symfony/var-dumper and symfony/dependency-injection for compatibility.config/app.php under providers:
Dennisberg91\TestBundle\Dennisberg91TestBundle::class,
.env and access with config('dennisberg91_test.prefix').Autowiring Limitations:
MessageBuilder has private/protected properties without setters, autowiring fails.@Assert\Assert annotations or constructor injection for immutable dependencies.Environment Variable Scope:
.env may not propagate to all environments (e.g., test vs. prod).ParameterBag or Laravel’s config() helper with environment-aware defaults:
$prefix = config('dennisberg91_test.prefix', env('MESSAGE_BUILDER_PREFIX', 'Default'));
Bundle Overrides:
config/packages/ may be overridden by later bundle loads.prepend: true in bundles.php or extend the bundle’s configuration class.Testing Quirks:
ContainerInterface).PHPUnit\Framework\TestCase and symfony/service-test for container-aware tests.Service Dumping:
php bin/console debug:container MessageBuilder
php artisan container:dump
Configuration Validation:
php bin/console config:validate
config:clear after changes.Dependency Graph:
php bin/console debug:container --format=graphviz
Customizing MessageBuilder:
class CustomMessageBuilderDecorator implements MessageBuilderInterface
{
public function __construct(private MessageBuilder $decorated) {}
}
services.yaml:
services:
Dennisberg91\TestBundle\Service\MessageBuilder:
decorates: 'dennisberg91_test.message_builder'
Adding Commands:
src/Command/ and tag it in services.yaml:
tags: ['console.command']
Event Listeners:
KernelEvents::CONTROLLER):
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
$dispatcher->addListener(KernelEvents::CONTROLLER, function (ControllerEvent $event) {
// Logic here
});
Test Location:
tests/Unit/ (Laravel) or tests/Unit/ (Symfony) with the bundle namespace:
tests/Unit/Dennisberg91/TestBundle/Service/
Test Example:
namespace Tests\Unit\Dennisberg91\TestBundle\Service;
use Dennisberg91\TestBundle\Service\MessageBuilder;
use PHPUnit\Framework\TestCase;
class MessageBuilderTest extends TestCase
{
public function testBuildMessage()
{
$builder = new MessageBuilder('Hello');
$this->assertEquals('Hello World', $builder->build('World'));
}
}
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
class MessageBuilderIntegrationTest extends KernelTestCase
{
public function testMessageBuilderInContainer()
{
self::bootKernel();
$builder = self::$kernel->getContainer()->get(MessageBuilder::class);
$this->assertInstanceOf(MessageBuilder::class, $builder);
}
}
Mocking:
createMock() for external dependencies:
$dependency = $this->createMock(SomeDependency::class);
$builder = new MessageBuilder($dependency);
How can I help you explore Laravel packages today?