【问题标题】:declaring global variables in yii and use them in controller在 yii 中声明全局变量并在控制器中使用它们
【发布时间】:2014-06-07 04:30:01
【问题描述】:

我一直在尝试在 yii 中声明一个布尔值的全局变量,并在控制器中的不同操作函数中更改其值。下面是我想要实现的一个示例。

在 .../config/main.php 我添加了以下数组: 'params'=>array('login' => 'true',),

在 .../protected/controller/testController.php 我添加了以下代码:

<?php
    class ApiController extends Controller{
public $x = '';

public function actionDisplay(){
$x=Yii::app()->params['login']; //so x now has the value "true"
echo $x; //this display "true" when i run this controller on this function
}

public function actionDisplay2(){
global $x;
    echo $x; //this for some reason does not contain the value true even if x is global
}

如何在不必将每个函数中的值分配给全局变量的情况下实现这一点?如果我调用第二个函数,它会引发 x 未定义的错误。我的计划是像在 java 中那样使用全局变量,例如

public class Display{

public String x = " ";

public static void Display(){
x = "True"; //global variable x is assigned the String value "True"
}

public static void DisplayTwo(){
System.out.print("Value of x is: " + x); //this will print "Value of x is: True"
}

....

}
So basically, this is how i want to use the global variable in Yii framework. Any suggestions how to achieve this please?

【问题讨论】:

  • 最好的办法是根本不使用全局变量。最好使用类变量 ($this-&gt;login) 或会话变量 (Yii::app()-&gt;session['login'] = true)。
  • 框架没有同时执行actionDisplayactionDisplay2。在正常情况下,每个请求只运行一个操作。您可以在beforeAction($action) 方法中添加应该重用的代码。
  • 嗨,Katchar,你能告诉我一个简短的例子吗?我如何在控制器中使用类变量来实现我想实现的目标,如上面和下面在我的 cmets 中所解释的那样?

标签: php function yii boolean global-variables


【解决方案1】:

您可以使用类变量来实现,这是一个示例:

<?php

class ApiController extends Controller
{
    public $lang = 'en';

    public function beforeAction($action)
    {
        if(Yii::app()->session->contains('lang'))
            $this->lang = Yii::app()->session['lang'];
        return parent::beforeAction($action);
    }

    public function afterAction($action,$params)
    {
        Yii::app()->session['lang'] = $this->lang;
        return parent::afterAction($action,$params);
    }

    public function actionDisplay(){
        echo 'In Display action';
        $this->lang = 'test'
        echo $this->lang;
    }

    public function actionDisplay2(){
        echo 'In Display2 action';
        echo $this->lang;
    }
}

【讨论】:

  • 如果您只想显示原始值,则此方法有效。但是如果我想在 actionDisplay 中更改 login 的值,例如 $this->lang = Yii::app()->params['login'] = "hello";然后,如果我在 Display2 中回显 $this->lang,它应该显示“Hello”。这就是我想要完成的。
  • 你必须使用会话。 Display 和 Display2 操作不会在相同的服务器请求上运行,而是在不同的服务器请求上运行。您必须将值存储在某个地方,然后将其收集回来。在Display 中,您可以使用Yii::app()-&gt;session['login'] = 'hello'; 保存并在Display2 中通过Yii::app()-&gt;session['login'] 收集它。一个服务器请求只运行该类中的一个action*
  • 感谢@Kacher 的帮助。您的解决方案和建议有所帮助。现在可以使用了。
  • 您不必使用会话变量。这个 ApiController 扩展了 Controller。然后你设置你的 SiteController(或任何东西 - 包含你的相关操作的那个)来扩展 ApiController 而不是 Controller,这使得 ApiController 的公共变量在 SiteController 中读/写。
【解决方案2】:

你写道你创建了变量$login = 'false' 所以'false'有一个字符串。它不是空字符串,所以 $login == true。改成

'params'=>array('login' => false),

更新:关于这个特性,也许你应该用静态字段创建帮助类:

class SomeHelper
{
     //that field can be changed and used in any place
     public $static $login = false;
}

【讨论】:

  • Alex,这是一个错字。$login = 'true' 在 'params' 数组中。但这仍然不是问题。就像我说的那样,我试图在不同的函数中使用全局变量,同时将值分配给它一次,就像我在引用 Java 的第二个示例中演示的那样。
  • Alex, $login = 'true' 在 'params' 数组中。但这仍然不是问题。如何在位于控制器中的函数中更改电子邮件的值,以便使用 $email = Yii::app()->params['email'] 的其他函数不会获得电子邮件的新值而不是原始值在 main.php 文件的“参数”数组中分配的值?例如,如果我在控制器的某个函数中更改 $email = Yii::app()->params['email']="johndoe@example.com,并且我想要使用 $email = Yii::app 的其他函数()->params['email'] 现在获取新分配的电子邮件 johndoe@example.com。
【解决方案3】:

你可以制作静态系统变量,这里是a guide

基本上在config/main.php你必须添加

...
'params' => array(
    'email'      => 'steve@unixwiz.net',
    'someOption' => true
),
...

然后你可以像使用它一样

$email = Yii::app()->params['email'];

【讨论】:

  • 小字节。这行得通。但是现在我如何在位于控制器中的函数中更改电子邮件的值,以便使用 $email = Yii::app()->params['email'] 的其他函数不会获得电子邮件的新值,而不是main.php 文件中“params”数组中分配的原始值?例如,如果我在控制器的某个函数中更改 $email = Yii::app()->params['email']="johndoe@example.com,并且我想要使用 $email = Yii::app 的其他函数()->params['email'] 现在获取新分配的电子邮件 johndoe@example.com。
  • 就像我说的,这些是静态参数,如果你想能够改变这些变量,你需要将该变量存储在数据库或缓存或类似的东西中,这可能会有所帮助:yiiframework.com/extension/settings
  • 是否可以通过控制器中的函数更改 config main.php 文件中的“param”数组值?
【解决方案4】:

在 index.php 中声明全局。

【讨论】:

  • 纳齐姆,这并不能解决问题。请在下面查看我的评论
猜你喜欢
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2019-02-04
  • 2020-10-10
  • 1970-01-01
  • 2014-08-02
相关资源
最近更新 更多