yii模块下面的组件

模块的定义就不写了,直接进入主题看目录和文件:

application/modules/client/controllers/UserController.php

 1 <?php
 2 
 3 class UserController extends ClientController
 4 {
 5     public function init()
 6     {
 7         parent::init();
 8     }
 9 
10     public function actionIndex()
11     {
12         $userid = $this->user->userid;
13         $test = $this->user->test;
14         $test1 = $this->user->test();
15         exit('xx');
16     }

$this->user找不到,它会去ClientController中找

application/modules/client/components/ClientController.php

 1 <?php
 2 class ClientController extends CController
 3 { 
 4     public function init()
 5     {
 6         header('Content-type:text/html;charset=utf-8');
 7         Yii::import('ext.functions', true); //加载公共函数
 8         //$this->getUserId();   
 9     }
10     public function __get($name)
11     {
12         return Yii::app()->client->$name;
13     }

找到__get($name)方法,返回的是全局的client组件

application/config/main.php

 1 <?php
 2 
 3 ……
 4 
 5 'components'=>array(
 6             'client' => array(
 7                    'class' => 'application.modules.client.components.Client',
 8             ),
 9 ……
10 ),

配置好client组件,然后指定到

application/modules/client/components/Client.php
  1 <?php
  2 
  3 use Yii;
  4 
  5 class Client extends ApiComponent
  6 {
  7     
  8     private static $_params;
  9     
 10     private $_components;
 11     
 12     private $_propertys;
 13     
 14     private static $instance;
 15     
 16     public function __construct()
 17     {
 18         self::$instance =& $this;
 19     }
 20     
 21     public static function &getInstance()
 22     {
 23         return self::$instance;
 24     }
 25     
 26     public function init()
 27     {
 28 
 29     }
 30     
 31     
 32     /**
 33      * 是否是组件
 34      * 
 35      * @param string $id
 36      * @return bool
 37      */
 38     public function hasComponent($id)
 39     {
 40         return isset(self::$_coreComponents[$id]);
 41     }
 42     
 43     /**
 44      * 获取组件
 45      * @param string $id
 46      */
 47     public function getComponent($id)
 48     {
 49         if (isset($this->_components[$id]))
 50         {
 51             return $this->_components[$id];
 52         }
 53         
 54         if (isset(self::$_coreComponents[$id]))
 55         {
 56             $component = Yii::createComponent(self::$_coreComponents[$id]);
 57             $component->owner = $this;
 58             $component->init();
 59             $this->_components[$id] = $component;
 60             return $component;
 61         }
 62     }
 63     
 64     /**
 65      * 
 66      * @param integer $id
 67      */
 68     public function HasProperty($id)
 69     {
 70         return isset(self::$_propertysMap[$id]);
 71     }
 72     
 73     /**
 74      * 获取属性
 75      * @param string $id
 76      */
 77     public function getProperty($id)
 78     {
 79         if (isset($this->_propertys[$id]))
 80         {
 81             return $this->_propertys[$id];
 82         }
 83     
 84         if (isset(self::$_propertysMap[$id]))
 85         {
 86             list($component, $key) = explode('.', self::$_propertysMap[$id]);
 87             $this->_propertys[$id] = $this->$component->$key;
 88         }
 89         return $this->_propertys[$id];
 90     }
 91     
 92     /**
 93      * 设置属性
 94      */
 95     public function setProperty($id, $value)
 96     {
 97         if (isset(self::$_propertysMap[$id]))
 98         {
 99             list($component, $key) = explode('.', self::$_propertysMap[$id]);
100             $this->$component->$key = $value;
101         }
102     }
103     
104     /**
105      * 清除缓存
106      * @param string $id
107      */
108     public function clearProperty($id)
109     {
110         unset($this->_propertys[$id]);
111     }
112     
113     /**
114      * (non-PHPdoc)
115      * @see companycomponents.CompanyComponent::__get()
116      */
117     public function __get($name)
118     {
119         //组件
120         if ($this->hasComponent($name))
121         {
122             return $this->getComponent($name);
123         }
124     
125         //属性
126         if ($this->HasProperty($name))
127         {
128             return $this->getProperty($name);
129         }
130     
131         return parent::__get($name);
132     }
133     
134     /**
135      * 
136      * @param unknown_type $name
137      * @param unknown_type $value
138      */
139     public function __set($name, $value)
140     {
141         //属性
142         if ($this->HasProperty($name))
143         {
144             return $this->setProperty($name, $value);
145         }
146         
147         return parent::__set($name, $value);
148     }
149     
150     public function __call($name, $parameters)
151     {
152         return parent::__call($name, $parameters);
153     }
154     
155     private static $_coreComponents = array(
156         'user' => array(
157             'class' => 'application.modules.client.components.User'
158         ),
159     );
160     
161     private static $_propertysMap = array(
162         'userid'            => 'user.userid',
163     );
164     
165 }
可以从中看到定义好的user组件以及快捷获取user组件下面的userid属性
application/modules/client/components/user.php
 1 <?php
 2 
 3 class User extends ApiComponent
 4 {
 5     function getXzcoin()
 6     {
 7         
 8     }
 9     
10     function getTest()
11     {
12         var_dump('safafaf');
13         return '1';
14         
15     }
16     
17     function Test($name = 0){
18         echo $name;19         return 'test';
20     }
21     
22     function getUserid(){
23         echo '222';
24         return '2';
25     }
26 }


以及用到的application/modules/client/components/ApiComponent.php
 1 <?php
 2 
 3 use CComponent;
 4 
 5 abstract class ApiComponent extends CComponent
 6 {
 7     
 8     public $owner;
 9     
10     protected $_is;
11     
12     protected $_g;
13     
14     protected $_cacheGetter    = TRUE;
15     
16     public function init()
17     {
18         
19     }
20     
21     /**
22      * 
23      * @param unknown_type $name
24      */
25     public function __get($name)
26     {
27         if (strncasecmp($name, 'is', 2) === 0 && method_exists($this, $name))
28         {
29             $name = strtolower($name);
30             if ( ! isset($this->_is[$name]))
31             {
32                 $this->_is[$name] = $this->$name();
33             }
34             return $this->_is[$name];
35         }
36         
37         $getter = 'get' . ucfirst($name);
38         
39         if (method_exists($this, $getter))
40         {
41             if ($this->_cacheGetter)
42             {
43                 if (isset($this->_g[$name]))
44                 {
45                     return $this->_g[$name];
46                 }
47                 $this->_g[$name] = $this->$getter();
48                 return $this->_g[$name];
49             }
50             
51             return $this->$getter();
52         }
53             
54         return parent::__get($name);
55     }
56     
57     /**
58      * 
59      * @throws Exception
60      */
61     public function throwException($message, $code = 0)
62     {
63         throw new Exception($message, $code);
64     }
65     
66 }

完毕。

原文地址:https://www.cnblogs.com/jami918/p/4013662.html