如何将变量传递给主视图,而不仅仅是控制器的视图。
事实上,我希望在所有视图中共享一段数据。我怎么能在phalcon中做到这一点。 例如,在Laravel中,我可以使用: View::share('variable', $value);
答案 0 :(得分:4)
使用Phalcon,您无需任何其他功能即可将数据传递到布局中。在操作中分配的所有变量都可以自动在布局中使用:
<强>控制器:强>
class IndexController extends \Phalcon\Mvc\Controller
{
public function indexAction()
{
$this->view->bg = 'green';
$this->view->hello = 'world';
}
}
主要布局:
<html>
<body style="background: <?php echo $bg ?>">
<?php echo $this->getContent(); ?>
</body>
</html>
操作视图:
<div>
<?php echo $hello ?>
</div>
您将在绿色背景上看到文字“世界”。
答案 1 :(得分:3)
你可以为此创建一个服务 - 如果这是一个简单的变量,它将是一个过度杀伤但它会起作用。
<?php
// In your bootstrap file
$di->setShared('variable', 41);
?>
然后在任何视图(或控制器或任何DI注射剂)中,它都可以作为$this->variable
。即:
// some view
<?php echo $this->variable; ?>
// or using volt
{{ variable }}
变量当然可以是一个对象。就个人而言,我使用配置对象,即:{{ config.facebook.fbId }}
。
答案 2 :(得分:3)
我认为最好是创建BaseController - 每个人都扩展父控制器。然后使用事件添加共享数据在执行每个操作后进行查看:
<?php
class ControllerBase extends \Phalcon\Mvc\Controller
{
protected $_sharedData = [];
public function initialize()
{
// set shared data for all actions
this->_sharedData = [
'sharedVar' = 1,
'overrideMe' = false
];
}
public function afterExecuteRoute($dispatcher)
{
// Executed after every found action
$this->view->setVar('sharedData', $this->_sharedData);
}
}
在子控制器中
<?php
class IndexController extends ControllerBase
{
public function initialize()
{
parent::initialize();
// override shared variable for all Index actions
$this->_sharedData['overrideMe'] = true;
}
public function homeAction()
{
// add custom variable to shared data
$this->_sharedData['customVar'] = -1;
}
}