如何从Nette的neon文件中获取值?

tsg*_*tsg 6 php nette

我有基于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;
Run Code Online (Sandbox Code Playgroud)

我的constants.neon档案:

constants:
  DP_OPT = 'DP'
  PP_OPT = 'PP'
  DV_OPT = 'DV'
  ZM_OPT = 'ZM'
  TP_OPT = 'TP'
Run Code Online (Sandbox Code Playgroud)

谢谢

更新#1

弄清楚我使用了错误的.neon文件格式.

constants:
  DP_OPT: DP
  PP_OPT: PP
  DV_OPT: DV
  ZM_OPT: ZM
  TP_OPT: TP
Run Code Online (Sandbox Code Playgroud)

Jan*_*nar 7

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

// $this is instance of Nette\Application\UI\Presenter
$this->context->parameters['constants']
Run Code Online (Sandbox Code Playgroud)

霓虹文件:

parameters:
    constants:
        DP_OPT: DP
        PP_OPT: PP
        DV_OPT: DV
        ZM_OPT: ZM
        TP_OPT: TP
Run Code Online (Sandbox Code Playgroud)

请注意,这可能不是推荐的方法.有关更多信息,请参阅如何将演示者用作服务.


Pet*_*vel 7

要完成Jan的答案,以下是将配置参数传递给模型的方法.

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

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

  public function __construct(array $constants)
  {
    $this->constants = $constants;
  }
Run Code Online (Sandbox Code Playgroud)

然后在config(Neon)中将模型注册为服务:

services:
    - App\XXX\MyModel(%constants%)
Run Code Online (Sandbox Code Playgroud)

将该模型注入演示者时:

class DefaultPresenter extends BasePresenter
{
  /** @var App\XXX\MyModel @inject */
  public $myModel;
Run Code Online (Sandbox Code Playgroud)

它会在实时化时自动收到你的'常数'.