AppKernel, config.yml, and Symfony’s dependency injection (DI) container. Direct integration without abstraction layers (e.g., Symfony Bridge) would require significant refactoring.AppKernel, container->get()). Laravel’s service container (app() or container()) differs in structure and lifecycle, necessitating adapter patterns or wrappers.WinicTransport) is a strength, but Laravel’s preferred approach (e.g., Facades, Service Providers) would require custom integration logic.config.yml → Laravel’s config/sms.php) and dependency injection (e.g., AppKernel → ServiceProvider) would demand:
container->get('sms') pattern (e.g., Sms::send()).config/ files into the bundle’s expected format.Transport and Model\Sms classes into a standalone PHP library.Manager pattern for transports).Symfony\Component\DependencyInjection) may clash with Laravel’s versions or autoloading.WinicTransport) may rely on Symfony services (e.g., HttpClient) that need Laravel alternatives.config.yml assumptions may not align with Laravel’s dynamic configuration.Why Symfony-Specific?
Provider Compatibility
username, password) be secured in Laravel (e.g., .env vs. config)?Architectural Tradeoffs
Long-Term Viability
AppKernel, config.yml, and Symfony’s DI container.ServiceProvider, config/ files, and Laravel’s container (app()).Transport interface (e.g., sendSms(Sms $sms)) is language-agnostic and reusable.Sms class (e.g., getRecipient(), getMessage()) could be adapted for Laravel’s Eloquent or DTOs.register().container->get() with Laravel’s app() or Facades.// app/Providers/SmsServiceProvider.php
public function register()
{
$this->app->singleton('sms', function ($app) {
return new cspoo\SmsBundle\Sms\SmsSender(
$app['cspoo_sms.factory']
);
});
}
config.yml to Laravel’s config/sms.php:
// config/sms.php
return [
'default_transport' => 'winic',
'transports' => [
[
'name' => 'winic',
'type' => 'winic',
'username' => env('SMS_WINIC_USERNAME'),
'password' => env('SMS_WINIC_PASSWORD'),
],
],
];
$this->container->get('sms') with a Facade:
// app/Facades/Sms.php
public static function send(string $phone, string $message)
{
return app('sms')->sendSms(
app('sms')->createSms($phone, $message)
);
}
BaseTransport in Laravel’s namespace and register it in the factory.Transport interface and Sms model into a standalone library (e.g., vendor/your-sms-core).// src/Transport/TransportInterface.php
interface TransportInterface {
public function sendSms(Sms $sms);
}
// app/Providers/SmsServiceProvider.php
public function register()
{
$this->app->bind('sms.transport.winic', function ($app) {
return new WinicTransport(
$app['config']['sms.transports.winic.username'],
$app['config']['sms.transports.winic.password']
);
});
}
SmsManager Facade to handle transport routing:
// app/Facades/SmsManager.php
public function send(string $phone, string $message)
{
$transport = $this->app['sms.transport.' . config('sms.default_transport')];
return $transport->sendSms(new Sms($phone, $message));
}
cspoo\SmsBundle\DependencyInjection\Configuration or cspoo\SmsBundle\Sms\SmsSender may assume Symfony’s ContainerAware or ContainerInterface.Container facade or mock dependencies during testing.ConfigLoader) to normalize formats.sms.send) may not trigger in Laravel.Event::dispatch('sms.sent')).Phase 1: Proof of Concept
Transport interface and Sms model.Phase 2: Full Integration
SmsSender to Laravel’s container.Phase 3: Extensibility
env() values).Log facade).WinicTransport) may exist.HttpClient)How can I help you explore Laravel packages today?