ZF2 - 将控制器名称放入布局/视图中

Int*_*lix 16 php zend-framework zend-framework-mvc zend-framework2

我知道使用ZF1,您将使用自定义View Helpers检索模块/控制器名称,这将获得单例frontController对象并获取其名称.

使用ZF2,因为他们已经废除了很多框架的单独性质,并引入了DI,我为这个模块中的所有控制器指定了别名...我可以想象我会通过访问DI或者注入当前名称进入布局.

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

我想要控制器名称的原因是将它作为特定控制器样式的类添加到主体.

谢谢,Dom

Int*_*lix 15

ZF2已经出局,骨架也是如此.这是在骨架上添加,所以它应该是你最好的例子:

在Module.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);
}
Run Code Online (Sandbox Code Playgroud)

实际的ViewHelper:

// 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的任何视图/布局内

echo $this->controllerName()
Run Code Online (Sandbox Code Playgroud)


Bor*_*rje 7

这将是我使用zf2 beta5的解决方案

模块/ MyModule的/ Module.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());
        });
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

模块/ MyModule的/ src目录/ MyModule中/查看/ 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在任何视图文件中

$this->myviewalias()->echoController();
Run Code Online (Sandbox Code Playgroud)

  • 我相信你可以将echoController()更改为__invoke()并更改echo $ controller; 返回$ controller (2认同)

dst*_*stj 5

而不是延长onBootStrap()Module.php,可以使用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;
            },
         ),
   );
}
Run Code Online (Sandbox Code Playgroud)