2

ZF1 スタイルでいくつかの設定を管理し、現在の環境に関する情報をビューに提供したいと考えています。

/config/application.config.php

return array(
    ...
    'module_listener_options' => array(
        ...
        'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
    )
);

/config/autoload/env.local.php

return array(
    // allowed values: development, staging, live
    'environment' => 'development'
);

一般的なビュー スクリプトでは、コントローラーを介して実行できます。これは、コントローラーが Service Manager にアクセスできるため、必要なすべての構成にアクセスできるためです。

class MyController extends AbstractActionController {

    public function myAction() {
        return new ViewModel(array(
            'currentEnvironment' => $this->getServiceLocator()->get('Config')['environment'],
        ));
    }

}

共通ビューで構成を直接取得することも可能ですか?

レイアウト ビュー スクリプト ( ) で構成にアクセスするにはどうすればよい/module/Application/view/layout/layout.phtmlですか?

4

3 に答える 3

3

(私の実装/解釈)クリスプの提案

構成ビュー ヘルパー

<?php
namespace MyNamespace\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\View\HelperPluginManager as ServiceManager;

class Config extends AbstractHelper {

    protected $serviceManager;

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

    public function __invoke() {
        $config = $this->serviceManager->getServiceLocator()->get('Config');
        return $config;
    }

}

アプリケーションModuleクラス

public function getViewHelperConfig() {
    return array(
        'factories' => array(
            'config' => function($serviceManager) {
                $helper = new \MyNamespace\View\Helper\Config($serviceManager);
                return $helper;
            },
        )
    );
}

レイアウト ビュー スクリプト

// do whatever you want with $this->config()['environment'], e.g.
<?php
if ($this->config()['environment'] == 'live') {
    echo $this->partial('partials/partial-foo.phtml');;
}
?>
于 2013-04-18T14:39:33.590 に答える
0

具体的な目標に対するSam のソリューション ヒントの実装/解釈(開発/ステージング環境内で Web 分析 JS を表示できるようにするため):

DisplayAnalytics ビュー ヘルパー

<?php
namespace MyNamespace\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\View\HelperPluginManager as ServiceManager;

class DisplayAnalytics extends AbstractHelper {

    protected $serviceManager;

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

    public function __invoke() {
        if ($this->serviceManager->getServiceLocator()->get('Config')['environment'] == 'development') {
            $return = $this->view->render('partials/partial-bar.phtml');
        }
        return $return;
    }

}

アプリケーションModuleクラス

public function getViewHelperConfig() {
    return array(
        'factories' => array(
            'displayAnalytics' => function($serviceManager) {
                $helper = new \MyNamespace\View\Helper\DisplayAnalytics($serviceManager);
                return $helper;
            }
        )
    );
}

レイアウト ビュー スクリプト

<?php echo $this->displayAnalytics(); ?>
于 2013-04-18T14:46:04.897 に答える
0

したがって、このソリューションはより柔軟になります。

/config/application.config.php

return array(
    ...
    'module_listener_options' => array(
        ...
        'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
    )
);

/config/autoload/whatever.local.phpおよび/config/autoload/whatever.global.php

return array(
    // allowed values: development, staging, live
    'environment' => 'development'
);

ContentForEnvironment ビュー ヘルパー

<?php
namespace MyNamespace\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\View\HelperPluginManager as ServiceManager;

class ContentForEnvironment extends AbstractHelper {

    protected $serviceManager;

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

    /**
     * Returns rendered partial $partial,
     * IF the current environment IS IN $whiteList AND NOT IN $blackList,
     * ELSE NULL.
     * Usage examples:
     * Partial for every environment (equivalent to echo $this->view->render($partial)):
     *  echo $this->contentForEnvironment('path/to/partial.phtml');
     * Partial for 'live' environment only:
     *  echo $this->contentForEnvironment('path/to/partial.phtml', ['live']);
     * Partial for every environment except 'development':
     *  echo $this->contentForEnvironment('path/to/partial.phtml', [], ['development', 'staging']);
     * @param string $partial
     * @param array $whiteList
     * @param array $blackList optional
     * @return string rendered partial $partial or NULL.
     */
    public function __invoke($partial, array $whiteList, array $blackList = []) {
        $currentEnvironment = $this->serviceManager->getServiceLocator()->get('Config')['environment'];
        $content = null;
        if (!empty($whiteList)) {
            $content = in_array($currentEnvironment, $whiteList) && !in_array($currentEnvironment, $blackList)
                ? $this->view->render($partial)
                : null
            ;
        } else {
            $content = !in_array($currentEnvironment, $blackList)
                ? $this->view->render($partial)
                : null
            ;
        }
        return $content;
    }

}

アプリケーションModuleクラス

public function getViewHelperConfig() {
    return array(
        'factories' => array(
            'contentForEnvironment' => function($serviceManager) {
                $helper = new \MyNamespace\View\Helper\ContentForEnvironment($serviceManager);
                return $helper;
            }
        )
    );
}

レイアウト ビュー スクリプト

<?php echo $this->contentForEnvironment('path/to/partial.phtml', [], ['development', 'staging']); ?>
于 2013-04-18T16:37:52.537 に答える