6

我有基于 Nette 框架的小型应用程序。

我已经创建了constants.neon文件并将其添加到容器中。将有一些数据应该可以从演示者、模型、表格等处获得。

如何访问 中的值constants.neon

我知道有一种方法(new \Nette\Neon\Neon())->decode([NEON_FILE_PATH]),但我不认为这是right way. 我怀疑在使用这些配置文件addConfig(...)中的bootstrap.php所有数据后,应该在整个系统中都可用。

<?php
// bootstrap.php
require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;

$configurator->setDebugMode(true); // enable for your remote IP
$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
    ->addDirectory(__DIR__)
    ->addDirectory(__DIR__ . '/../vendor/phpoffice/phpexcel')
    ->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');
$configurator->addConfig(__DIR__ . '/config/constants.neon');

$container = $configurator->createContainer();

return $container;

我的constants.neon文件:

constants:
  DP_OPT = 'DP'
  PP_OPT = 'PP'
  DV_OPT = 'DV'
  ZM_OPT = 'ZM'
  TP_OPT = 'TP'

谢谢

更新#1

发现我使用了错误的.neon文件格式。

constants:
  DP_OPT: DP
  PP_OPT: PP
  DV_OPT: DV
  ZM_OPT: ZM
  TP_OPT: TP
4

2 回答 2

9

为了完成 Jan 的回答,以下是您将配置参数传递给模型的方式。

让您的模型类期望它作为构造函数参数:

namespace App\XXX;
class MyModel
{
  /** @var array */
  private $constants;

  public function __construct(array $constants)
  {
    $this->constants = $constants;
  }

然后在配置(Neon)中将您的模型注册为服务:

services:
    - App\XXX\MyModel(%constants%)

当您将该模型注入演示者时:

class DefaultPresenter extends BasePresenter
{
  /** @var App\XXX\MyModel @inject */
  public $myModel;

实例化时,它将自动接收您的“常量”。

于 2016-06-27T09:40:30.013 回答
7

如果您将常量存储parameters在 neon 文件中的数组中,您将能够从演示者的上下文中访问它,如下所示:

// $this is instance of Nette\Application\UI\Presenter
$this->context->parameters['constants']

霓虹灯文件:

parameters:
    constants:
        DP_OPT: DP
        PP_OPT: PP
        DV_OPT: DV
        ZM_OPT: ZM
        TP_OPT: TP

请注意,这可能不是推荐的方法。有关详细信息,请参阅如何将Presenter 用作服务

于 2016-06-20T16:08:41.777 回答