2014-04-22 14 views
5

Tôi đã cố gắng khai báo một biến toàn cục trong yii là boolean và có giá trị thay đổi trong các hàm hành động khác nhau trong bộ điều khiển. Dưới đây là một ví dụ về những gì tôi đang cố gắng đạt được.khai báo các biến toàn cầu trong yii và sử dụng chúng trong bộ điều khiển

trong .../config/main.php i thêm các mảng sau: 'params' => array ('đăng nhập' => 'true',),

trong .../bảo vệ/controller/testController.php tôi đã thêm đoạn mã sau:

<?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 
} 

Làm thế nào tôi có thể đạt được điều này mà không phải gán giá trị trong mỗi hàm cho biến toàn cầu? Nếu tôi gọi hàm thứ hai, nó ném một lỗi rằng x không được định nghĩa. Kế hoạch của tôi là sử dụng biến toàn cầu theo cách bạn làm trong java, v.d.

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? 
+1

Điều tốt nhất là không sử dụng biến toàn cục. Sử dụng tốt hơn các biến lớp ('$ this-> login') hoặc các biến session (' Yii :: app() -> session ['login'] = true'). – kachar

+0

Khung công tác không thực thi cả 'actionDisplay' và' actionDisplay2' cùng một lúc. Nó chỉ chạy một hành động cho mỗi yêu cầu trong trường hợp bình thường. Bạn có thể thêm mã sẽ được sử dụng lại trong phương thức 'beforeAction ($ action)'. – kachar

+0

Hi Katchar, sau đó bạn có thể chỉ cho tôi một ví dụ ngắn gọn làm sao tôi có thể sử dụng các biến lớp trong bộ điều khiển để đạt được những gì tôi kiến ​​để đạt được như được giải thích ở trên và bên dưới trong các bình luận của tôi? –

Trả lời

4

Bạn có thể sử dụng các biến lớp học để đạt được điều đó, đây là một ví dụ :

<?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; 
    } 
} 
+0

Điều này có tác dụng nếu bạn chỉ muốn hiển thị giá trị ban đầu.Nhưng nếu tôi muốn thay đổi giá trị đăng nhập trong actionDisplay ví dụ $ this-> lang = Yii :: app() -> params ['login'] = "hello"; sau đó nếu tôi echo $ this-> lang trong Display2, nó sẽ hiển thị "Hello". là những gì tôi đang cố gắng hoàn thành –

+0

Bạn phải sử dụng phiên làm việc này, các hành động Display2 và Display2 không chạy trên cùng một yêu cầu của máy chủ nhưng lại khác nhau, bạn phải lưu trữ ở đâu đó giá trị và sau đó thu thập nó trở lại. có thể lưu với 'Yii :: app() -> session ['login'] = 'hello';' và trong 'Display2' thu thập nó bằng' Yii :: app() -> session ['login'] '. yêu cầu máy chủ chỉ chạy một 'action *' fro m lớp. – kachar

+0

Cảm ơn sự giúp đỡ của @Kacher. Giải pháp và đề xuất của bạn đã giúp ích. Giờ nó đã hoạt động. –

0

Khai báo toàn cầu trong index.php.

+0

Nazim, điều này không giải quyết được vấn đề. Xin vui lòng heck bình luận của tôi dưới đây –

2

bạn có thể làm biến hệ thống tĩnh, đây là a guide vào đó

về cơ bản trong config/main.php bạn phải thêm

... 
'params' => array(
    'email'  => '[email protected]', 
    'someOption' => true 
), 
... 

sau đó bạn có thể sử dụng nó như

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

Tinybyte. Những công việc này. Nhưng bây giờ làm thế nào tôi có thể thay đổi giá trị cho email trong một chức năng nằm trong bộ điều khiển để các chức năng khác sử dụng $ email = Yii :: app() -> params ['email'] sẽ không nhận được giá trị mới cho email thay vì giá trị ban đầu được gán trong mảng 'params' trong tệp main.php? Ví dụ: nếu tôi thay đổi $ email = Yii :: app() -> params ['email'] = "[email protected] trong một số chức năng trong bộ điều khiển và tôi muốn các hàm khác sử dụng $ email = Yii :: app() -> params ['email'] để nhận được email mới được chỉ định của [email protected] –

+0

như tôi đã nói, đây là các thông số tĩnh, nếu bạn muốn có thể thay đổi các biến này, bạn cần lưu trữ biến trong cơ sở dữ liệu hoặc bộ nhớ cache hoặc một cái gì đó tương tự, điều này có thể giúp: http: //www.yiiframework.com/extension/settings/ – tinybyte

+0

Có thể thay đổi giá trị mảng "param" trong tập tin cấu hình main.php từ một hàm trong bộ điều khiển không? –

1

Bạn đã viết rằng bạn đã tạo biến số $login = 'false' Vì vậy, 'sai' có một chuỗi. Và nó không phải là chuỗi rỗng để $ login == true. Chỉ cần thay đổi nó để

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

Cập nhật: thiệu về tính năng này, có lẽ bạn nên để tạo ra lớp helper với lĩnh vực tĩnh:

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

Alex, đó là một lỗi đánh máy. $ Login = 'true' trong mảng 'params'. Nhưng đó vẫn không phải là vấn đề. Giống như tôi đã nói, tôi đang cố gắng sử dụng biến toàn cục trong các hàm khác nhau trong khi gán giá trị cho nó một lần giống như được minh họa trong ví dụ thứ hai của tôi tham chiếu đến Java. –

+0

Alex, $ login = 'true' trong mảng 'params'. Nhưng đó vẫn không phải là vấn đề. Làm thế nào tôi có thể thay đổi giá trị cho email trong một chức năng nằm trong bộ điều khiển để các chức năng khác sử dụng $ email = Yii :: app() -> params ['email'] sẽ không nhận được giá trị mới cho email thay vì bản gốc giá trị được gán trong mảng 'params' trong tệp main.php? Ví dụ: nếu tôi thay đổi $ email = Yii :: app() -> params ['email'] = "[email protected] trong một số chức năng trong bộ điều khiển và tôi muốn các hàm khác sử dụng $ email = Yii :: app() -> params ['email'] để nhận được email mới được chỉ định của [email protected] –

+0

@TheGeorgia cập nhật – Alex

Các vấn đề liên quan