目前我正在做Shopware 6的扩展,它是基于Symfony的,我不明白的是如何实现抽象类和依赖注入。
因此,我希望能够重构代码,并经常使用这些方法,但在另一个上下文中(使用另一个存储库)
<?php
declare(strict_types=1);
namespace WShop\Service;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Uuid\Uuid;
/**
* Service for writing Products
*/
class ProductService
{
private EntityRepository $productRepository;
private MediaImageService $mediaImageService;
private EntityRepository $productMediaRepository;
public function __construct(
EntityRepository $productRepository,
MediaImageService $mediaImageService,
EntityRepository $productMediaRepository
)
{
$this->productRepository = $productRepository;
$this->mediaImageService = $mediaImageService;
$this->productMediaRepository = $productMediaRepository;
}
private function createProduct(array $data, Context $context = null): void
{
$context = $context ?? Context::createDefaultContext();
$this->productRepository->create([
$data
], $context);
}
public function updateProduct(array $data): void
{
$this->productRepository->update([$data], Context::createDefaultContext());
}
public function getExistingProductId(string $productNumber): ?string
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('productNumber', $productNumber));
return $this->productRepository->searchIds($criteria,
Context::createDefaultContext())->firstId();
}
}
正如您所看到,在构造内部存在依赖注入,(产品存储库)。现在我的问题是,我如何才能创建存储这些方法的抽象类,但子类将使用所需的存储库“重写”父构造?例如,我想使用getDataId(现在它被称为getExistingProductId,但是它将在抽象类中被重构和重命名)方法,但是对于下一个类,我想在categors repository上使用相同的方法?
Service.xml也称为依赖项注入器
<service id="wshop_product_service" class="WShop\Service\ProductService">
<argument type="service" id="product.repository"/>
<argument id="wshop_media_image_service" type="service"/>
<argument type="service" id="product_media.repository"/>
</service>
我是一个新的OOP。请提供一个好的例子和代码解释。谢谢!
1条答案
按热度按时间vxqlmq5t1#
如果我没理解错的话,你只需要第一个参数是可互换的,并且你例子中的3个方法应该是抽象实现的。
摘要:
你在构造函数中使用仓库,并在抽象中实现所有关于通用仓库的通用方法。你想在扩展类中实现的
getDataId
方法,因为你对每一个方法都使用了特定的标准(大概)。所以你只需要通过定义一个抽象签名来强制在扩展类中实现。您的服务类别:
在扩展类中,您只将仓库传递给父构造函数,因为其他注入的服务只在这个特定示例中使用。您实现
getDataId
,在这里您创建特定的条件,并使用该条件调用受保护的(因为它只应该由扩展使用)searchId
方法。