我想在ZF3应用程序中从SQL数据创建导航菜单;为了DRY的利益,我想尝试使用常用函数来查询数据。基于@Crisp对similar question的回答,如果我们想要从Blog tutorial中所示的模块创建动态菜单并使用ZendDbSqlRepository
中的函数,那么导航工厂似乎应该看起来像这样:
namespace Blog\Factory;
use Zend\Navigation\Service\AbstractNavigationFactory;
use Zend\ServiceManager\ServiceLocatorInterface;
use Blog\Model\ZendDbSqlRepository;
class BlogNavigationFactory extends AbstractNavigationFactory
{
/**
* @param ServiceLocatorInterface $serviceLocator
* @return array
* @throws \Zend\Navigation\Exception\InvalidArgumentException
*/
protected function getPages(ServiceLocatorInterface $serviceLocator)
{
if (null === $this->pages) {
$application = $serviceLocator->get('Application');
$routeMatch = $application->getMvcEvent()->getRouteMatch();
$router = $application->getMvcEvent()->getRouter();
// get your pages from wherever...
$postRepository = new ZendDbSqlRepository();
$pages = $postRepository->findAllPosts();
$this->pages = $this->injectComponents($pages, $routeMatch, $router);
}
return $this->pages;
}
public function getName()
{
// this isn't used if fetching from db, it's just here to keep the abstract factory happy
return 'cms';
}
}
工厂将像这样添加到服务管理器中:
// In module/Blog/config/module.config.php:
return [
'service_manager' => [
'aliases' => [ /* ... */ ],
'factories' => [
Model\PostRepository::class => InvokableFactory::class,
Model\ZendDbSqlRepository::class => Factory\ZendDbSqlRepositoryFactory::class,
Model\PostCommand::class => InvokableFactory::class,
Model\ZendDbSqlCommand::class => Factory\ZendDbSqlCommandFactory::class,
'BlogNavigation' => 'Blog\Factory\BlogNavigationFactory',
],
],
'controllers' => [ /* ... */ ],
'router' => [ /* ... */ ],
'view_manager' => [ /* ... */ ],
];
并在导航视图助手中使用,如下所示:
<?php echo $this->navigation()->menu('BlogNavigation'); ?>
这不起作用,因为Blog教程通过导航工厂需要以某种方式引用的工厂和接口传递数据。
如何编写导航工厂以使用findAllPosts
中的ZendDbSqlRepository
功能?
答案 0 :(得分:0)
getPages()
方法接收ServiceManager
实例(实现ServiceLocatorInterface
),您可以像这样使用它来获取您的存储库
/**
* @param ServiceLocatorInterface $serviceLocator
* @return array
* @throws \Zend\Navigation\Exception\InvalidArgumentException
*/
protected function getPages(ServiceLocatorInterface $serviceLocator)
{
if (null === $this->pages) {
$application = $serviceLocator->get('Application');
$routeMatch = $application->getMvcEvent()->getRouteMatch();
$router = $application->getMvcEvent()->getRouter();
// get your repository from the service locator
$postRepository = $serviceLocator->get(\Blog\Model\ZendDbSqlRepository::class);
// get your pages from repository
$pages = $postRepository->findAllPosts();
$this->pages = $this->injectComponents($pages, $routeMatch, $router);
}
return $this->pages;
}