16

ZF1では、シングルトンのfrontControllerオブジェクトを取得してそこに名前を取得するカスタムViewHelpersを使用してモジュール/コントローラー名を取得することを知っています。

フレームワークのシングルトンの性質を大幅に廃止し、このモジュール内のすべてのコントローラーにエイリアスを指定したDIを導入したため、ZF2を使用しています... DIにアクセスするか、おそらく注入することで取得できると思います。レイアウトに現在の名前。

誰もがあなたがそれをどのように行うかについての考えを持っていました。100通りの方法があると思いますが、コードを数時間スニッフィングした後、それが今どのように行われるのかを実際に理解することはできません。

コントローラー名が欲しかったのは、特定のコントローラースタイリングのクラスとして本体に追加するためです。

ありがとう、ドム

4

9 に答える 9

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

実際の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;
        }
    }
}

ビュー/レイアウトの内部

echo $this->controllerName()
于 2012-10-25T19:38:38.183 に答える
7

これは私がzf2beta5で作業するようになったソリューションになります

module / 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());
        });
    }
    ...
}

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();
于 2012-07-27T11:29:47.857 に答える
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;
            },
         ),
   );
}
于 2012-12-10T15:50:00.670 に答える
3

ここにショートコード:

$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));
于 2014-04-17T08:23:15.667 に答える
2

ナビゲーションメニューの現在のモジュール/コントローラー/ルート名に部分的にアクセスしたかったのですが、カスタムビューヘルパーを実装してアクセスする以外に方法はありませんでした。次のことを思いつきました。ここに投稿しています。

<?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');

これが誰かを助けることを願っています。

于 2015-01-17T21:00:54.000 に答える
1

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();
}
于 2012-05-25T06:36:34.663 に答える
1

この目的のためにCurrentRouteViewHelperを作成しました。

それをインストールします:

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

于 2015-11-11T15:26:32.673 に答える
0
$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));
于 2016-02-09T11:33:44.787 に答える
0

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,
        );
}

わたしにはできる。これもお役に立てば幸いです。この質問をしていただきありがとうございます。

于 2019-11-23T11:34:39.820 に答える