Heim >Backend-Entwicklung >PHP-Tutorial >Yii Framework Offizieller Leitfaden Serie 7 – Grundlagen: Controller
Ein Controller ist eine Instanz von CController oder einer seiner Unterklassen. Es wird von der Anwendung auf Anfrage des Benutzers erstellt. Wenn ein Controller ausgeführt wird, führt er die angeforderte Aktion aus, die normalerweise die erforderlichen Modelle einführt und die entsprechenden Ansichten rendert. Die einfachste Aktionsform ist eine Controller-Klassenmethode, deren Name mit action beginnt.
Controller haben normalerweise eine Standardaktion. Wenn in der Benutzeranforderung keine auszuführende Aktion angegeben ist, wird die Standardaktion ausgeführt. Standardmäßig lautet der Standardaktionsname index. Es kann durch Festlegen von CController::defaultAction geändert werden.
Das Folgende ist der einfachste Code, der für eine Controller-Klasse erforderlich ist. Da für diesen Controller keine Aktionen definiert sind, wird bei Anfragen an ihn eine Ausnahme ausgelöst.
class SiteController extends CController { }
Controller und Aktionen werden durch ID identifiziert. Die Controller-ID hat das Format „Pfad/zu/xyz“, entsprechend der entsprechenden Controller-Klassendatei protected/controllers/path/to/XyzController.php, wobei das Flag xyz durch den tatsächlichen Namen ersetzt werden sollte (z. B. post entspricht protected/controllers/PostController.php. Die Aktions-ID ist der Name der Aktionsmethode ohne das Aktionspräfix. Wenn eine Controller-Klasse beispielsweise eine Methode namens actionEdit enthält, lautet die entsprechende Aktions-ID edit.
Hinweis: Vor Version 1.0.3 war das Controller-ID-Format path.to.xyz anstelle von path/to/xyz.
Benutzer fordern bestimmte Controller und Aktionen in Form von Routen an. Routen werden durch eine Controller-ID und eine Aktions-ID verbunden, getrennt durch einen Schrägstrich. Die Route post/edit repräsentiert beispielsweise PostController und seine Bearbeitungsaktion. Standardmäßig fordert die URL http://www.php.cn/ diesen Controller und diese Aktion an.
Hinweis: Beim Routing wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Ab Version 1.0.1 können Sie CUrlManager::caseSensitive in der Anwendungskonfiguration auf false setzen Route ohne Berücksichtigung der Groß- und Kleinschreibung . Stellen Sie im Modus ohne Berücksichtigung der Groß- und Kleinschreibung sicher, dass Sie die Konvention befolgen, dass Verzeichnisnamen, die Controller-Klassendateien enthalten, Kleinbuchstaben sind und dass in Controller-Zuordnungen und Aktionszuordnungen verwendete Schlüssel in Kleinbuchstaben geschrieben sind.
Ab Version 1.0.3 können Anwendungen Module enthalten. Im Modul ist das Routingformat von Controller-Aktionen Modul-ID/Controller-ID/Aktions-ID. Weitere Informationen finden Sie in den entsprechenden Kapiteln des Moduls.
Die Controller-Instanz wird erstellt, wenn CWebApplication eingehende Anfragen verarbeitet. Wenn eine Controller-ID angegeben wird, verwendet die Anwendung die folgenden Regeln, um die Klasse des Controllers und den Speicherort der Klassendatei zu bestimmen.
Wenn CWebApplication::catchAllRequest angegeben ist, wird der Controller basierend auf diesem Attribut erstellt und die vom Benutzer angegebene Controller-ID wird ignoriert. Dies wird normalerweise verwendet, um die Anwendung in den Wartungsstatus zu versetzen und eine statische Eingabeaufforderungsseite anzuzeigen .
Wenn die ID in CWebApplication::controllerMap gefunden wird, wird die entsprechende Controller-Konfiguration zum Erstellen der Controller-Instanz verwendet.
Wenn die ID das Format „Pfad/zu/xyz“ hat, wird der Name der Controller-Klasse als XyzController beurteilt und die entsprechende Klassendatei wird geschützt/ controllers/path/to/XyzController .php. Beispielsweise wird die Controller-ID admin/user in die Controller-Klasse UserController aufgelöst und die Klassendatei lautet protected/controllers/admin/UserController.php. Wenn die Klassendatei nicht vorhanden ist, wird eine 404 CHttpException ausgelöst.
Nach der Verwendung des Moduls (verfügbar nach Version 1.0.3) ist der obige Vorgang etwas anders. Konkret prüft die Anwendung, ob diese ID einen Controller in einem Modul repräsentiert. Wenn ja, wird zuerst die Modulinstanz erstellt und dann wird die Controller-Instanz im Modul erstellt.
Wie oben erwähnt, kann eine Aktion als eine Methode definiert werden, die mit dem Wort „Aktion“ als Präfix benannt wird. Eine fortgeschrittenere Möglichkeit besteht darin, eine Aktionsklasse zu definieren und sie vom Controller instanziieren zu lassen, wenn er eine Anfrage erhält. Dadurch können Aktionen wiederverwendet werden, was die Wiederverwendbarkeit verbessert.
Um eine neue Aktionsklasse zu definieren, verwenden Sie den folgenden Code:
class UpdateAction extends CAction { public function run() { // place the action logic here } }
In der Reihenfolge Um die Kontrolle zu ermöglichen. Wenn der Controller diese Aktion bemerkt, müssen wir die Methode actions() der Controller-Klasse auf folgende Weise überschreiben:
class PostController extends CController { public function actions() { return array( 'edit'=>'application.controllers.post.UpdateAction', ); } }
Wie oben gezeigt, haben wir den Pfadalias application.controllers.post.UpdateAction verwendet, um die Aktionsklassendatei als protected/controllers/post/UpdateAction.php anzugeben.
Durch das Schreiben von class Basierend auf Aktionen können wir die Anwendung entsprechend dem Stil des Moduls organisieren. Beispielsweise kann die folgende Verzeichnisstruktur zum Organisieren von Controller-bezogenem Code verwendet werden:
protected/ controllers/ PostController.php UserController.php post/ CreateAction.php ReadAction.php UpdateAction.php user/ CreateAction.php ListAction.php ProfileAction.php UpdateAction.php
Aktionsparameterbindung
从版本 1.1.4 开始,Yii 提供了对自动动作参数绑定的支持。 就是说,控制器动作可以定义命名的参数,参数的值将由 Yii 自动从 $_GET 填充。
为了详细说明此功能,假设我们需要为 PostController 写一个 create 动作。此动作需要两个参数:
category: 一个整数,代表帖子(post)要发表在的那个分类的ID。
language: 一个字符串,代表帖子所使用的语言代码。
从 $_GET 中提取参数时,我们可以不再下面这种无聊的代码了:
class PostController extends CController { public function actionCreate() { if(isset($_GET['category'])) $category=(int)$_GET['category']; else throw new CHttpException(404,'invalid request'); if(isset($_GET['language'])) $language=$_GET['language']; else $language='en'; // ... fun code starts here ... } }
现在使用动作参数功能,我们可以更轻松的完成任务:
class PostController extends CController { public function actionCreate($category, $language='en') { $category=(int)$category; // ... fun code starts here ... } }
注意我们在动作方法 actionCreate 中添加了两个参数。 这些参数的名字必须和我们想要从 $_GET 中提取的名字一致。 当用户没有在请求中指定 $language 参数时,这个参数会使用默认值 en 。 由于 $category 没有默认值,如果用户没有在 $_GET 中提供 category 参数, 将会自动抛出一个 CHttpException (错误代码 400) 异常。从版本1.1.5开始, Yii还支持数组类型的动作参数绑定。 这是通过PHP的类型约束来实现的,语法如下:
class PostController extends CController { public function actionCreate(array $categories) { // Yii will make sure $categories be an array } }
也就是说我们在方法参数声明里的$categories之前添加了array关键字。这样的话,如果$_GET['categories']只是一个简单的字符串,它将会被转化为一个包含该字符串的数组。
注意: 如果参数声明没有加上 array 类型约束, 意味着参数必须是标量 (i.e., not an array)。这种情况下,通过 $_GET 传入一个数组参数将会引发HTTP异常。
过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。
一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以阻止动作及后面其他过滤器的执行
过滤器可以定义为一个控制器类的方法。方法名必须以 filter 开头。例如,现有的 filterAccessControl 方法定义了一个名为 accessControl 的过滤器。 过滤器方法必须为如下结构:
public function filterAccessControl($filterChain) { // 调用 $filterChain->run() 以继续后续过滤器与动作的执行。 }
其中的 $filterChain (过滤器链)是一个 CFilterChain 的实例,代表与所请求动作相关的过滤器列表。在过滤器方法中, 我们可以调用 $filterChain->run() 以继续执行后续过滤器和动作。
过滤器也可以是一个 CFilter 或其子类的实例。如下代码定义了一个新的过滤器类:
class PerformanceFilter extends CFilter { protected function preFilter($filterChain) { // 动作被执行之前应用的逻辑 return true; // 如果动作不应被执行,此处返回 false } protected function postFilter($filterChain) { // 动作执行之后应用的逻辑 } }
要对动作应用过滤器,我们需要覆盖 CController::filters() 方法。此方法应返回一个过滤器配置数组。例如:
class PostController extends CController { ...... public function filters() { return array( 'postOnly + edit, create', array( 'application.filters.PerformanceFilter - edit, create', 'unit'=>'second', ), ); } }
上述代码指定了两个过滤器: postOnly 和 PerformanceFilter。 postOnly 过滤器是基于方法的(相应的过滤器方法已在 CController 中定义); 而 performanceFilter 过滤器是基于对象的。路径别名application.filters.PerformanceFilter 指定过滤器类文件是protected/filters/PerformanceFilter。我们使用一个数组配置 PerformanceFilter ,这样它就可被用于初始化过滤器对象的属性值。此处 PerformanceFilter 的 unit 属性值将被初始为 second。
使用加减号,我们可指定哪些动作应该或不应该应用过滤器。上述代码中, postOnly 应只被应用于 edit 和 create动作,而 PerformanceFilter 应被应用于 除了 edit 和 create 之外的动作。 如果过滤器配置中没有使用加减号,则此过滤器将被应用于所有动作。
附图:控制器的run方法执行过程
以上就是Yii框架官方指南系列7——基础知识:控制器的内容,更多相关内容请关注PHP中文网(www.php.cn)!