目录
yii源码分析2,yii源码分析
首页 后端开发 php教程 yii源码分析2,yii源码分析_PHP教程

yii源码分析2,yii源码分析_PHP教程

Jul 13, 2016 am 10:14 AM
the yii 分析 源码

yii源码分析2,yii源码分析

转载请注明:TheViper http://www.cnblogs.com/TheViper/

上一篇主要分析了Yii::createWebApplication ( $config )->run ();的createWebApplication ( $config )部分,这篇分析后面的。

 run()也是不在CWebApplication里面,在CApplication 里。

<span> 1</span> <?<span>php
</span><span> 2</span> <span>abstract</span> <span>class</span> CApplication <span>extends</span><span> CModule {
</span><span> 3</span>     <span>private</span> <span>$_id</span><span>;
</span><span> 4</span>     <span>private</span> <span>$_basePath</span><span>;
</span><span> 5</span>     <span>abstract</span> <span>public</span> <span>function</span><span> processRequest();
</span><span> 6</span>     <span>public</span> <span>function</span> __construct(<span>$config</span> = <span>null</span><span>) {
</span><span> 7</span>         <span>if</span> (<span>is_string</span> ( <span>$config</span><span> ))
</span><span> 8</span>             <span>$config</span> = <span>require</span> (<span>$config</span><span>);
</span><span> 9</span>         Yii::setApplication ( <span>$this</span> );<span>//</span><span>保存整个app实例</span>
<span>10</span>         <span>if</span> (<span>isset</span> ( <span>$config</span> ['basePath'<span>] )) {
</span><span>11</span>             <span>$this</span>->setBasePath ( <span>$config</span> ['basePath'<span>] );
</span><span>12</span>             <span>unset</span> ( <span>$config</span> ['basePath'<span>] );
</span><span>13</span>         } <span>else</span>
<span>14</span>             <span>$this</span>->setBasePath ( 'protected'<span> );
</span><span>15</span>         <span>//</span><span>设置别名,后面就可以用application表示basePath了</span>
<span>16</span>         Yii::setPathOfAlias ( 'application', <span>$this</span>-><span>getBasePath () );
</span><span>17</span>         <span>//</span><span>钩子,模块 预 初始化时执行,子类实现。不过这时,配置还没有写入框架</span>
<span>18</span>         <span>$this</span>-><span>preinit ();
</span><span>19</span>         <span>$this</span>-><span>registerCoreComponents ();
</span><span>20</span>         <span>//</span><span>父类实现</span>
<span>21</span>         <span>$this</span>->configure ( <span>$config</span><span> );
</span><span>22</span>         <span>//</span><span>加载静态应用组件</span>
<span>23</span>         <span>$this</span>-><span>preloadComponents ();
</span><span>24</span>         <span>//</span><span>这才开始初始化模块</span>
<span>25</span>         <span>$this</span>-><span>init ();
</span><span>26</span> <span>    }
</span><span>27</span>     <span>protected</span> <span>function</span><span> registerCoreComponents() {
</span><span>28</span>         <span>$components</span> = <span>array</span><span> (
</span><span>29</span>                 'request' => <span>array</span><span> (
</span><span>30</span>                         'class' => 'CHttpRequest'
<span>31</span>                 ),
<span>32</span>                 'urlManager' => <span>array</span><span> (
</span><span>33</span>                         'class' => 'CUrlManager'
<span>34</span> <span>                )
</span><span>35</span> <span>        );
</span><span>36</span> 
<span>37</span>         <span>$this</span>->setComponents ( <span>$components</span> );<span>//</span><span>父类实现</span>
<span>38</span> <span>    }
</span><span>39</span>     <span>public</span> <span>function</span><span> run() {
</span><span>40</span>         <span>$this</span>-><span>processRequest ();
</span><span>41</span> <span>    }
</span><span>42</span>     <span>public</span> <span>function</span><span> getId() {
</span><span>43</span>         <span>if</span> (<span>$this</span>->_id !== <span>null</span><span>)
</span><span>44</span>             <span>return</span> <span>$this</span>-><span>_id;
</span><span>45</span>         <span>else</span>
<span>46</span>             <span>return</span> <span>$this</span>->_id = <span>sprintf</span> ( '%x', <span>crc32</span> ( <span>$this</span>->getBasePath () . <span>$this</span>-><span>name ) );
</span><span>47</span> <span>    }
</span><span>48</span>     <span>public</span> <span>function</span> setId(<span>$id</span><span>) {
</span><span>49</span>         <span>$this</span>->_id = <span>$id</span><span>;
</span><span>50</span> <span>    }
</span><span>51</span>     <span>public</span> <span>function</span><span> getBasePath() {
</span><span>52</span>         <span>return</span> <span>$this</span>-><span>_basePath;
</span><span>53</span> <span>    }
</span><span>54</span>     <span>public</span> <span>function</span> setBasePath(<span>$path</span><span>) {
</span><span>55</span>         <span>if</span> ((<span>$this</span>->_basePath = <span>realpath</span> ( <span>$path</span> )) === <span>false</span> || ! <span>is_dir</span> ( <span>$this</span>-><span>_basePath ))
</span><span>56</span>             <span>return</span><span>;
</span><span>57</span> <span>    }
</span><span>58</span>     <span>public</span> <span>function</span><span> getDb() {
</span><span>59</span>         <span>return</span> <span>$this</span>->getComponent ( 'db' );<span>//</span><span>父类实现</span>
<span>60</span> <span>    }
</span><span>61</span>     <span>public</span> <span>function</span><span> getUrlManager() {
</span><span>62</span>         <span>return</span> <span>$this</span>->getComponent ( 'urlManager'<span> );
</span><span>63</span> <span>    }
</span><span>64</span>     <span>public</span> <span>function</span><span> getController() {
</span><span>65</span>         <span>return</span> <span>null</span><span>;
</span><span>66</span> <span>    }
</span><span>67</span>     <span>public</span> <span>function</span> getBaseUrl(<span>$absolute</span> = <span>false</span><span>) {
</span><span>68</span>         <span>return</span> <span>$this</span>->getRequest ()->getBaseUrl ( <span>$absolute</span><span> );
</span><span>69</span> <span>    }
</span><span>70</span> }
登录后复制

run()又用了CWebApplication里面的processRequest()。薛强大哥(yii作者),架构要不要这样啊.裁剪后当然觉得这样的调用很没意思。

后面的主要在CWebApplication里了。

<span> 1</span> <?<span>php
</span><span> 2</span> <span>class</span> CWebApplication <span>extends</span><span> CApplication {
</span><span> 3</span>     <span>public</span> <span>$controllerNamespace</span><span>;
</span><span> 4</span>     <span>private</span> <span>$_controllerPath</span><span>;
</span><span> 5</span>     <span>private</span> <span>$_viewPath</span><span>;
</span><span> 6</span>     <span>private</span> <span>$_systemViewPath</span><span>;
</span><span> 7</span>     <span>private</span> <span>$_controller</span><span>;
</span><span> 8</span>     <span>public</span> <span>$controllerMap</span>=<span>array</span><span>();
</span><span> 9</span>     <span>public</span> <span>function</span> processRequest() {<span>//</span><span>开始执行请求
</span><span>10</span> <span>        //获取urlManager组件,解析请求,得到controller/action这种格式的string,
</span><span>11</span> <span>        //并且将隐藏参数与请求的参数一一对应,匹配起来,写入$_REQUEST中</span>
<span>12</span>         <span>$route</span> = <span>$this</span>->getUrlManager ()->parseUrl (<span>$this</span>-><span>getRequest());
</span><span>13</span>         <span>$this</span>->runController ( <span>$route</span><span> );
</span><span>14</span> <span>    }
</span><span>15</span>     <span>public</span> <span>function</span> getRequest() {<span>//</span><span>获取request组件</span>
<span>16</span>         <span>return</span> <span>$this</span>->getComponent ( 'request'<span> );
</span><span>17</span> <span>    }
</span><span>18</span>     <span>protected</span> <span>function</span> registerCoreComponents() {<span>//</span><span>注册核心组件</span>
<span>19</span>         parent::<span>registerCoreComponents ();
</span><span>20</span> <span>    }
</span><span>21</span>     <span>//</span><span>执行contronller</span>
<span>22</span>     <span>public</span> <span>function</span> runController(<span>$route</span><span>) {
</span><span>23</span>         <span>if</span> ((<span>$ca</span> = <span>$this</span>->createController ( <span>$route</span> )) !== <span>null</span><span>) {
</span><span>24</span>             <span>list</span> ( <span>$controller</span>, <span>$actionID</span> ) = <span>$ca</span><span>;
</span><span>25</span>             <span>$oldController</span> = <span>$this</span>-><span>_controller;
</span><span>26</span>             <span>$this</span>->_controller = <span>$controller</span><span>;
</span><span>27</span>             <span>$controller</span>->init ();<span>//</span><span>钩子,在执行action方法前调用,子类去实现</span>
<span>28</span>             <span>$controller</span>->run ( <span>$actionID</span> );<span>//</span><span>开始转入controller类中action方法的执行</span>
<span>29</span>             <span>$this</span>->_controller = <span>$oldController</span><span>;
</span><span>30</span> <span>        }
</span><span>31</span> <span>    }
</span><span>32</span>     <span>//</span><span>创建controller类实例,从controller/action这种格式的string中解析出$controller, $actionID </span>
<span>33</span>     <span>public</span> <span>function</span> createController(<span>$route</span>, <span>$owner</span> = <span>null</span><span>) {
</span><span>34</span>         <span>if</span> (<span>$owner</span> === <span>null</span><span>)
</span><span>35</span>             <span>$owner</span> = <span>$this</span><span>;
</span><span>36</span>         <span>if</span> ((<span>$route</span> = <span>trim</span> ( <span>$route</span>, '/' )) === ''<span>)
</span><span>37</span>             <span>$route</span> = <span>$owner</span>-><span>defaultController;
</span><span>38</span> 
<span>39</span>         <span>$route</span> .= '/'<span>;
</span><span>40</span>         <span>while</span> ( (<span>$pos</span> = <span>strpos</span> ( <span>$route</span>, '/' )) !== <span>false</span><span> ) {
</span><span>41</span>             <span>$id</span> = <span>substr</span> ( <span>$route</span>, 0, <span>$pos</span><span> );
</span><span>42</span>             <span>if</span> (! <span>preg_match</span> ( '/^\w+$/', <span>$id</span><span> ))
</span><span>43</span>                 <span>return</span> <span>null</span><span>;
</span><span>44</span>             <span>$id</span> = <span>strtolower</span> ( <span>$id</span><span> );
</span><span>45</span>             <span>$route</span> = ( <span>string</span> ) <span>substr</span> ( <span>$route</span>, <span>$pos</span> + 1<span> );
</span><span>46</span>             <span>if</span> (! <span>isset</span> ( <span>$basePath</span> ))             <span>//</span><span> first segment</span>
<span>47</span> <span>            {
</span><span>48</span>                 <span>$basePath</span> = <span>$owner</span>-><span>getControllerPath ();
</span><span>49</span>                 <span>$controllerID</span> = ''<span>;
</span><span>50</span>             } <span>else</span><span> {
</span><span>51</span>                 <span>$controllerID</span> .= '/'<span>;
</span><span>52</span> <span>            }
</span><span>53</span>             <span>$className</span> = <span>ucfirst</span> ( <span>$id</span> ) . 'Controller'<span>;
</span><span>54</span>             <span>$classFile</span> = <span>$basePath</span> . DIRECTORY_SEPARATOR . <span>$className</span> . '.php'<span>;
</span><span>55</span> 
<span>56</span>             <span>if</span> (<span>is_file</span> ( <span>$classFile</span><span> )) {
</span><span>57</span>                 <span>if</span> (! <span>class_exists</span> ( <span>$className</span>, <span>false</span><span> ))
</span><span>58</span>                     <span>require</span> (<span>$classFile</span><span>);
</span><span>59</span>                 <span>if</span> (<span>class_exists</span> ( <span>$className</span>, <span>false</span> ) && <span>is_subclass_of</span> ( <span>$className</span>, 'CController'<span> )) {
</span><span>60</span>                     <span>$id</span> [0] = <span>strtolower</span> ( <span>$id</span> [0<span>] );
</span><span>61</span>                     <span>return</span> <span>array</span><span> (
</span><span>62</span>                             <span>new</span> <span>$className</span> ( <span>$controllerID</span> . <span>$id</span>, <span>$owner</span> === <span>$this</span> ? <span>null</span> : <span>$owner</span> ),
<span>63</span>                             <span>$this</span>->parseActionParams ( <span>$route</span><span> )
</span><span>64</span> <span>                    );
</span><span>65</span> <span>                }
</span><span>66</span>                 <span>return</span> <span>null</span><span>;
</span><span>67</span> <span>            }
</span><span>68</span>             <span>$controllerID</span> .= <span>$id</span><span>;
</span><span>69</span>             <span>$basePath</span> .= DIRECTORY_SEPARATOR . <span>$id</span><span>;
</span><span>70</span> <span>        }
</span><span>71</span> <span>    }
</span><span>72</span>     <span>protected</span> <span>function</span> parseActionParams(<span>$pathInfo</span><span>) {
</span><span>73</span>         <span>if</span> ((<span>$pos</span> = <span>strpos</span> ( <span>$pathInfo</span>, '/' )) !== <span>false</span><span>) {
</span><span>74</span>             <span>$manager</span> = <span>$this</span>->getUrlManager ();<span>//</span><span>再次获取urlManager,在上面第一次调用中已经导入。</span>
<span>75</span>             <span>$manager</span>->parsePathInfo ( ( <span>string</span> ) <span>substr</span> ( <span>$pathInfo</span>, <span>$pos</span> + 1<span> ) );
</span><span>76</span>             <span>$actionID</span> = <span>substr</span> ( <span>$pathInfo</span>, 0, <span>$pos</span><span> );
</span><span>77</span>             <span>return</span> <span>$manager</span>->caseSensitive ? <span>$actionID</span> : <span>strtolower</span> ( <span>$actionID</span><span> );
</span><span>78</span>         } <span>else</span>
<span>79</span>             <span>return</span> <span>$pathInfo</span><span>;
</span><span>80</span> <span>    }
</span><span>81</span>     <span>public</span> <span>function</span><span> getControllerPath() {
</span><span>82</span>         <span>if</span> (<span>$this</span>->_controllerPath !== <span>null</span><span>)
</span><span>83</span>             <span>return</span> <span>$this</span>-><span>_controllerPath;
</span><span>84</span>         <span>else</span>
<span>85</span>             <span>return</span> <span>$this</span>->_controllerPath = <span>$this</span>->getBasePath () . DIRECTORY_SEPARATOR . 'controllers'<span>;
</span><span>86</span> <span>    }
</span><span>87</span>     <span>//</span><span>两个钩子,子类去实现</span>
<span>88</span>     <span>public</span> <span>function</span> beforeControllerAction(<span>$controller</span>, <span>$action</span><span>) {
</span><span>89</span>         <span>return</span> <span>true</span><span>;
</span><span>90</span> <span>    }
</span><span>91</span>     <span>public</span> <span>function</span> afterControllerAction(<span>$controller</span>, <span>$action</span><span>) {
</span><span>92</span> <span>    }
</span><span>93</span>     <span>protected</span> <span>function</span><span> init() {
</span><span>94</span>         parent::<span>init ();
</span><span>95</span> <span>    }
</span><span>96</span> }
登录后复制

对于$this->getUrlManager (),YiiBase里面有'CUrlManager' => 'CUrlManager.php'这个映射,说明是实例化了CUrlManager这个类。

<span> 1</span> <?<span>php
</span><span> 2</span> <span>class</span><span> CUrlManager {
</span><span> 3</span>     <span>const</span> GET_FORMAT = 'get'<span>;
</span><span> 4</span>     <span>public</span> <span>$rules</span> = <span>array</span><span> ();
</span><span> 5</span>     <span>public</span> <span>$urlSuffix</span> = ''<span>;
</span><span> 6</span>     <span>public</span> <span>$caseSensitive</span> = <span>true</span><span>;
</span><span> 7</span>     <span>public</span> <span>$urlRuleClass</span> = 'CUrlRule'<span>;
</span><span> 8</span>     <span>private</span> <span>$_urlFormat</span> = self::<span>GET_FORMAT;
</span><span> 9</span>     <span>private</span> <span>$_rules</span> = <span>array</span><span> ();
</span><span>10</span>     <span>private</span> <span>$_baseUrl</span><span>;
</span><span>11</span>     <span>protected</span> <span>function</span><span> processRules() {
</span><span>12</span>         <span>//</span><span>遍历自定义的请求匹配规则</span>
<span>13</span>         <span>foreach</span> ( <span>$this</span>->rules <span>as</span> <span>$pattern</span> => <span>$route</span><span> ) {
</span><span>14</span>             <span>//</span><span>对每一个规则创建CUrlRule实例</span>
<span>15</span>             <span>$this</span>->_rules [] = <span>$this</span>->createUrlRule ( <span>$route</span>, <span>$pattern</span><span> );
</span><span>16</span> <span>        }
</span><span>17</span> <span>    }
</span><span>18</span>     <span>protected</span> <span>function</span> createUrlRule(<span>$route</span>, <span>$pattern</span><span>) {
</span><span>19</span>         <span>if</span> (<span>is_array</span> ( <span>$route</span> ) && <span>isset</span> ( <span>$route</span> ['class'<span>] ))
</span><span>20</span>             <span>return</span> <span>$route</span><span>;
</span><span>21</span>         <span>else</span><span> {
</span><span>22</span>             <span>//</span><span>import第二个参数表示是否立即包含类文件。 如果为flase,则类文件仅在被使用时包含。 这个参数仅当使用一个类的路径 别名 时才会用到</span>
<span>23</span>             <span>$urlRuleClass</span> = Yii::import ( <span>$this</span>->urlRuleClass, <span>true</span><span> );
</span><span>24</span>             <span>//</span><span>创建CUrlRule实例</span>
<span>25</span>             <span>return</span> <span>new</span> <span>$urlRuleClass</span> ( <span>$route</span>, <span>$pattern</span><span> );
</span><span>26</span> <span>        }
</span><span>27</span> <span>    }
</span><span>28</span>     <span>//</span><span>类似于__construct()</span>
<span>29</span>     <span>public</span> <span>function</span><span> init() {
</span><span>30</span>         <span>$this</span>-><span>processRules ();
</span><span>31</span> <span>    }
</span><span>32</span>     <span>public</span> <span>function</span> parseUrl(<span>$request</span><span>) {
</span><span>33</span>         <span>//</span><span>获取请求</span>
<span>34</span>         <span>$rawPathInfo</span> = <span>$request</span>-><span>getPathInfo ();
</span><span>35</span>         <span>$pathInfo</span> = <span>$this</span>->removeUrlSuffix ( <span>$rawPathInfo</span>, <span>$this</span>-><span>urlSuffix );
</span><span>36</span>         <span>foreach</span> ( <span>$this</span>->_rules <span>as</span> <span>$i</span> => <span>$rule</span><span> ) {
</span><span>37</span>             <span>if</span> ((<span>$r</span> = <span>$rule</span>->parseUrl ( <span>$this</span>, <span>$pathInfo</span>, <span>$rawPathInfo</span> )) !== <span>false</span><span>) {
</span><span>38</span>                 <span>return</span> <span>$r</span><span>;
</span><span>39</span> <span>            }
</span><span>40</span> <span>        }
</span><span>41</span>         <span>return</span> <span>$pathInfo</span><span>;
</span><span>42</span> <span>    }
</span><span>43</span>     <span>//</span><span>解析请求,将请求参数写入$_REQUEST</span>
<span>44</span>     <span>public</span> <span>function</span> parsePathInfo(<span>$pathInfo</span><span>) {
</span><span>45</span>         <span>if</span> (<span>$pathInfo</span> === ''<span>)
</span><span>46</span>             <span>return</span><span>;
</span><span>47</span>         <span>$segs</span> = <span>explode</span> ( '/', <span>$pathInfo</span> . '/'<span> );
</span><span>48</span>         <span>$n</span> = <span>count</span> ( <span>$segs</span><span> );
</span><span>49</span>         <span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$n</span> - 1; <span>$i</span> += 2<span>) {
</span><span>50</span>             <span>$key</span> = <span>$segs</span> [<span>$i</span><span>];
</span><span>51</span>             <span>if</span> (<span>$key</span> === ''<span>)
</span><span>52</span>                 <span>continue</span><span>;
</span><span>53</span>             <span>$value</span> = <span>$segs</span> [<span>$i</span> + 1<span>];
</span><span>54</span>             <span>if</span> ((<span>$pos</span> = <span>strpos</span> ( <span>$key</span>, '[' )) !== <span>false</span> && (<span>$m</span> = <span>preg_match_all</span> ( '/\[(.*?)\]/', <span>$key</span>, <span>$matches</span> )) > 0<span>) {
</span><span>55</span>                 <span>$name</span> = <span>substr</span> ( <span>$key</span>, 0, <span>$pos</span><span> );
</span><span>56</span>                 <span>for</span>(<span>$j</span> = <span>$m</span> - 1; <span>$j</span> >= 0; -- <span>$j</span><span>) {
</span><span>57</span>                     <span>if</span> (<span>$matches</span> [1] [<span>$j</span>] === ''<span>)
</span><span>58</span>                         <span>$value</span> = <span>array</span><span> (
</span><span>59</span>                             <span>$value</span> 
<span>60</span> <span>                            );
</span><span>61</span>                     <span>else</span>
<span>62</span>                         <span>$value</span> = <span>array</span><span> (
</span><span>63</span>                             <span>$matches</span> [1] [<span>$j</span>] => <span>$value</span> 
<span>64</span> <span>                            );
</span><span>65</span> <span>                }
</span><span>66</span>                 <span>if</span> (<span>isset</span> ( <span>$_GET</span> [<span>$name</span>] ) && <span>is_array</span> ( <span>$_GET</span> [<span>$name</span><span>] ))
</span><span>67</span>                     <span>$value</span> = CMap::mergeArray ( <span>$_GET</span> [<span>$name</span>], <span>$value</span><span> );
</span><span>68</span>                 <span>$_REQUEST</span> [<span>$name</span>] = <span>$_GET</span> [<span>$name</span>] = <span>$value</span><span>;
</span><span>69</span>             } <span>else</span><span> {                
</span><span>70</span>                 <span>$_REQUEST</span> [<span>$key</span>] = <span>$_GET</span> [<span>$key</span>] = <span>$value</span><span>;
</span><span>71</span> <span>            }
</span><span>72</span> <span>        }
</span><span>73</span> <span>    }
</span><span>74</span>     <span>//</span><span>去除请求后缀,如video/broadcast.html=>video/broadcast </span>
<span>75</span>     <span>public</span> <span>function</span> removeUrlSuffix(<span>$pathInfo</span>, <span>$urlSuffix</span><span>) {
</span><span>76</span>         <span>if</span> (<span>$urlSuffix</span> !== '' && <span>substr</span> ( <span>$pathInfo</span>, - <span>strlen</span> ( <span>$urlSuffix</span> ) ) === <span>$urlSuffix</span><span>)
</span><span>77</span>             <span>return</span> <span>substr</span> ( <span>$pathInfo</span>, 0, - <span>strlen</span> ( <span>$urlSuffix</span><span> ) );
</span><span>78</span>         <span>else</span>
<span>79</span>             <span>return</span> <span>$pathInfo</span><span>;
</span><span>80</span> <span>    }
</span><span>81</span> }
登录后复制

yii在创建组件的时候,在调用了CModule的getComponent($id, $createIfNull = true)里面调用了$component->init ();。

所以这里进入init(),然后processRules()遍历自定义的请求匹配规则。如

<span> 1</span>                 'urlManager' => <span>array</span><span> (
</span><span> 2</span>                         'urlFormat' => 'path',
<span> 3</span>                         'rules' => <span>array</span><span> (
</span><span> 4</span>                                 'comment_reply/<a:\d+>/<ci:\d+>' => 'reply/load_comment_reply',
<span> 5</span>                                 'b/<id:\d+>' => <span>array</span><span> (
</span><span> 6</span>                                         'video/broadcast',
<span> 7</span>                                         'urlSuffix' => '.html' 
<span> 8</span>                                 ),
<span> 9</span>                                 'c/<list_start:\d+>' => 'video/list_more_video',
<span>10</span>                                 'u/reg' => 'user/reg',
<span>11</span>                                 'v/upload' => 'video/upload_video',
<span>12</span>                                 'login' => 'user/to_login',
<span>13</span>                                 'show_chanel/<chanel_id:\d+>' => 'show/chanel' ,
<span>14</span>                                 'show/<show_id:\d+>' => 'show/show',
<span>15</span> <span>                        ) 
</span><span>16</span>                 ) 
登录后复制

$this->_rules [] = $this->createUrlRule ( $route, $pattern );对每一个规则创建CUrlRule实例,并保存。

<span> 1</span> <?<span>php
</span><span> 2</span> <span>class</span><span> CUrlRule {
</span><span> 3</span>     <span>public</span> <span>$urlSuffix</span><span>;
</span><span> 4</span>     <span>public</span> <span>$defaultParams</span> = <span>array</span><span> ();
</span><span> 5</span>     <span>public</span> <span>$route</span><span>;
</span><span> 6</span>     <span>public</span> <span>$routePattern</span><span>;
</span><span> 7</span>     <span>public</span> <span>$pattern</span><span>;
</span><span> 8</span>     <span>public</span> <span>$template</span><span>;
</span><span> 9</span>     <span>public</span> <span>$params</span> = <span>array</span><span> ();
</span><span>10</span>     <span>//</span><span>根据自定义规则构建匹配参数的正则表达式。</span>
<span>11</span>     <span>public</span> <span>function</span> __construct(<span>$route</span>, <span>$pattern</span><span>) {
</span><span>12</span>         <span>if</span> (<span>is_array</span> ( <span>$route</span><span> )) {
</span><span>13</span>             <span>foreach</span> ( <span>array</span><span> (
</span><span>14</span>                     'urlSuffix',
<span>15</span>                     'caseSensitive',
<span>16</span>                     'defaultParams',
<span>17</span>             ) <span>as</span> <span>$name</span><span> ) {
</span><span>18</span>                 <span>if</span> (<span>isset</span> ( <span>$route</span> [<span>$name</span><span>] ))
</span><span>19</span>                     <span>$this</span>-><span>$name</span> = <span>$route</span> [<span>$name</span><span>];
</span><span>20</span> <span>            }
</span><span>21</span>             <span>if</span> (<span>isset</span> ( <span>$route</span> ['pattern'<span>] ))
</span><span>22</span>                 <span>$pattern</span> = <span>$route</span> ['pattern'<span>];
</span><span>23</span>             <span>$route</span> = <span>$route</span> [0<span>];
</span><span>24</span> <span>        }
</span><span>25</span>         <span>$this</span>->route = <span>trim</span> ( <span>$route</span>, '/'<span> );
</span><span>26</span>         
<span>27</span>         <span>$tr2</span> ['/'] = <span>$tr</span> ['/'] = '\\/'<span>;
</span><span>28</span>         <span>$tr</span> ['.'] = '\\.'<span>;
</span><span>29</span>         
<span>30</span>         <span>$this</span>->hasHostInfo = ! <span>strncasecmp</span> ( <span>$pattern</span>, 'http://', 7 ) || ! <span>strncasecmp</span> ( <span>$pattern</span>, 'https://', 8<span> );
</span><span>31</span>         
<span>32</span>         <span>if</span> (<span>preg_match_all</span> ( '/<(\w+):?(.*?)?>/', <span>$pattern</span>, <span>$matches</span><span> )) {
</span><span>33</span>             <span>$tokens</span> = <span>array_combine</span> ( <span>$matches</span> [1], <span>$matches</span> [2<span>] );
</span><span>34</span>             <span>foreach</span> ( <span>$tokens</span> <span>as</span> <span>$name</span> => <span>$value</span><span> ) {
</span><span>35</span>                 <span>if</span> (<span>$value</span> === ''<span>)
</span><span>36</span>                     <span>$value</span> = '[^\/]+'<span>;
</span><span>37</span>                 <span>$tr</span> ["<<span>$name</span>>"] = "(?P<<span>$name</span>><span>$value</span>)"<span>;
</span><span>38</span>                 <span>//</span><span>取出自定义规则中隐藏的参数,保存</span>
<span>39</span>                 <span>if</span> (<span>isset</span> ( <span>$this</span>->references [<span>$name</span><span>] ))
</span><span>40</span>                     <span>$tr2</span> ["<<span>$name</span>>"] = <span>$tr</span> ["<<span>$name</span>>"<span>];
</span><span>41</span>                 <span>else</span>
<span>42</span>                     <span>$this</span>->params [<span>$name</span>] = <span>$value</span><span>;
</span><span>43</span> <span>            }
</span><span>44</span> <span>        }
</span><span>45</span>         <span>$p</span> = <span>rtrim</span> ( <span>$pattern</span>, '*'<span> );
</span><span>46</span>         <span>$this</span>->append = <span>$p</span> !== <span>$pattern</span><span>;
</span><span>47</span>         <span>$p</span> = <span>trim</span> ( <span>$p</span>, '/'<span> );
</span><span>48</span>         <span>$this</span>->template = <span>preg_replace</span> ( '/<(\w+):?.*?>/', '<$1>', <span>$p</span><span> );
</span><span>49</span>         <span>$this</span>->pattern = '/^' . <span>strtr</span> ( <span>$this</span>->template, <span>$tr</span> ) . '\/'<span>;
</span><span>50</span>         <span>//</span><span>合成匹配的正则表达式</span>
<span>51</span>         <span>if</span> (<span>$this</span>-><span>append)
</span><span>52</span>             <span>$this</span>->pattern .= '/u'<span>;
</span><span>53</span>         <span>else</span>
<span>54</span>             <span>$this</span>->pattern .= '$/u'<span>;
</span><span>55</span> <span>    }
</span><span>56</span>     <span>//</span><span>根据正则表达式和请求,将隐藏参数与请求参数一一匹配,保存$_REQUEST</span>
<span>57</span>     <span>public</span> <span>function</span> parseUrl(<span>$manager</span>, <span>$pathInfo</span>, <span>$rawPathInfo</span><span>) {
</span><span>58</span>         <span>if</span> (<span>$this</span>->urlSuffix !== <span>null</span><span>) {
</span><span>59</span>             <span>$pathInfo</span> = <span>$manager</span>->removeUrlSuffix ( <span>$rawPathInfo</span>, <span>$this</span>-><span>urlSuffix );
</span><span>60</span> <span>        }
</span><span>61</span>         <span>$pathInfo</span> .= '/'<span>;
</span><span>62</span>         <span>if</span> (<span>preg_match</span> ( <span>$this</span>->pattern, <span>$pathInfo</span>, <span>$matches</span><span> )) {
</span><span>63</span>             <span>foreach</span> ( <span>$this</span>->defaultParams <span>as</span> <span>$name</span> => <span>$value</span><span> ) {
</span><span>64</span>                 <span>if</span> (! <span>isset</span> ( <span>$_GET</span> [<span>$name</span><span>] ))
</span><span>65</span>                     <span>$_REQUEST</span> [<span>$name</span>] = <span>$_GET</span> [<span>$name</span>] = <span>$value</span><span>;
</span><span>66</span> <span>            }
</span><span>67</span>             <span>$tr</span> = <span>array</span><span> ();
</span><span>68</span>             <span>foreach</span> ( <span>$matches</span> <span>as</span> <span>$key</span> => <span>$value</span><span> ) {
</span><span>69</span>                 <span>if</span> (<span>isset</span> ( <span>$this</span>->references [<span>$key</span><span>] ))
</span><span>70</span>                     <span>$tr</span> [<span>$this</span>->references [<span>$key</span>]] = <span>$value</span><span>;
</span><span>71</span>                 <span>elseif</span> (<span>isset</span> ( <span>$this</span>->params [<span>$key</span><span>] ))
</span><span>72</span>                     <span>$_REQUEST</span> [<span>$key</span>] = <span>$_GET</span> [<span>$key</span>] = <span>$value</span><span>;
</span><span>73</span> <span>            }
</span><span>74</span>             <span>if</span> (<span>$pathInfo</span> !== <span>$matches</span> [0]) <span>//</span><span>如果还有另外的请求参数</span>
<span>75</span>                 <span>$manager</span>->parsePathInfo ( <span>ltrim</span> ( <span>substr</span> ( <span>$pathInfo</span>, <span>strlen</span> ( <span>$matches</span> [0] ) ), '/'<span> ) );
</span><span>76</span>             <span>return</span> <span>$this</span>-><span>route;
</span><span>77</span>         } <span>else</span>
<span>78</span>             <span>return</span> <span>false</span><span>;
</span><span>79</span> <span>    }
</span><span>80</span> }
登录后复制

CUrlRule中的parseUrl($manager, $pathInfo, $rawPathInfo)这里暂时还没用到。

然后回到CWebApplication中的¥route=$this->getUrlManager ()->parseUrl ($this->getRequest());。后面parseUrl开始解析请求了。

转到CUrlManager的parseUrl($request),遍历创建CUrlRule过程中保存的匹配规则,再在CUrlRule里面用CUrlRule的parseUrl($manager, $pathInfo, $rawPathInfo)将隐藏参数与请求参数一一匹配,保存$_REQUEST.

比如:

'b/' => array (
  'video/broadcast',
  'urlSuffix' => '.html'
)

我的请求是b/1.html,就会被解析成video/broadcast?id=1.而最终的$route就是这个。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/909081.htmlTechArticleyii源码分析2,yii源码分析 转载请注明:TheViperhttp://www.cnblogs.com/TheViper/ 上一篇主要分析了Yii::createWebApplication ( $config )-run ();的createWebAppli...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

2 个月不见,人形机器人 Walker S 会叠衣服了 2 个月不见,人形机器人 Walker S 会叠衣服了 Apr 03, 2024 am 08:01 AM

机器之能报道编辑:吴昕国内版的人形机器人+大模型组队,首次完成叠衣服这类复杂柔性材料的操作任务。随着融合了OpenAI多模态大模型的Figure01揭开神秘面纱,国内同行的相关进展一直备受关注。就在昨天,国内"人形机器人第一股"优必选发布了人形机器人WalkerS深入融合百度文心大模型后的首个Demo,展示了一些有趣的新功能。现在,得到百度文心大模型能力加持的WalkerS是这个样子的。和Figure01一样,WalkerS没有走动,而是站在桌子后面完成一系列任务。它可以听从人类的命令,折叠衣物

如何在uniapp中实现数据统计和分析 如何在uniapp中实现数据统计和分析 Oct 24, 2023 pm 12:37 PM

如何在uniapp中实现数据统计和分析一、背景介绍数据统计和分析是移动应用开发过程中非常重要的一环,通过对用户行为的统计和分析,开发者可以深入了解用户的喜好和使用习惯,从而优化产品设计和用户体验。本文将介绍如何在uniapp中实现数据统计和分析的功能,并提供一些具体的代码示例。二、选择合适的数据统计和分析工具在uniapp中实现数据统计和分析的第一步是选择合

织梦CMS二级目录打不开的原因分析 织梦CMS二级目录打不开的原因分析 Mar 13, 2024 pm 06:24 PM

标题:解析织梦CMS二级目录打不开的原因及解决方案织梦CMS(DedeCMS)是一款功能强大的开源内容管理系统,被广泛应用于各类网站建设中。然而,有时候在搭建网站过程中可能会遇到二级目录无法打开的情况,这给网站的正常运行带来了困扰。在本文中,我们将分析二级目录打不开的可能原因,并提供具体的代码示例来解决这一问题。一、可能的原因分析:伪静态规则配置问题:在使用

PHP代码在浏览器中如何显示源码而不被解释执行? PHP代码在浏览器中如何显示源码而不被解释执行? Mar 11, 2024 am 10:54 AM

PHP代码在浏览器中如何显示源码而不被解释执行?PHP是一种服务器端脚本语言,通常用于开发动态网页。当PHP文件在服务器上被请求时,服务器会解释执行其中的PHP代码,并将最终的HTML内容发送到浏览器以供显示。然而,有时我们希望在浏览器中直接展示PHP文件的源代码,而不是被执行。本文将介绍如何在浏览器中显示PHP代码的源码,而不被解释执行。在PHP中,可以使

网站在线看源码 网站在线看源码 Jan 10, 2024 pm 03:31 PM

可以使用浏览器的开发者工具来查看网站的源代码,在Google Chrome浏览器中:1、打开 Chrome 浏览器,访问要查看源代码的网站;2、右键单击网页上的任何位置,然后选择“检查”或按下快捷键 Ctrl + Shift + I打开开发者工具;3、在开发者工具的顶部菜单栏中,选择“Elements”选项卡;4、看到网站的 HTML 和 CSS 代码即可。

Python在智能交通系统中的应用案例分析 Python在智能交通系统中的应用案例分析 Sep 08, 2023 am 08:13 AM

Python在智能交通系统中的应用案例分析摘要:随着智能交通系统的快速发展,Python作为一种多功能、易于学习和使用的编程语言,被广泛应用于智能交通系统的开发和应用中。本文通过分析Python在智能交通系统中的应用案例,并给出相关的代码示例,展示了Python在智能交通领域中的优势和应用潜力。引言智能交通系统是指利用现代通信、信息、传感等技术手段,通过对交

分析腾讯主要的编程语言是否为Go 分析腾讯主要的编程语言是否为Go Mar 27, 2024 pm 04:21 PM

标题:腾讯主要的编程语言是否为Go:一项深入分析腾讯作为中国领先的科技公司,在编程语言的选择上一直备受关注。近年来,有人认为腾讯主要采用Go作为主要的编程语言。本文将对腾讯主要的编程语言是否为Go进行深入分析,并给出具体的代码示例来支持这一观点。一、Go语言在腾讯的应用Go是一种由Google开发的开源编程语言,它的高效性、并发性和简洁性受到众多开发者的喜

golang框架源码学习与应用全面指南 golang框架源码学习与应用全面指南 Jun 01, 2024 pm 10:31 PM

通过理解Golang框架源码,开发者可以掌握语言精髓和扩展框架功能。首先,获取源码并熟悉其目录结构。其次,阅读代码、跟踪执行流和理解依赖关系。实战案例展示了如何应用这些知识:创建自定义中间件并扩展路由系统。最佳实践包括分步学习、避免盲目复制粘贴、利用工具和参考在线资源。

See all articles