Generic Overview
Shippings are responsible for calculate the cost of a model that implements the Bazar\Contracts\Shippable
contract.
The Shippable Contract
The class that implements the interface must implement the shipping
method, where the relationship is defined between the model and the Bazar\Models\Shipping
model:
By default, the
Bazar\Models\Order
and theBazar\Models\Cart
models are implementing the contract.
use Bazar\Models\Shipping;
use Illuminate\Database\Eloquent\Relations\MorphOne;
public function shipping(): MorphOne
{
return $this->morphOne(Shipping::class, 'shippable')->withDefault();
}
Shipping Address
The Shipping
model does not hold the address values directly on the model, but in the related Bazar\Models\Address
model.
Shipping Drivers
Bazar provides some default drivers out of the box: Local Pickup
and Weight Based Shipping
drivers.
Creating Custom Drivers
Registering shipping methods works almost the same as registering gateways methods. All custom drivers should extend the Bazar\Shipping\Driver
class, which holds one abstract method: calculate()
.
Note, the name is guessed automatically from the class name by default. If the guessed name does not match the desired one, you may specify your custom driver name using the
getName()
method.
Let's create a simple driver as an example:
use Bazar\Contracts\Shippable;
use Bazar\Shipping\Driver;
class FedexDriver extends Driver
{
public function calculate(Shippable $model): float
{
//
}
}
Now, let's register the driver using the Bazar\Support\Facades\Shipping
facade:
use Bazar\Support\Facades\Shipping;
Shipping::extend('fedex', function ($app) {
return new FedexDriver(
$app['config']->get('services.fedex')
);
});