Installation Add the bundle via Composer:
composer require dzangocart/dzangocart-bundle
Enable it in config/bundles.php:
return [
// ...
DzangoCart\DzangoCartBundle\DzangoCartBundle::class => ['all' => true],
];
Configuration Publish the default config:
php bin/console dzango-cart:install
Update config/packages/dzango_cart.yaml with your DzangoCart API credentials (e.g., api_key, base_uri).
First Use Case Fetch a product in a controller:
use DzangoCart\DzangoCartBundle\Service\DzangoCartClient;
class ProductController extends AbstractController
{
public function show(Product $product)
{
$client = $this->container->get(DzangoCartClient::class);
$dzangoProduct = $client->getProduct($product->dzangoId);
return $this->render('product/show.html.twig', [
'dzangoProduct' => $dzangoProduct,
]);
}
}
Product Management
DzangoCartClient::getProduct($id) for single products or getProducts() for collections.syncProducts() to mirror DzangoCart inventory to your DB.
$this->get('dzango_cart.client')->syncProducts();
Cart Integration
createGuestCart() and addToGuestCart() for anonymous users.linkUserToCart($user, $cartId).
$cart = $this->get('dzango_cart.client')->getCart($user->dzangoCartId);
Order Processing
createOrder() with user/cart data.dzango_cart.yaml to listen for order.created events:
dzango_cart:
webhooks:
order_created: 'App\EventListener\OrderWebhookListener'
Twig Integration
{% set cart = app.service('dzango_cart.client').getCart(user.dzangoCartId) %}
{% for item in cart.items %}
{{ item.product.name }} - {{ item.quantity }}
{% endfor %}
getProduct()) with Symfony’s cache system:
$product = $this->get('dzango_cart.client')->getProduct($id, 3600); // Cache for 1 hour
try {
$client->getProduct($id);
} catch (\DzangoCart\Exception\ApiException $e) {
$this->addFlash('error', 'Failed to fetch product: ' . $e->getMessage());
}
kernel.request to update cart on page load).API Rate Limits
$client = $this->get('dzango_cart.client');
$client->setRetryPolicy(new RetryPolicy(3, 1000)); // Retry 3 times with 1s delay
getRateLimitStatus().ID Mismatches
product.id) match DzangoCart’s (product.dzangoId). Use a migration to sync them:
// In a Doctrine migration
$product->setDzangoId($dzangoProduct->getId());
$entityManager->persist($product);
Webhook Delays
# config/packages/messenger.yaml
framework:
messenger:
transports:
dzango_cart: '%env(MESSENGER_TRANSPORT_DSN)%'
Deprecated Methods
src/Service/DzangoCartClient.php for deprecated methods (e.g., getCartItems() → getCart()->getItems()).Enable API Logging
Add to config/packages/dzango_cart.yaml:
dzango_cart:
debug: true
Logs appear in var/log/dev.log.
Test Locally
Use DzangoCart’s sandbox environment (configure base_uri in dzango_cart.yaml):
dzango_cart:
base_uri: 'https://sandbox.dzangocart.com/api/v1'
Validate Responses DzangoCart’s API may return partial data. Always check response structure:
$product = $client->getProduct($id);
if (!$product->getId()) {
throw new \RuntimeException('Invalid product data from DzangoCart');
}
Custom Clients
Extend DzangoCartClient to add methods:
class CustomDzangoCartClient extends DzangoCartClient
{
public function getProductWithReviews($productId)
{
$product = parent::getProduct($productId);
$reviews = $this->get('/products/' . $productId . '/reviews');
return array_merge($product->toArray(), ['reviews' => $reviews]);
}
}
Register as a service:
services:
App\Service\CustomDzangoCartClient:
arguments:
- '@http_client'
- '%dzango_cart.api_key%'
tags: ['dzango_cart.client']
Event Listeners
Subscribe to DzangoCart events (e.g., dzango_cart.product.updated):
use DzangoCart\Event\ProductEvent;
class ProductSyncListener
{
public function onProductUpdated(ProductEvent $event)
{
// Sync local product data
}
public static function getSubscribedEvents()
{
return [
'dzango_cart.product.updated' => 'onProductUpdated',
];
}
}
Override Templates
The bundle uses Twig templates in Resources/views/. Override them in your app’s templates/bundles/dzangocart/ directory.
Add Custom Fields
Extend DzangoCart’s product model by adding custom attributes to your local Product entity and sync them via a custom sync method:
$client->syncProduct($localProduct, ['custom_field' => $localProduct->getCustomField()]);
How can I help you explore Laravel packages today?