【问题标题】:zf3 zend navigation helperzf3 zend 导航助手
【发布时间】:2016-09-08 11:45:13
【问题描述】:

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

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

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

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 传递什么来让它工作?

提前致谢!

【问题讨论】:

    标签: php zend-framework zend-navigation zf3


    【解决方案1】:

    添加到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);
       }
    }
    

    创建导航管理器文件:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多