Installation
composer require carguru/vendor-bundle
Add the bundle to config/app.php under providers:
JanWebdev\VendorBundle\VendorBundle::class,
Publish Config (if needed)
php artisan vendor:publish --provider="JanWebdev\VendorBundle\VendorBundle" --tag="config"
Check config/vendor.php for default settings.
First Use Case: Domain Isolation
Define a vendor-specific entity (e.g., app/Domain/Vendor/Entities/Customer.php) and map it to the bundle’s repository:
use JanWebdev\VendorBundle\Repositories\BaseRepository;
class CustomerRepository extends BaseRepository
{
protected $entity = \JanWebdev\VendorBundle\Entities\Customer::class;
}
Register Repository
Bind the repository in a service provider (e.g., App\Providers\VendorServiceProvider):
$this->app->bind(
\JanWebdev\VendorBundle\Repositories\CustomerRepository::class,
function ($app) {
return new \App\Domain\Vendor\Repositories\CustomerRepository(
$app->make(\JanWebdev\VendorBundle\Repositories\BaseRepository::class)
);
}
);
// Core Laravel model (e.g., Product)
class Product extends Model {}
// Vendor-specific extension
class VendorProduct extends \JanWebdev\VendorBundle\Entities\Product
{
public function calculateVendorDiscount(): float
{
return $this->price * $this->vendor->discount_rate;
}
}
BaseRepository for vendor-specific queries:
class VendorOrderRepository extends BaseRepository
{
public function getActiveOrdersForVendor(int $vendorId): Collection
{
return $this->scopeQuery(function ($query) use ($vendorId) {
return $query->where('vendor_id', $vendorId)->where('status', 'active');
})->get();
}
}
public function __construct(VendorOrderRepository $orderRepo) {}
// Example: Trigger after vendor entity update
event(new \JanWebdev\VendorBundle\Events\VendorUpdated($vendor));
Resource classes to transform bundle entities:
namespace App\Http\Resources;
use JanWebdev\VendorBundle\Entities\Vendor;
use Illuminate\Http\Resources\Json\JsonResource;
class VendorResource extends JsonResource
{
public function toArray($request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'custom_field' => $this->whenLoaded('customField'),
];
}
}
AppServiceProvider:
$this->app->singleton(
\JanWebdev\VendorBundle\Services\VendorService::class,
\App\Services\CustomVendorService::class
);
Namespace Collisions
JanWebdev\VendorBundle; avoid naming conflicts by prefixing custom classes (e.g., App\Domain\Vendor\...).Missing Dependency Injection
BindingResolutionException. Always register them in a provider.Entity Inheritance Pitfalls
extends \JanWebdev\VendorBundle\Entities\Customer) may break migrations if the parent schema changes. Prefer composition over inheritance.Configuration Overrides
config/vendor.php) may not auto-load. Manually merge it in AppServiceProvider:
$this->mergeConfigFrom(__DIR__.'/../../../vendor/janwebdev/vendor-bundle/config/vendor.php', 'vendor');
Repository Queries
.env:
DB_LOG_QUERIES=true
BaseRepository queries.Event Debugging
Event::listen(\JanWebdev\VendorBundle\Events\VendorUpdated::class, function ($event) {
Log::debug('Vendor updated:', ['vendor' => $event->vendor]);
});
Service Binding Issues
php artisan container:dump to inspect bindings:
php artisan container:dump | grep Vendor
Custom Repositories
BaseRepository methods (e.g., find(), create()) in your app’s repository layer.Entity Observers
AppServiceProvider:
\JanWebdev\VendorBundle\Entities\Vendor::observe(\App\Observers\VendorObserver::class);
API Middleware
Route::middleware(['vendor.auth'])->group(function () {
Route::apiResource('vendors', \App\Http\Controllers\VendorController::class);
});
Testing
$this->app->instance(
\JanWebdev\VendorBundle\Repositories\CustomerRepository::class,
Mockery::mock()
);
How can I help you explore Laravel packages today?