Installation
composer require baks-dev/delivery baks-dev/delivery-transport
Ensure baks-dev/core (v7.4+) is installed as a dependency.
Asset & DB Setup
php artisan baks:assets:install # Publishes configs/views/assets
php artisan migrate # Runs migrations for delivery tables
First Use Case Create a basic order delivery:
use Baks\Delivery\OrderDelivery;
use Baks\Delivery\Transport\Transport;
// Inject dependencies (via DI container)
$orderDelivery = new OrderDelivery(
transport: new Transport(),
order: $yourOrderModel,
user: auth()->user()
);
$result = $orderDelivery->create(); // Returns Delivery instance or throws exception
baks:assets:install, baks:delivery:... (check vendor/baks-dev/delivery/src/Command/).config/delivery.php (modify after baks:assets:install).src/Entity/ (e.g., Delivery, DeliveryStatus).Order Delivery Creation
// Service layer pattern
public function assignDelivery(Order $order, User $user)
{
$delivery = app(OrderDelivery::class)
->setOrder($order)
->setAssignedUser($user)
->setTransport($this->transportService->getAvailable())
->create();
return $delivery;
}
Status Transitions
Use the DeliveryStatus enum (or service) to handle state changes:
$delivery->updateStatus(DeliveryStatus::IN_TRANSIT);
// Triggers events/hooks (see "Events" below)
Transport Integration
// Fetch available transports
$transports = app(TransportRepository::class)->getAvailable();
// Assign to delivery
$delivery->setTransport($transports->first());
DeliveryCreated, StatusChanged, etc. (see src/Event/).
event(new DeliveryCreated($delivery));
DeliveryResource (if included) or build custom DTOs:
return new DeliveryResource($delivery);
DeliveryValidator for custom rules:
use Baks\Delivery\Validator\DeliveryValidator;
$validator = new DeliveryValidator();
$validator->addRule('custom_rule', fn($value) => /* ... */);
Custom Delivery Types
// Extend base Delivery entity
class CustomDelivery extends Delivery
{
public function getCustomField(): string
{
return $this->custom_field;
}
}
Register in config/delivery.php:
'delivery_types' => [
'custom' => CustomDelivery::class,
],
Transport Providers
Implement TransportProviderInterface:
class MyTransportProvider implements TransportProviderInterface
{
public function getAvailable(): Collection
{
return Transport::query()->where('provider', 'my_provider')->get();
}
}
Bind in service provider:
$this->app->bind(TransportProviderInterface::class, MyTransportProvider::class);
Missing delivery-transport
Class 'Transport' not found.baks-dev/delivery-transport as a dependency.Database Schema Mismatch
Column not found after migrations.php artisan migrate:fresh or check CHANGELOG.md for breaking changes.Event Listeners Not Triggered
EventServiceProvider.protected $listen = [
DeliveryCreated::class => [
DeliveryNotificationHandler::class,
],
];
Transport Assignment Logic
TransportRepository::getAvailable() or the service layer.Log Delivery Events
// In config/delivery.php
'debug' => env('APP_DEBUG', false),
Enables verbose logging for status transitions.
Dump Delivery Data
dd(app(DeliverySerializer::class)->serialize($delivery));
Default Transport Provider
Configure in config/delivery.php:
'default_transport_provider' => 'baks_delivery.transport_provider.default',
Override via service binding if needed.
Status Machine
The package uses a state machine for DeliveryStatus. Custom transitions require:
// In config/delivery.php
'status_transitions' => [
'pending' => ['can_cancel' => true],
'in_transit' => ['can_return' => true],
],
Custom Fields
Add to Delivery entity and update migrations:
// src/Entity/Delivery.php
#[ORM\Column(nullable: true)]
private ?string $customField = null;
Publish new migrations:
php artisan baks:assets:install --force
Hooks for Business Logic
Use the DeliveryEvents facade:
DeliveryEvents::listen('before_create', function ($delivery) {
// Add pre-create logic (e.g., validate stock)
});
API Resources
Extend DeliveryResource:
class CustomDeliveryResource extends DeliveryResource
{
public function toArray($request)
{
return array_merge(parent::toArray($request), [
'custom_field' => $this->resource->getCustomField(),
]);
}
}
How can I help you explore Laravel packages today?