Checkout
Checkout is one of the most opinionated areas of E-commerce sites. Vanilo's checkout module was designed to be as flexible as possible, and to support all 3 major checkout types:
- One-page
 - Accordion
 - Multi-page
 
Other than these, it optionally allows saving incomplete checkouts to db, session, cache (redis, memcache), etc.
As of v0.5 only the One-page type / without saving has been implemented yet.
Checkout Data
Checkout has the following data associated:
- Cart (
CheckoutSubject) - CheckoutState (enum)
 - BillPayer
- Customer data
 - Billing Address (
Address) 
 - Shipping Address (
Address) 
Checkout Forms
For a complete checkout form example refer to the Vanilo Demo repository
Obtain Checkout Instance
There are 3 usual ways you can use to obtain a checkout instance:
1. Use the Checkout facade
I know, facades are 🌩 & 🚨 & ☣
use App\Http\Requests\CheckoutRequest;
use Vanilo\Cart\Facades\Cart;
use Vanilo\Checkout\Facades\Checkout;
public function submit(CheckoutRequest $request)
{
    Checkout::setCart(Cart::model());
    Checkout::update($request->all());
    //...
}
2. Use the vanilo.checkout service
$checkout = app('vanilo.checkout');
$cart     = app('vanilo.cart');
$checkout->setCart($cart);
3. Let Laravel Container to inject
Refer to Container Automatic Injection an for more details
use App\Http\Requests\CheckoutRequest;
use Vanilo\Checkout\Contracts\Checkout;
use Vanilo\Cart\Contracts\Cart;
use Vanilo\Order\Contracts\OrderFactory;
class CheckoutController extends Controller
{
    protected $checkout;
    
    // Laravel Container will inject the actual checkout/cart
    // instances bound to their interfaces
    public function __construct(Checkout $checkout, Cart $cart)
    {
        $this->checkout = $checkout;
        $this->checkout->setCart($cart);
    }
    
    // Actions now can use the checkout
}
Create Order From Checkout
Vanilo Framework extends the Order module's factory with a createFromCheckout
method that accepts a pre-validated checkout as parameter:
namespace App\Http\Controllers;
use App\Http\Requests\CheckoutRequest;
use Vanilo\Checkout\Contracts\Checkout;
use Vanilo\Cart\Contracts\Cart;
use Vanilo\Order\Contracts\OrderFactory;
class CheckoutController extends Controller
{
    protected $checkout;
    
    public function __construct(Checkout $checkout, Cart $cart)
    {
        $this->checkout = $checkout;
        $this->checkout->setCart($cart);
    }
    
    // CheckoutRequest contains your app's validation rules
    public function submit(CheckoutRequest $request, OrderFactory $orderFactory)
    {
        $this->checkout->update($request->all());
        $order = $orderFactory->createFromCheckout($this->checkout);
        //...        
    }
}
See Vanilo Demo's CheckoutController for a working example.