Ich habe mir bereits den Prozess zum Starten eines Yii-Programms und zum Rendern einer Seite angesehen. Was wir heute analysieren wollen, ist, wie Yii mit Benutzeranfragen umgeht. Das ist der Kontroll- und Aktionsteil.
Nehmen wir helloworld als Beispiel, um diesen Prozess zu demonstrieren. Wir geben http://localhost/study/yii/demos/helloworld/index.php in die Adressleiste ein und auf der Seite wird „Hallo Welt“ angezeigt.
In der vorherigen Analyse wurde der Standardwert verwendet. Wenn die URL jedoch Parameter enthält, wie geht Yii damit um? Lassen Sie uns diese Frage im Hinterkopf im Detail analysieren.
In CWebApplication gibt es diese Codezeile:
<span>$route</span>=<span>$this</span>->getUrlManager()->parseUrl(<span>$this</span>->getRequest());
Das ist die legendäre Route. Ist das nicht ein bisschen Hühnergelee? Werfen wir zunächst einen Blick darauf, wie großartig getUrlManager ist.
<span>public</span> <span>function</span><span> getUrlManager() { </span><span>return</span> <span>$this</span>->getComponent('urlManager'<span>); }</span>
Dafür muss wieder eine Beziehung gefunden werden.
<span>public</span> <span>function</span> getComponent(<span>$id</span>,<span>$createIfNull</span>=<span>true</span><span>) { </span><span>if</span>(<span>isset</span>(<span>$this</span>->_components[<span>$id</span><span>])) </span><span>return</span> <span>$this</span>->_components[<span>$id</span><span>]; </span><span>elseif</span>(<span>isset</span>(<span>$this</span>->_componentConfig[<span>$id</span>]) && <span>$createIfNull</span><span>) { </span><span>$config</span>=<span>$this</span>->_componentConfig[<span>$id</span><span>]; </span><span>if</span>(!<span>isset</span>(<span>$config</span>['enabled']) || <span>$config</span>['enabled'<span>]) { Yii</span>::trace("Loading \"<span>$id</span>\" application component",'system.CModule'<span>); </span><span>unset</span>(<span>$config</span>['enabled'<span>]); </span><span>$component</span>=Yii::createComponent(<span>$config</span><span>); </span><span>$component</span>-><span>init(); </span><span>return</span> <span>$this</span>->_components[<span>$id</span>]=<span>$component</span><span>; } } }</span>
Die Rückgabe $this->_components[$id]; wird ausgeführt. Die ID ist die übergebene URL-Manager-Klasse. Suchen Sie hier einfach nichts und sehen Sie sich parseUrl an:
<span>public</span> <span>function</span> parseUrl(<span>$request</span><span>) { </span><span>if</span>(<span>$this</span>->getUrlFormat()===self::<span>PATH_FORMAT) { </span><span>$rawPathInfo</span>=<span>$request</span>-><span>getPathInfo(); </span><span>$pathInfo</span>=<span>$this</span>->removeUrlSuffix(<span>$rawPathInfo</span>,<span>$this</span>-><span>urlSuffix); </span><span>foreach</span>(<span>$this</span>->_rules <span>as</span> <span>$i</span>=><span>$rule</span><span>) { </span><span>if</span>(<span>is_array</span>(<span>$rule</span><span>)) </span><span>$this</span>->_rules[<span>$i</span>]=<span>$rule</span>=Yii::createComponent(<span>$rule</span><span>); </span><span>if</span>((<span>$r</span>=<span>$rule</span>->parseUrl(<span>$this</span>,<span>$request</span>,<span>$pathInfo</span>,<span>$rawPathInfo</span>))!==<span>false</span><span>) </span><span>return</span> <span>isset</span>(<span>$_GET</span>[<span>$this</span>->routeVar]) ? <span>$_GET</span>[<span>$this</span>->routeVar] : <span>$r</span><span>; } </span><span>if</span>(<span>$this</span>-><span>useStrictParsing) </span><span>throw</span> <span>new</span> CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".', <span>array</span>('{route}'=><span>$pathInfo</span><span>))); </span><span>else</span> <span>return</span> <span>$pathInfo</span><span>; } </span><span>elseif</span>(<span>isset</span>(<span>$_GET</span>[<span>$this</span>-><span>routeVar])) </span><span>return</span> <span>$_GET</span>[<span>$this</span>-><span>routeVar]; </span><span>elseif</span>(<span>isset</span>(<span>$_POST</span>[<span>$this</span>-><span>routeVar])) </span><span>return</span> <span>$_POST</span>[<span>$this</span>-><span>routeVar]; </span><span>else</span> <span>return</span> ''<span>; }</span>
Nach dem obigen Code zu urteilen, können wir einfach '' zurückgeben, wenn wir nichts in die URL hochladen. Es stellt sich also die Frage, wie Parameter übergeben werden?
isset($_GET[$this-><span>routeVar]) <br></span>
<span>public</span> <span>$routeVar</span>='r';
Also wir haben eine Lösung, lasst uns gemeinsam etwas Schaden anrichten. Fügen Sie einen Parameter wie helloworld/index.php?r=abc
hinzuEs wurde ein Fehler gefunden. Es bedeutet, dass der ABC-Controller nicht existiert. Es ist nur ein bisschen schlecht. Wie das Sprichwort sagt: Wenn ein Mann nicht schlecht ist, wird ihn eine Frau nicht lieben.
Wechseln Sie zu helloworld/index.php?r=site, um hello world anzuzeigen. Was zum Teufel ist das? Der Grund ist sehr einfach, da der Site-Controller definiert ist.
<span>class</span> SiteController <span>extends</span><span> CController { </span><span>/*</span><span>* * Index action is the default action in a controller. </span><span>*/</span> <span>public</span> <span>function</span><span> actionIndex() { </span><span>echo</span> 'Hello World'<span>; }</span><span> }</span>
Okay, ich habe nichts dagegen, aber was zum Teufel ist actionIndex? In Yii wird dies als Aktion bezeichnet. Es erfasst die Parameter hinter dem Controller. Wenn wir ?r=site/index eingeben, werden die Aktionen durch „/“ getrennt. Um sicherzustellen, dass ich keine Mädchen anlüge, kontrolliere ich die Site Fügen Sie dem Tool eine Aktion hinzu, die Folgendes anzeigt:
<span>class</span> SiteController <span>extends</span><span> CController { </span><span>/*</span><span>* * Index action is the default action in a controller. </span><span>*/</span> <span>public</span> <span>function</span><span> actionIndex() { </span><span>echo</span> 'Hello World'<span>; } </span><span>public</span> <span>function</span><span> actionView() { </span><span>echo</span> 'Hello View'<span>; } }</span>
Wenn Sie auf ?r=site/view zugreifen, sehen Sie dann die Ausgabe „Hello View“? Es ist definitiv wahr. Obwohl ich nicht viele Bücher gelesen habe, kann man mich nicht täuschen. Es gibt Bilder und die Wahrheit:
Ich verwende den Namen „Site“ überhaupt nicht, Test ist mein Favorit, also habe ich einen anderen Test-Controller gebaut, um ihn auszuprobieren.
Wer scharfe Augen hat, muss gesehen haben, wie man eine Aktion schreibt. Was zum Teufel ist das? Erst nachdem ich es ausprobiert hatte, wurde mir klar, dass es tatsächlich eine andere Ausdrucksweise ist.
Ich erinnere mich, dass ich es im Blog-Beispiel verwendet habe, um den Bestätigungscode anzuzeigen:
<span>/*</span><span>* * Declares class-based actions. </span><span>*/</span> <span>public</span> <span>function</span><span> actions() { </span><span>return</span> <span>array</span><span>( </span><span>//</span><span> captcha action renders the CAPTCHA image displayed on the contact page</span> 'captcha'=><span>array</span><span>( </span>'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF,<span> )</span>, <span>//</span><span> page action renders "static" pages stored under 'protected/views/site/pages' // They can be accessed via: index.php?r=site/page&view=FileName</span> 'page'=><span>array</span><span>( </span>'class'=>'CViewAction',<span> )</span>,<span> ); }</span>
Ich verstehe darunter eine Sammlung von Aktionen, die Drittunternehmen zentral deklarieren, da die Aktionen in diesem Controller immer noch direkt in Form einer Aktions-ID vorliegen.
Was zum Teufel? Sie sagten, dass ich index.php/site/captcha anstelle von index.php?r=site/captcha verwendet habe. Dies muss mit der Konfigurationsdatei beginnen.
'urlManager'=><span>array</span><span>( </span>'urlFormat'=>'path', 'rules'=><span>array</span><span>( </span>'post/<id:\d+>/<title:.*?>'=>'post/view', 'posts/<tag:.*?>'=>'post/index', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',<span> )</span>,<span> )</span>,
urlFormat hat zwei Typen: path und get. Wenn es nicht in main.php angegeben ist, handelt es sich um die get-Methode, nämlich index.php?r=site/captcha. Falls angegeben, lautet es index.php/site/captcha
Es ist wörtlich leicht zu verstehen, dass „path“ das Format „Pfad“ und „get“ die Form „?“ hat.
Über die Routing- und Controller-Teile gibt es noch viel mehr zu besprechen, aber das ist alles für diesen Abschnitt.
Das Obige stellt die Quellcode-Analyse von YII (Teil 3) vor, einschließlich verschiedener Aspekte. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.