Installation
Run composer require common-gateway/pet-store-plugin:dev-main in your Laravel project root.
Note: Since this is a Symfony Flex bundle, ensure your Laravel project uses Symfony components (e.g., symfony/console, symfony/dependency-injection).
First Use Case
config/bundles.php (Symfony) or config/app.php (Laravel) if manually added.php artisan <bundle:command> # Replace with the actual command name
composer.json for required Symfony/Laravel packages (e.g., symfony/http-kernel).Where to Look First
src/MyFirstBundle.php: Entry point for bundle configuration (services, routes, etc.).src/Service/: Example service classes (extend or override these).config/: Bundle-specific configurations (if any).Resources/config/services.yaml: Symfony service definitions (map to Laravel’s config/services.php if needed).Service Integration
MyFirstBundle.php to add services:
public function loadExtension(array $containerConfig, ContainerBuilder $container, ExtensionInterface $extension) {
$container->register('my_first_service', MyFirstService::class);
$container->setAlias('my_first_service', MyFirstServiceInterface::class);
}
AppServiceProvider@boot(), bind Symfony services to Laravel’s container:
$this->app->singleton(MyFirstServiceInterface::class, function ($app) {
return $app->make('my_first_service'); // Symfony service ID
});
Command Line Tools
src/Command/ (if provided) or add your own:
namespace MyFirstBundle\Command;
use Symfony\Component\Console\Command\Command;
class MyCommand extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
$output->writeln('Hello from MyFirstBundle!');
}
}
MyFirstBundle.php, override getCommands():
public function getCommands() {
return [new MyCommand()];
}
Routing
Resources/config/routes.yaml:
my_first_route:
path: /my-first
controller: MyFirstBundle\Controller\MyController::index
Route::prefix('my-first')->group() in routes/web.php and proxy requests to Symfony’s router if needed.Event Listeners
services.yaml:
services:
my_first.listener:
class: MyFirstBundle\EventListener\MyListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
Event::listen('kernel.request', function ($request) {
// Call Symfony listener logic here
});
public function __construct(private MyFirstService $service) {}
ExtensionInterface to load config from config/packages/my_first.yaml:
# config/packages/my_first.yaml
my_first:
enabled: true
timeout: 30
Access in PHP:
$this->container->getParameter('my_first.timeout');
php artisan vendor:publish --tag=my-first-assets
Then link in resources/views/layouts/app.blade.php.Namespace Collisions
Bundle suffix (e.g., MyFirstBundle), while Laravel uses ServiceProvider. Avoid naming conflicts.Vendor\BundleName\MyFirstBundle).Composer Autoloading
autoload in composer.json after renaming classes.composer dump-autoload after changes.Symfony vs. Laravel Container
ContainerBuilder with Laravel’s Container. Symfony’s container is stricter about service IDs.$symfonyService = $this->app->make('service_id')->getWrappedObject();
Flex Recipe Conflicts
config/bundles.php).composer remove symfony/flex
Command Registration
php artisan list.config/bundles.php (Symfony) or AppServiceProvider (Laravel):
$this->app->register(MyFirstBundle::class);
Service Not Found
services.yaml and the bundle is loaded.php bin/console debug:container
Route Not Found
routes.yaml and the bundle is enabled.php bin/console debug:router
Event Not Triggered
services.yaml and the event name matches (e.g., kernel.request).Customize Bundle Behavior
MyFirstBundle → MyCustomFirstBundle).namespace Vendor\BundleName\MyCustomFirstBundle;
use MyFirstBundle\MyFirstBundle as BaseBundle;
class MyCustomFirstBundle extends BaseBundle {
public function getPath() {
return \dirname(__DIR__);
}
}
Add New Features
Service/ directory with your own classes and register them in services.yaml.Publish Assets/Config
composer.json:
"extra": {
"publish": {
"config": "Resources/config/my_first.yaml",
"assets": "Resources/public/"
}
}
php artisan vendor:publish --tag=config --tag=assets
Laravel-Specific Extensions
namespace Vendor\BundleName\Facades;
use Illuminate\Support\Facades\Facade;
class MyFirstFacade extends Facade {
protected static function getFacadeAccessor() {
return 'my_first_service'; // Symfony service ID
}
}
config/app.php:
'aliases' => [
'MyFirst' => Vendor\BundleName\Facades\MyFirstFacade::class,
],
How can I help you explore Laravel packages today?