44     private $productFactory;
    49     private $categoryCollectionFactory;
    54     private $urlRewriteFactory;
    59     private $storeCollectionFactory;
    64     private $categories = [];
    69     private $storesPerWebsite = [];
    74     private $entityGeneratorFactory;
    79     private $storeManager;
    84     private $productTemplateGeneratorFactory;
    89     private $productUrlSuffix = [];
    99     private $customTableMap;
   113         \
Magento\Catalog\Model\ProductFactory $productFactory,
   117         EntityGeneratorFactory $entityGeneratorFactory,
   124         $this->categoryCollectionFactory = $categoryCollectionFactory;
   125         $this->urlRewriteFactory = $urlRewriteFactory;
   126         $this->storeCollectionFactory = $storeCollectionFactory;
   127         $this->entityGeneratorFactory = $entityGeneratorFactory;
   129         $this->productTemplateGeneratorFactory = $productTemplateGeneratorFactory;
   130         $this->scopeConfig = $scopeConfig;
   131         $this->customTableMap = $customTableMap;
   143         $this->initializeFixtureDefaultValues($fixtureMap);
   146         for ($productNumber = 1; $productNumber <= 
$products; $productNumber++) {
   147             $attributeSetId = $this->getFixtureValue(
'attribute_set_id', $productNumber, $productNumber, $fixtureMap);
   156                 'entity_id_field' => 
'entity_id',
   157                 'handler' => 
function (
$productId, $entityNumber, $fixture) {
   158                     return $this->urlRewriteHandler(
$productId, $entityNumber, $fixture);
   161             'catalog_category_product' => [
   163                     'category_id' => 
'category_ids',
   166             'catalog_product_entity' => [
   168                     'attribute_set_id' => 
'attribute_set_id',
   173         $websiteIdsFixtures = $fixtureMap[
'website_ids'](1, 0);
   174         if (is_array($websiteIdsFixtures) && count($websiteIdsFixtures) === 1) {
   176             $customTableMap[
'catalog_product_website'] = [
   178                     'website_id' => 
'website_ids',
   182         $generator = $this->entityGeneratorFactory->create(
   184                 'entityType' => ProductInterface::class,
   185                 'customTableMap' => array_merge($customTableMap, $this->customTableMap)
   189             $fixtureMap = array_merge($fixtureMap, [
'attribute_set_id' => 
$attributeSetId]);
   191                 $this->productTemplateGeneratorFactory->create($fixtureMap),
   193                 function ($productNumber, $entityNumber) use (
$attributeSetId, $fixtureMap) {
   197                         $fixtureMap[
'additional_attributes'](
$attributeSetId, $productNumber, $entityNumber)
   208     private function initializeFixtureDefaultValues(array &$fixture)
   211             'attribute_set_id' => 
function () {
   212                 return $this->productFactory->create()->getDefaultAttributeSetId();
   214             'additional_attributes' => 
function () {
   217             'url_key' => 
function (
$productId, $entityNumber) use ($fixture) {
   218                 return strtolower(str_replace(
' ', 
'-', $fixture[
'sku'](
$productId, $entityNumber)));
   220             'website_ids' => 
function () {
   221                 return $this->storeManager->getDefaultStoreView()->getWebsiteId();
   225         foreach ($defaultValues as $fixtureKey => 
$value) {
   226             if (!isset($fixture[$fixtureKey])) {
   227                 $fixture[$fixtureKey] = 
$value;
   239     private function getFixtureValue($fixtureKey, 
$productId, $entityNumber, $fixtureMap)
   241         $fixtureValue = isset($fixtureMap[$fixtureKey]) ? $fixtureMap[$fixtureKey] : 
null;
   242         return $fixtureValue ? $this->getBindValue($fixtureValue, 
$productId, $entityNumber) : 
'';
   251     private function getBindValue($fixtureValue, 
$productId, $entityNumber)
   253         return is_callable($fixtureValue)
   266     private function urlRewriteHandler(
$productId, $entityNumber, $fixtureMap)
   273         $requestPath = $this->getFixtureValue(
'url_key', 
$productId, $entityNumber, $fixtureMap);
   274         $targetPath = 
'catalog/product/view/id/' . 
$productId;
   275         $urlRewrite = $this->urlRewriteFactory
   277             ->setRequestPath($requestPath)
   278             ->setTargetPath($targetPath)
   280             ->setEntityType(
'product');
   281         $binds[] = $urlRewrite->toArray();
   283         if (isset($fixtureMap[
'category_ids'])) {
   284             $categoryId = $fixtureMap[
'category_ids'](
$productId, $entityNumber);
   285             if (!isset($this->categories[$categoryId])) {
   286                 $this->categories[$categoryId] = $this->categoryCollectionFactory
   288                     ->addIdFilter($categoryId)
   289                     ->addAttributeToSelect(
'url_path')
   293             $urlRewrite->setMetadata([
'category_id' => $categoryId])
   294                 ->setRequestPath($this->categories[$categoryId] . 
'/' . $requestPath)
   295                 ->setTargetPath($targetPath . 
'/category/' . $categoryId);
   296             $binds[] = $urlRewrite->toArray();
   300             if (!isset($this->storesPerWebsite[
$websiteId])) {
   301                 $this->storesPerWebsite[
$websiteId] = $this->storeCollectionFactory
   306             foreach ($binds as $bind) {
   308                     $bindWithStore = $bind;
   309                     $bindWithStore[
'store_id'] = 
$storeId;
   310                     $bindWithStore[
'request_path'] .= $this->getUrlSuffix(
$storeId);
   311                     $bindPerStore[] = $bindWithStore;
   316         return $bindPerStore;
   325     private function getUrlSuffix(
$storeId)
   327         if (!isset($this->productUrlSuffix[
$storeId])) {
   328             $this->productUrlSuffix[
$storeId] = $this->scopeConfig->getValue(
   334         return $this->productUrlSuffix[
$storeId];
 
call_user_func($callable, $param)
 
const XML_PATH_PRODUCT_URL_SUFFIX
 
generate($products, $fixtureMap)
 
__construct(\Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory, \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory $urlRewriteFactory, \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory, EntityGeneratorFactory $entityGeneratorFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, ProductTemplateGeneratorFactory $productTemplateGeneratorFactory, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, $customTableMap=[])