baks-dev/products-product
BaksDev Product — модуль продукции для PHP 8.4+: управление продуктами и интеграция с категориями, валютами, деньгами и единицами измерения. Поддерживает установку ассетов, миграции Doctrine и тесты PHPUnit.
Install Dependencies:
composer require baks-dev/products-category baks-dev/reference-money baks-dev/reference-currency baks-dev/reference-measurement baks-dev/products-product
Verify composer.json for version conflicts with existing packages.
Set Up Configuration:
php bin/console baks:assets:install
Overrides default config in config/baks.php if needed.
Run Migrations:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Test migrations in a staging DB first with --dry-run.
Register Service Provider:
Add to config/app.php:
Baks\Products\ProductsProductServiceProvider::class,
First Use Case: Create a product via Tinker or API:
use Baks\Products\Entity\Product;
$product = new Product();
$product->setName('Test Product');
$product->setSku('SKU123');
$product->setPrice(19.99); // Uses reference-money
$entityManager->persist($product);
$entityManager->flush();
src/Entity/ for Product, Category, and relationships.src/Command/ for baks:assets:install.src/Resources/migrations/ for schema changes.config/baks.php (auto-published by baks:assets:install).$product = (new Product())
->setName('Laptop')
->setSku('LP-001')
->setCategory($categoryEntity)
->setPrice(new Money(999.99, 'USD')); // Uses reference-money
$entityManager->persist($product);
$product = $entityManager->getRepository(Product::class)
->findOneBy(['sku' => 'LP-001']);
$product->setPrice(new Money(899.99, 'USD'));
$entityManager->flush();
$category = $entityManager->getRepository(Category::class)
->findOneBy(['name' => 'Electronics']);
$product->setCategory($category);
TreeRepository (if implemented) or custom traversal:
function getCategoryPath(Category $category) {
$path = [$category->getName()];
while ($parent = $category->getParent()) {
$path[] = $parent->getName();
$category = $parent;
}
return array_reverse($path);
}
$product->setPrice(new Money(100, 'EUR')); // Auto-converts if needed
$product->setWeight(new Measurement(1.5, 'kg')); // Uses reference-measurement
CSV Import:
Use Laravel’s queue for async processing:
ProductBulkImporter::dispatch($csvPath)->onQueue('products');
Extend ProductBulkImporter to handle custom logic.
API Endpoints:
Route::post('/products/bulk', [ProductController::class, 'bulkStore']);
Validation:
Extend with Laravel’s FormRequest:
use Baks\Products\Validator\ProductValidator;
class StoreProductRequest extends FormRequest {
public function rules() {
return array_merge(
ProductValidator::rules(),
['custom_field' => 'required']
);
}
}
Events: Listen for product events (if not built-in):
event(new ProductCreated($product));
Extend Product entity to dispatch events.
API Resources:
class ProductResource extends JsonResource {
public function toArray($request) {
return [
'id' => $this->id,
'name' => $this->name,
'price' => $this->price->getAmount(),
'currency' => $this->price->getCurrency()->getCode(),
];
}
}
Livewire:
class ProductManager extends Component {
public $products;
public function mount() {
$this->products = Product::all();
}
public function render() {
return view('livewire.product-manager');
}
}
Inertia.js:
Route::get('/products', [ProductController::class, 'index'])
->name('products.index');
Use ProductResource to shape data for Inertia.
Unit Tests:
public function testProductCreation() {
$product = new Product();
$product->setName('Test');
$this->assertEquals('Test', $product->getName());
}
Feature Tests:
public function testProductApi() {
$response = $this->post('/api/products', [
'name' => 'Test Product',
'sku' => 'TEST123'
]);
$response->assertCreated();
}
Doctrine vs. Eloquent:
// ❌ Avoid this (unless adapted)
Product::query()->where('name', 'like', '%test%')->get();
EntityManager or Repository:
$repository = $entityManager->getRepository(Product::class);
$products = $repository->findBy(['name' => 'test']);
Migration Conflicts:
// config/packages/doctrine.php
doctrine:
dbal:
migrations: false
php bin/console doctrine:migrations:migrate separately.Hardcoded Dependencies:
products-category, reference-money, etc. Install all or risk runtime errors:
composer require baks-dev/products-category baks-dev/reference-money baks-dev/reference-currency baks-dev/reference-measurement
PHP 8.4+ Strictness:
// ❌ May fail in PHP < 8.4
$product = new Product(name: 'Test');
Translation Issues:
Продукция = ProductsКатегории = CategoriesЦена = PriceQuery Logging:
Enable Doctrine logging in config/packages/doctrine.php:
doctrine:
dbal:
logging: true
logging_format: '%%timestamp%% %%sql%%'
EntityManager Debugging:
$entityManager->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
Console Command Errors:
-v for verbose output:
php bin/console baks:assets:install -v
Validation Errors:
ProductValidator in src/Validator/ for custom rules.Custom Attributes:
Extend the Product entity with traits:
use Baks\Products\Entity\Product;
use Baks\Products\Trait\HasCustomAttributes;
class ExtendedProduct extends Product {
use HasCustomAttributes;
}
Repository Overrides: Bind a custom repository in the service provider:
$this->app->bind(
\Baks\Products\Repository\ProductRepository::class,
\App\Repository\CustomProductRepository::class
);
Event Listeners: Add listeners for product lifecycle events:
// app/Listeners/ProductCreatedListener.php
public function handle(ProductCreated $event) {
// Send notification, log, etc.
}
API Extensions: Add custom endpoints:
How can I help you explore Laravel packages today?