Хорошо, я нашел ответ на этот вопрос.Решение состоит в том, чтобы использовать приложение / эмулятор, доступный в Magento.Идея состоит в том, чтобы запустить эмуляцию перед выполнением требуемого извлечения URL из Frontend Catgory и закрыть эмуляцию, когда она будет завершена.
Вот ссылки на то, как ее реализовать Эмуляция приложения .Не знал, что так просто решить проблему.Ниже мой код выглядит следующим образом:
class MenuCategory extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface
{
public function getStoreCategories($storeManager, $emulator)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$emulator->startEnvironmentEmulation(null, \Magento\Framework\App\Area::AREA_FRONTEND, true);
$categoryFactory = $objectManager->create('Magento\Catalog\Model\ResourceModel\Category\CollectionFactory');
$categories = $categoryFactory->create()
->addAttributeToSelect('*')
->setStore($storeManager->getStore())
->addAttributeToFilter('level', array('eq' => 2))
->addIsActiveFilter()
->addAttributeToSort('position', 'asc');
foreach ($categories as $category) {
echo $category->getUrl() . " - " . $category->getUrl() . "\n";
}
$emulator->stopEnvironmentEmulation();
return $content;
}
}
Итак, идея состоит в том, чтобы создать экземпляр эмулятора и заставить magento думать, что вы собираетесь изменить или выполнить то же, что и во внешнем интерфейсе, поэтому код \Magento \ Framework \ App \ Area :: AREA_FRONTEND когда вы закроете эмуляцию среды, она вернется к тому, что было, будь вы в adminhtml или во внешнем интерфейсе