ZF2 - 将控制器名称获取到布局/视图中


ZF2 - Get controller name into layout/views

我知道使用 ZF1 您将使用自定义视图助手检索模块/控制器名称,该助手将获取单例 frontController 对象并在那里获取名称。

使用 ZF2 因为他们取消了框架的许多单例性质并引入了 DI,我为此模块中的所有控制器指定了别名......我可以想象我会通过访问 DI 或将当前名称注入布局来获得它。

任何人都知道你会怎么做。我想有一百种不同的方法,但是在嗅了几个小时的代码之后,我真的无法弄清楚它现在意味着如何完成。

我想要控制器名称的原因是将其作为特定控制器样式的类添加到正文中。

谢谢,多姆

ZF2 出局了,骨架也出来了。这是在骨架之上添加的,所以它应该是你最好的例子:

模块内部.php

public function onBootstrap($e)
{
    $e->getApplication()->getServiceManager()->get('translator');
    $e->getApplication()->getServiceManager()->get('viewhelpermanager')->setFactory('controllerName', function($sm) use ($e) {
        $viewHelper = new View'Helper'ControllerName($e->getRouteMatch());
        return $viewHelper;
    });
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

实际的视图助手:

// Application/View/Helper/ControllerName.php
namespace Application'View'Helper;
use Zend'View'Helper'AbstractHelper;
class ControllerName extends AbstractHelper
{
protected $routeMatch;
    public function __construct($routeMatch)
    {
        $this->routeMatch = $routeMatch;
    }
    public function __invoke()
    {
        if ($this->routeMatch) {
            $controller = $this->routeMatch->getParam('controller', 'index');
            return $controller;
        }
    }
}

在您的任何视图/布局中

echo $this->controllerName()
这将是

我使用 zf2 beta5 的解决方案

模块/

我的模块/模块.php

namespace MyModule;
use Zend'Mvc'ModuleRouteListener;
use MyModule'View'Helper as MyViewHelper;
class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $serviceManager = $app->getServiceManager();
        $serviceManager->get('viewhelpermanager')->setFactory('myviewalias', function($sm) use ($e) {
            return new MyViewHelper($e->getRouteMatch());
        });
    }
    ...
}

module/MyModule/src/MyModule/View/Helper.php

namespace MyModule'View;
use Zend'View'Helper'AbstractHelper;
class Helper extends AbstractHelper
{
    protected $route;
    public function __construct($route)
    {
        $this->route = $route;
    }
    public function echoController()
    {
        $controller = $this->route->getParam('controller', 'index');
        echo $controller;
    }
}

在任何视图文件中

$this->myviewalias()->echoController();

而不是在Module.php中扩展onBootStrap(),您可以使用getViewHelperConfig()(也在Module.php中(。实际的帮助程序保持不变,但您可以获得以下代码来创建它:

public function getViewHelperConfig()
{
   return array(
         'factories' => array(
            'ControllerName' => function ($sm) {
               $match = $sm->getServiceLocator()->get('application')->getMvcEvent()->getRouteMatch();
               $viewHelper = new 'Application'View'Helper'ControllerName($match);
               return $viewHelper;
            },
         ),
   );
}

这里的短代码:

$this->getHelperPluginManager()->getServiceLocator()->get('application')->getMvcEvent()->getRouteMatch()->getParam('action', 'index');
$controller = $this->getHelperPluginManager()->getServiceLocator()->get('application')->getMvcEvent()->getRouteMatch()->getParam('controller', 'index');
$controller = array_pop(explode(''', $controller));
我想

在导航菜单中访问当前的模块/控制器/路由名称部分,除了实现自定义视图助手并访问它之外别无他法,我想出了以下内容,我在这里发布它。

<?php
namespace Application'View'Helper;
use Zend'View'Helper'AbstractHelper;
/**
 * View Helper to return current module, controller & action name.
 */
class CurrentRequest extends AbstractHelper
{
    /**
     * Current Request parameters
     *
     * @access protected
     * @var array
     */
    protected $params;
    /**
     * Current module name.
     *
     * @access protected
     * @var string
     */
    protected $moduleName;
    /**
     * Current controller name.
     *
     * @access protected
     * @var string
     */
    protected $controllerName;
    /**
     * Current action name.
     *
     * @access protected
     * @var string
     */
    protected $actionName;
    /**
     * Current route name.
     *
     * @access protected
     * @var string
     */
    protected $routeName;
    /**
     * Parse request and substitute values in corresponding properties.
     */
    public function __invoke()
    {
        $this->params = $this->initialize();
        return $this;
    }
    /**
     * Initialize and extract parameters from current request.
     *
     * @access protected
     * @return $params array
     */
    protected function initialize()
    {
        $sm = $this->getView()->getHelperPluginManager()->getServiceLocator();
        $router = $sm->get('router');
        $request = $sm->get('request');
        $matchedRoute = $router->match($request);
        $params = $matchedRoute->getParams();
        /**
         * Controller are defined in two patterns.
         * 1. With Namespace
         * 2. Without Namespace.
         * Concatenate Namespace for controller without it.
         */
        $this->controllerName = !strpos($params['controller'], '''') ?
            $params['__NAMESPACE__'].''''.$params['controller'] :
            $params['controller'];
        $this->actionName = $params['action'];
        /**
         * Extract Module name from current controller name.
         * First camel cased character are assumed to be module name.
         */
        $this->moduleName = substr($this->controllerName, 0, strpos($this->controllerName, ''''));
        $this->routeName = $matchedRoute->getMatchedRouteName();
        return $params;
    }
    /**
     * Return module, controller, action or route name.
     *
     * @access public
     * @return $result string.
     */
    public function get($type)
    {
        $type = strtolower($type);
        $result = false;
        switch ($type) {
            case 'module':
                    $result = $this->moduleName;
                break;
            case 'controller':
                    $result = $this->controllerName;
                break;
            case 'action':
                    $result = $this->actionName;
                break;
            case 'route':
                    $result = $this->routeName;
                break;
        }
        return $result;
    }
}

为了访问布局/视图中的值,这是我的做法。

1. $this->currentRequest()->get('module');
2. $this->currentRequest()->get('controller');
3. $this->currentRequest()->get('action');
4. $this->currentRequest()->get('route');

希望这对某人有所帮助。

在 zf2 beta4 中,它是这样制作的:

public function init(ModuleManager $moduleManager)
{
    $sharedEvents = $moduleManager->events()->getSharedManager();
    $sharedEvents->attach('bootstrap', 'bootstrap', array($this, 'onBootstrap'));
}
public function onBootstrap($e)
{
    $app     = $e->getParam('application');
    // some your code here
    $app->events()->attach('route', array($this, 'onRouteFinish'), -100);
}
public function onRouteFinish($e)
{
     $matches    = $e->getRouteMatch();
     $controller = $matches->getParam('controller');
     var_dump($controller);die();
}

我为此目的创建了CurrentRoute View Helper。

安装它:

composer require tasmaniski/zf2-current-route

在config/application.config.php中注册模块:

'modules' => array(
    '...',
    'CurrentRoute'
),

在任何视图/布局文件中使用它:

$this->currentRoute()->getController();  // return current controller name
$this->currentRoute()->getAction();      // return current action name
$this->currentRoute()->getModule();      // return current module name
$this->currentRoute()->getRoute();       // return current route name

您可以查看完整的文档和代码 https://github.com/tasmaniski/zf2-current-route

$this->getHelperPluginManager()->getServiceLocator()->get('application')
     ->getMvcEvent()->getRouteMatch()->getParam('action', 'index');
$controller = $this->getHelperPluginManager()->getServiceLocator()
                   ->get('application')->getMvcEvent()->getRouteMatch()
                   ->getParam('controller', 'index');

$controller = explode('''', $controller);
print_r(array_pop($controller));

在 Zend-3 框架中的控制器中获取控制器/操作名称

private function getControllerActionName()
{
    $currentController = $this->getEvent()->getRouteMatch()->getParam('controller', 'index');
    $explode_controller = explode('''', $currentController);
    $currentController = strtolower(array_pop($explode_controller));
    $currentController = str_replace('controller', '', $currentController);
    $currentAction = strtolower($this->getEvent()->getRouteMatch()->getParam('action', 'index'));
    return array(
            'controller' => $currentController,
            'action' => $currentAction,
        );
}

它对我有用。我希望,这也会对你有所帮助。谢谢你问这个问题。

最简单的方法:

$request = Zend_Controller_Front::getInstance()->getRequest();
$this->controllerName = $request->getControllerName();
$this->actionName = $request->getActionName();