baks-dev/delivery-transport
Symfony/PHP 8.4+ module for managing a delivery vehicle fleet used for order delivery. Install via Composer, optionally install assets, generate/apply Doctrine migrations, and run the package’s PHPUnit tests (group: delivery-transport).
Install the package in your Laravel project:
composer require baks-dev/delivery-transport
Publish assets and configure (Symfony-style console command):
php artisan vendor:publish --provider="Baks\DeliveryTransport\DeliveryTransportServiceProvider"
Note: Laravel’s vendor:publish may not work directly; use Symfony’s baks:assets:install via a custom Artisan command wrapper.
Run migrations (Doctrine format; convert to Laravel Eloquent migrations if needed):
php artisan doctrine:migrations:migrate
Alternative: Manually adapt Doctrine migrations to Laravel’s migrations/ directory.
First use case: Create a vehicle via Tinker or a controller:
use Baks\DeliveryTransport\Entity\Vehicle;
$vehicle = new Vehicle();
$vehicle->setType('van');
$vehicle->setCapacity(100); // kg or items
$vehicle->setLicensePlate('ABC123');
$vehicle->setStatus('active'); // 'active', 'maintenance', 'retired'
// Save via Doctrine (requires bridge or custom repository)
$entityManager->persist($vehicle);
$entityManager->flush();
EntityManager (wrap in a Laravel service):
// services/VehicleService.php
namespace App\Services;
use Baks\DeliveryTransport\Entity\Vehicle;
use Doctrine\ORM\EntityManagerInterface;
class VehicleService {
public function __construct(private EntityManagerInterface $em) {}
public function createVehicle(array $data): Vehicle {
$vehicle = new Vehicle();
$vehicle->setType($data['type']);
$vehicle->setCapacity($data['capacity']);
// ... other fields
$this->em->persist($vehicle);
$this->em->flush();
return $vehicle;
}
}
StateMachine (if available) or implement custom logic:
$vehicle->changeStatusTo('maintenance'); // Hypothetical method
// Assuming Order and Vehicle entities exist
$order->addVehicle($vehicle);
$vehicle->addOrder($order);
$entityManager->flush();
if ($vehicle->getCapacity() >= $order->getWeight()) {
$this->assignOrderToVehicle($order, $vehicle);
}
// app/Console/Commands/InstallAssets.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Console\Application;
class InstallAssets extends Command {
protected $signature = 'baks:assets:install';
protected $description = 'Install delivery transport assets';
public function handle() {
$symfonyApp = new Application();
$symfonyApp->add(new \Baks\DeliveryTransport\Command\AssetsInstallCommand());
$symfonyApp->run(new \Symfony\Component\Console\Input\ArrayInput([]));
}
}
Event facade:
// Example: Listen for vehicle status changes
event(new VehicleStatusChanged($vehicle, 'maintenance'));
fruitcake/laravel-doctrine to share entities:
composer require fruitcake/laravel-doctrine
config/doctrine.php:
'orm' => [
'entity_managers' => [
'default' => [
'mappings' => [
'BaksDeliveryTransport' => [
'type' => 'annotation',
'dir' => __DIR__.'/../vendor/baks-dev/delivery-transport/src/Entity',
'prefix' => 'Baks\DeliveryTransport\Entity',
'alias' => 'BaksDeliveryTransport',
],
],
],
],
],
// tests/Feature/DeliveryTransportTest.php
namespace Tests\Feature;
use Baks\DeliveryTransport\Entity\Vehicle;
use Tests\TestCase;
class DeliveryTransportTest extends TestCase {
public function test_vehicle_creation() {
$vehicle = new Vehicle();
$vehicle->setType('van');
$this->assertEquals('van', $vehicle->getType());
}
}
Symfony-Laravel Conflicts:
Application won’t work directly in Laravel. Wrap commands as shown above.ContainerInterface) differs from Laravel’s. Use abstract factories or manual binding.Migration Issues:
Undocumented APIs:
Vehicle::setStatus()) may change without notice.PHP 8.4 Features:
No Frontend:
Abandonware Risk:
Doctrine Logging:
Enable SQL logging in config/doctrine.php:
'orm' => [
'logging' => true,
'logging_params' => true,
],
Symfony Command Debugging: Run Symfony commands directly for debugging:
php vendor/bin/symfony console baks:assets:install --verbose
Entity Lifecycle:
Use Doctrine’s lifecycle callbacks (e.g., prePersist) for validation:
/** @ORM\PrePersist */
public function prePersist() {
if (empty($this->licensePlate)) {
throw new \InvalidArgumentException('License plate required');
}
}
Hybrid ORM Debugging:
DB::enableQueryLog() for Eloquent and Doctrine’s EventListener for SQL logging.Custom Vehicle Types:
Extend the Vehicle entity with traits or inheritance:
namespace App\Entities;
use Baks\DeliveryTransport\Entity\Vehicle;
class ElectricVehicle extends Vehicle {
private ?float $batteryCapacity;
public function setBatteryCapacity(float $capacity): self {
$this->batteryCapacity = $capacity;
return $this;
}
}
Routing Integration:
Add a routeOptimizer field to Vehicle and integrate with a routing API (e.g., GraphHopper):
$vehicle->setRouteOptimizer('graphhopper');
IoT Support:
Extend Vehicle with telemetry fields (e.g., lastGpsUpdate, fuelLevel) and sync with a device API.
API Endpoints: Create Laravel API resources for vehicles:
// routes/api.php
Route::apiResource('vehicles', \App\Http\Controllers\VehicleController::class);
Event-Driven Workflows: Dispatch Laravel events for vehicle status changes:
event(new VehicleStatusUpdated($vehicle, 'maintenance'));
Listen in a service provider:
public function boot() {
event(VehicleStatusUpdated::class, function ($event) {
// Send notification, update UI, etc.
});
}
config/doctrine.phpHow can I help you explore Laravel packages today?