gpt4 book ai didi

php - zf3 zend 导航助手

转载 作者:搜寻专家 更新时间:2023-10-31 21:24:22 26 4
gpt4 key购买 nike

我正在尝试从 ZF3 中的容器实现我的 zend 导航。我已经通过这个快速入门教程成功创建了导航,该教程直接在 config/autoload/global.phpconfig/module.config.php 文件中介绍了导航:

https://docs.zendframework.com/zend-navigation/quick-start/

但现在我需要使用“示例中使用的导航设置”部分使其与助手一起工作,以允许从 Controller 修改导航:

https://docs.zendframework.com/zend-navigation/helpers/intro/

这是我的Module.php

namespace Application;

use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\View\HelperPluginManager;

class Module implements ConfigProviderInterface
{
public function getViewHelperConfig()
{
return [
'factories' => [
// This will overwrite the native navigation helper
'navigation' => function(HelperPluginManager $pm) {
// Get an instance of the proxy helper
$navigation = $pm->get('Zend\View\Helper\Navigation');
// Return the new navigation helper instance
return $navigation;
}
]
];
}

public function getControllerConfig()
{
return [
'factories' => [
$this->getViewHelperConfig()
);
},
],
];
}
}

这是我的 IndexController.php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Navigation\Navigation;
use Zend\Navigation\Page\AbstractPage;

class IndexController extends AbstractActionController
{

private $navigationHelper;

public function __construct(
$navigationHelper
){
$this->navigationHelper = $navigationHelper;
}

public function indexAction()
{

$container = new Navigation();
$container->addPage(AbstractPage::factory([
'uri' => 'http://www.example.com/',
]));

$this->navigationHelper->plugin('navigation')->setContainer($container);

return new ViewModel([
]);
}


}

但随后出现以下错误:

Fatal error: Call to a member function plugin() on array in /var/www/html/zf3/module/Application/src/Controller/IndexController.php on line 50

在教程中,他们使用以下语句:

// Store the container in the proxy helper:
$view->plugin('navigation')->setContainer($container);

// ...or simply:
$view->navigation($container);

但我不知道这个 $view 是什么,所以我假设是来自 Module.php$navigation。问题是,因为是一个数组,它会抛出错误。问题是:

  • 我做错了什么?
  • 教程的这个 $view 来自哪里?
  • 我应该从我的 Module.php 传递什么来让它工作?

提前致谢!

最佳答案

加入module.config.php

'service_manager' => [  
'factories' => [
Service\NavManager::class => Service\Factory\NavManagerFactory::class,
],
],

'view_helpers' => [
'factories' => [
View\Helper\Menu::class => View\Helper\Factory\MenuFactory::class,
],
'aliases' => [
'mainMenu' => View\Helper\Menu::class,
],
],

在服务目录中创建工厂:

namespace Application\Service\Factory;

use Interop\Container\ContainerInterface;
use Application\Service\NavManager;


class NavManagerFactory {
/**
* This method creates the NavManager service and returns its instance.
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
$authService = $container->get(\Zend\Authentication\AuthenticationService::class);
$viewHelperManager = $container->get('ViewHelperManager');
$urlHelper = $viewHelperManager->get('url');

return new NavManager($authService, $urlHelper);
}
}

创建 NavManager 文件:

namespace Application\Service;

class NavManager {
/**
* Auth service.
* @var Zend\Authentication\Authentication
*/
private $authService;

/**
* Url view helper.
* @var Zend\View\Helper\Url
*/
private $urlHelper;

/**
* Constructs the service.
*/
public function __construct($authService, $urlHelper) {
$this->authService = $authService;
$this->urlHelper = $urlHelper;
}

/**
* Menu render based on user role
*
* @return array
*/
public function getMenuItems() {
$navItem = array();
$url = $this->urlHelper;
$items = [];

$items[] = [
'label' => 'Dashboard',
'icon' => 'dashboard',
'link' => $url('home'),
'route' => ['home'],
];

$items[] = [
'label' => 'About Us',
'icon' => 'business',
'link' => $url('about', ['action'=>'index']),
'route' => ['about'],
];

$items[] = [
'label' => 'Service',
'icon' => 'service',
'link' => $url('service', ['action'=>'index']),
'route' => ['service'],
];

return $items;
}

创建助手工厂

namespace Application\View\Helper\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\View\Helper\Menu;
use Application\Service\NavManager;

/**
* This is the factory for Menu view helper. Its purpose is to
instantiate the helper and init menu items. */
class MenuFactory implements FactoryInterface {

public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
$navManager = $container->get(NavManager::class);
// Get menu items.
$items = $navManager->getMenuItems();
// Instantiate the helper.
return new Menu($items);
}

}

创建助手:

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

/**
* This view helper class displays a menu bar.
*/
class Menu extends AbstractHelper {
/**
* Menu items array.
* @var array
*/
protected $items = [];

/**
* Active item's ID.
* @var string
*/
protected $activeItemId = '';

/**
* Constructor.
* @param array $items Menu items.
*/
public function __construct($items=[]) {
$this->items = $items;
}

/**
* Sets menu items.
* @param array $items Menu items.
*/
public function setItems($items) {
$this->items = $items;
}

/**
* Sets ID of the active items.
* @param string $activeItemId
*/
public function setActiveItemId($activeItemId) {
$this->activeItemId = $activeItemId;
}

/**
* Renders the menu.
* @return string HTML code of the menu.
*/
public function render() {
if (count($this->items)==0) {
return ''; // Do nothing if there are no items.
}

// Render items
foreach ($this->items as $item) {
$result .= $this->renderItem($item);
}

return $result;

}
protected function renderItem($item) {
// here you can integrate with HTML
return $item;
}
}

添加完以上代码后,只需在布局文件中添加以下代码即可:

echo $this->mainMenu()->render();

关于php - zf3 zend 导航助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com