この記事では、Yii クイック スタート チュートリアルについて説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
Ⅰ、基本概念
1.エントリーファイル
エントリファイルの内容: 一般的な形式は次のとおりです:
リーリー2. メイン設定ファイル
保存場所: application/protected/config/main.php
ファイルの内容: 一般的な形式は次のとおりです:
リーリーコアアプリケーションコンポーネント:
Yii は、一般的な Web アプリケーションで使用される機能を提供する一連のコア アプリケーション コンポーネントを事前定義します。たとえば、リクエスト コンポーネントは、ユーザー リクエストを解析し、URL や Cookie などの情報を提供するために使用されます。これらのコアコンポーネントのプロパティを設定することで、Yii のデフォルトの動作をほぼ任意に変更できます。
以下に、CWebApplication によって事前定義されたコア コンポーネントをリストします。
assetManager: CAssetManager - プライベートアセットファイルのリリースを管理します。
authManager: CAuthManager - ロールベースのアクセス制御 (RBAC) を管理します。
キャッシュ: CCache - データ キャッシュ機能を提供します。実際のクラス (CMemCache、CDbCache など) を指定する必要があることに注意してください。それ以外の場合、このコンポーネントにアクセスすると NULL が返されます。
clientScript: CClientScript - クライアント スクリプト (JavaScript と CSS) を管理します。
coreMessages: CPhpMessageSource - Yii フレームワークで使用されるコアメッセージの翻訳を提供します。
db: CDbConnection - データベース接続を提供します。このコンポーネントを使用するには、その connectionString プロパティを設定する必要があることに注意してください。
errorHandler: CErrorHandler - 捕捉されなかった PHP エラーと例外を処理します。
format: CFormatter - 数値表示をフォーマットします。この機能はバージョン 1.1.0 以降で利用可能です。
メッセージ: CPhpMessageSource - Yii アプリケーションで使用されるメッセージの翻訳を提供します。
request: CHttpRequest - ユーザーのリクエストに関する情報を提供します。
securityManager: CSecurityManager - ハッシュ、暗号化などのセキュリティ関連サービスを提供します。
session: CHttpSession - セッション関連の機能を提供します。
statePersister: CStatePersister - グローバル状態永続メソッドを提供します。
urlManager: CUrlManager - URL の解析と作成関連の機能を提供します
user: CWebUser - 現在のユーザーの識別情報を提供します。
themeManager: CThemeManager - テーマを管理します。
アプリケーションコンポーネントにアクセスするには、Yii::app()->コンポーネントのIDを使用します
3. コントローラー
Controller は、CController クラスのサブクラスのインスタンスです。ユーザーの要求に応じてアプリケーションによって作成されます。コントローラーが実行されると、要求されたアクション (コントローラー クラス メソッド) が実行され、通常は必要なモデルが導入され、対応するビューがレンダリングされます。アクションは、名前が action で始まるコントローラー クラスのメソッドです (アクション + 大文字のアクション名)。
コントローラークラスファイルの保存場所は protected/controllers/
コントローラーとアクションはIDで識別されます。
コントローラー ID は「親ディレクトリ/サブディレクトリ/コントローラー名」の形式で、対応するコントローラー クラス ファイル protected/controllers/親ディレクトリ/サブディレクトリ/大文字のコントローラー名に対応します。
アクション ID は、アクションのプレフィックスを除いたアクション メソッド名です。
1.ルーティング
ユーザーはルートの形式で特定のコントローラーとアクションをリクエストします。ルートは、スラッシュで区切られたコントローラー ID とアクション ID によって接続されます。
たとえば、post/edit ルートは PostController とその編集アクションを表します。デフォルトでは、URL http://hostname/index.php?r=post/edit はこのコントローラとアクションをリクエストします。
注: デフォルトでは、ルートは大文字と小文字が区別されます。アプリ構成で CUrlManager::caseSensitive を false に設定すると、ルートで大文字と小文字を区別しなくなります。大文字と小文字を区別しないモードでは、コントローラー クラス ファイルを含むディレクトリ名は小文字であり、コントローラー マップとアクション マップで使用されるキーは小文字であるという規則に従っていることを確認してください。
ルーティングの形式: コントローラー ID/アクション ID またはモジュール ID/コントローラー ID/アクション ID (ネストされたモジュールの場合、モジュール ID は親モジュール ID/サブモジュール ID)
2. コントローラーのインスタンス化
アプリケーションは次のルールを使用して、コントローラーのクラスとクラス ファイルの場所を決定します。
① CWebApplication::catchAllRequest が指定されている場合、この属性に基づいてコントローラーが作成され、ユーザーが指定したコントローラー ID は無視されます。これは通常、アプリケーションをメンテナンス状態にし、静的なプロンプト ページを表示するために使用されます。② CWebApplication::controllerMap で ID が見つかった場合、対応するコントローラー設定を使用してコントローラー インスタンスが作成されます。
③ IDが「path/to/xyz」の形式の場合、コントローラークラス名はXyzControllerと判断され、対応するクラスファイルはprotected/controllers/path/to/XyzController.phpとなります。クラス ファイルが存在しない場合、404 CHttpException がトリガーされます。
モジュールを使用する場合、アプリケーションはこの ID がモジュール内のコントローラーを表すかどうかを確認します。その場合、モジュール インスタンスが最初に作成され、次にモジュール内のコントローラー インスタンスが作成されます。
3. アクション
动作 就是被定义为一个以 action 单词作为前缀命名的方法。而更高级的方式是定义一个动作类并让控制器在收到请求时将其实例化。这使得动作可以被复用,提高了可复用度。
1、定义一个动作类,基本格式如下:
class UpdateAction extends CAction { public function run() { // place the action logic here } }
2、使用动作类:为了让控制器注意到这个动作,我们要用如下方式覆盖控制器类的actions() 方法:
class PostController extends CController { public function actions() { return array( 'edit'=>'application.controllers.post.UpdateAction', //使用“应用程序文件夹/controllers/post/UpdateAction.php”文件中的类来处理edit动作 ); } }
如上所示,我们使用了路径别名“application.controllers.post.UpdateAction”指定动作类文件为“protected/controllers/post/UpdateAction.php”。
通过编写基于类的动作,我们可以将应用组织为模块的风格。例如,如下目录结构可用于组织控制器相关代码:
protected/
controllers/
PostController.php
UserController.php
post/
CreateAction.php
ReadAction.php
UpdateAction.php
user/
CreateAction.php
ListAction.php
ProfileAction.php
UpdateAction.php
4、过滤器(filter)
过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。
一个动作可以有多个过滤器。如有多个过滤器,则按照它们出现在过滤器列表中的顺序依次执行。过滤器可以阻止动作及后面其他过滤器的执行。
过滤器可以定义为一个控制器类的方法。过滤器方法名必须以 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', //将postOnly过滤器应用于edit和create动作(这是基于方法的过滤器) array( //使用了数组来配置过滤器 'application.filters.PerformanceFilter - edit, create', //将application.filters.PerformanceFilter过滤器应用于除了edit和create之外的所有动作(这是基于对象的过滤器) 'unit'=>'second', //初始化过滤器对象中的unit属性值为second ), ); } }
上述代码指定了两个过滤器: postOnly 和 PerformanceFilter。 postOnly 过滤器是基于方法的(相应的过滤器方法已在 CController 中定义);而 performanceFilter 过滤器是基于对象的。路径别名 application.filters.PerformanceFilter 指定过滤器类文件是 protected/filters/PerformanceFilter。我们使用一个数组配置 PerformanceFilter ,这样它就可被用于初始化过滤器对象的属性值。此处 PerformanceFilter 的 unit 属性值将被初始为 second。
使用加减号,我们可指定哪些动作应该或不应该应用过滤器。上述代码中, postOnly 应只被应用于 edit 和 create 动作,而 PerformanceFilter 应被应用于 除了 edit 和 create 之外的动作。如果过滤器配置中没有使用加减号,则此过滤器将被应用于所有动作。
五、模型(Model)
模型是 CModel 或其子类的实例。模型用于保持数据以及与其相关的业务逻辑。
模型是单独的数据对象。它可以是数据表中的一行,或者一个用户输入的表单。
数据对象的每个字段对应模型中的一个属性。每个属性有一个标签(label),并且可以通过一系列规则进行验证。
Yii 实现了两种类型的模型:表单模型和 Active Record。二者均继承于相同的基类 CModel。
表单模型是 CFormModel 的实例。表单模型用于保持从用户的输入获取的数据。这些数据经常被获取,使用,然后丢弃。例如,在一个登录页面中,我们可以使用表单模型用于表示由最终用户提供的用户名和密码信息。
Active Record (AR) 是一种用于通过面向对象的风格抽象化数据库访问的设计模式。每个 AR 对象是一个 CActiveRecord 或其子类的实例。代表数据表中的一行。行中的字段对应 AR 对象中的属性。
六、视图
视图是一个包含了主要的用户交互元素的PHP脚本.
视图有一个名字,当渲染(render)时,名字会被用于识别视图脚本文件。视图的名称与其视图脚本名称是一样的。例如:视图 edit 的名称出自一个名为 edit.php 的脚本文件。要渲染时,需通过传递视图的名称调用 CController::render()。这个方法将在“protected/views/控制器ID”目录下寻找对应的视图文件。
在视图脚本内部,我们可以通过 $this 来访问控制器实例。我们可以在视图里以“$this->属性名”的方式获取控制器的任何属性。
我们也可以用以下 推送 的方式传递数据到视图里:
$this->render('edit', array( 'var1'=>$value1, 'var2'=>$value2, ));
在以上的方式中, render() 方法将提取数组的第二个参数到变量里。其产生的结果是,在视图脚本里,我们可以直接访问变量 $var1 和 $var2。
1、布局
布局是一种用来修饰视图的特殊的视图文件。它通常包含了用户界面中通用的一部分视图。例如:布局可以包含header和footer的部分,然后把内容嵌入其间。
......header here...... <?php echo $content; ?> ......footer here......
其中的 $content 则储存了内容视图的渲染结果。
当使用render()时,布局被隐式应用。视图脚本 protected/views/layouts/main.php 是默认的布局文件。这可以通过改变 CWebApplication::layout 进行自定义。要渲染一个不带布局的视图,则需调用 renderPartial() 。
2、小物件
小物件是 CWidget 或其子类的实例。它是一个主要用于表现数据的组件。小物件通常内嵌于一个视图来产生一些复杂而独立的用户界面。例如,一个日历小物件可用于渲染一个复杂的日历界面。小物件使用户界面更加可复用。
我们可以按如下视图脚本来使用一个小物件:
<?php $this->beginWidget('小物件类的路径别名'[,'包含属性初始化值的数组']); ?> ...可能会由小物件获取的内容主体... <?php $this->endWidget(); ?>
或者
<?php $this->widget('小物件类的路径别名'[,'包含属性初始化值的数组']); ?>
后者用于不需要任何 body 内容的组件。
小物件可通过配置来定制它的表现。这是通过调用 CBaseController::beginWidget 或 CBaseController::widget 设置其初始化属性值来完成的。
我们通过传递一个携带这些属性初始化值的数组来实现,该数组的键是属性的名称,而数组的值则是小物件属性所对应的值。如下所示 :
<?php $this->widget('CMaskedTextField',array( 'mask'=>'99/99/9999' )); ?>
继承 CWidget 并覆盖其init()和run()方法,可以定义一个新的小物件:
class MyWidget extends CWidget { public function init() { // 此方法会被 CController::beginWidget() 调用 } public function run() { // 此方法会被 CController::endWidget() 调用 } }
小物件可以像一个控制器一样拥有它自己的视图。
默认情况下,小物件的视图文件位于包含了小物件类文件目录的 views 子目录之下(protected/components/views)。这些视图可以通过调用CWidget::render()渲染,这一点和控制器很相似。唯一不同的是,小物件的视图没有布局文件支持。另外,小物件视图中的$this指向小物件实例而不是控制器实例。
3、系统视图
系统视图的渲染通常用于展示 Yii 的错误和日志信息。
系统视图的命名遵从了一些规则。比如像“errorXXX”这样的名称就是用于渲染展示错误号XXX的 CHttpException 的视图。例如,如果 CHttpException 抛出一个404错误,那么 error404 就会被显示。
在 framework/views 下, Yii 提供了一系列默认的系统视图. 他们可以通过在 protected/views/system 下创建同名视图文件进行自定义。
七、组件
Yii 应用建立于组件之上。组件是 CComponent 或其子类的实例。使用组件主要涉及访问它的属性以及触发或处理它的时间。基类 CComponent 指定了如何定义属性和事件。
1、组件属性
组件的属性就像对象的公共成员变量。它是可读写的。
要定义一个组件属性,我们只需在组件类中定义一个公共成员变量即可。
更灵活的方式是定义其 getter 和 setter 方法,例如:
public function getTextWidth() // 获取 textWidth 属性 { return $this->_textWidth; } public function setTextWidth($value) // 设置 TextWidth 属性 { $this->_textWidth=$value; }
上述代码定义了一个可写的属性名为 textWidth(名字是大小写不敏感的)。当读取属性时,getTextWidth() 就会被调用,其返回值则成为属性值;相似的,当写入属性时,setTextWidth() 被调用。如果 setter 方法没有定义,则属性将是只读的,如果对其写入则会抛出一个异常。使用 getter 和 setter 方法定义一个属性有一个好处:即当读取或写入属性时,可以执行额外的逻辑(例如,执行验证,触发事件)。
注意: 通过 getter/setter 定义的属性和类成员变量之间有一个细微的差异:属性的名字是大小写不敏感的, 而 类成员变量是大小写敏感的。
2、组件事件
组件事件是一些特殊的属性,它们使用一些称作 事件句柄(event handlers)的方法作为其值。分配一个方法到一个事件将会引起方法在事件被唤起处自动被调用。因此,一个组件的行为可能会被一种在部件开发过程中不可预见的方式修改。
组件事件以 on 开头的命名方式定义。和属性通过 getter/setter 方法来定义的命名方式一样,事件的名称是大小写不敏感的。以下代码定义了一个 onClicked 事件:
public function onClicked($event) { $this->raiseEvent('onClicked', $event); }
这里作为事件参数的 $event 是 CEvent 或其子类的实例。
我们可以分配一个方法到此事件,如下所示:
复制代码 代码如下:$component->onClicked=$callback;
这里的 $callback 指向了一个有效的 PHP 回调。它可以是一个全局函数也可以是类中的一个方法。如果是后者,它必须以一个数组的方式提供: array($object,'methodName')。
事件句柄的结构如下:
function 方法名($event) { ...... }
这里的 $event 即描述事件的参数(它来源于 raiseEvent() 调用)。$event 参数是 CEvent 或其子类的实例。至少,它包含了关于谁触发了此事件的信息。
事件句柄也可以是一个PHP 5.3以后支持的匿名函数。例如:
$component->onClicked=function($event) { ...... }
如果我们现在调用 onClicked(),onClicked 事件将被触发(在 onClicked() 中),附属的事件句柄将被自动调用。
一个事件可以绑定多个句柄。当事件触发时,这些句柄将被按照它们绑定到事件时的顺序依次执行。如果句柄决定组织后续句柄被执行,它会设置 $event->handled 为 true。
3、组件行为
组件已添加了对 mixin 的支持,并可以绑定一个或多个行为。行为是一个对象,其方法可以被它绑定的部件通过收集功能的方式来实现继承(inherited),而不是专有化继承(即普通的类继承)。一个部件可以以'多重继承'的方式实现多个行为的绑定。
行为类必须实现 IBehavior 接口。 大多数行为可以继承自 CBehavior 。如果一个行为需要绑定到一个模型, 它也可以从专为模型实现绑定特性的 CModelBehavior 或 CActiveRecordBehavior 继承。
要使用一个行为,它必须首先通过调用此行为的 attach() 方法绑定到一个组件。然后我们就可以通过组件调用此行为方法:
// $name 在组件中实现了对行为的唯一识别 $component->attachBehavior($name,$behavior); // test() 是行为中的方法。 $component->test();
已绑定的行为可以像一个组件中的普通属性一样访问。例如,如果一个名为 tree 的行为绑定到了一个组件,我们就可以通过如下代码获得指向此行为的引用。
$behavior=$component->tree; // 等于下行代码: // $behavior=$component->asa('tree');
行为是可以被临时禁止的,此时它的方法就会在组件中失效。例如:
$component->disableBehavior($name); // 下面的代码将抛出一个异常 $component->test(); $component->enableBehavior($name); // 现在就可以使用了 $component->test();
两个同名行为绑定到同一个组件下是有可能的。在这种情况下,先绑定的行为则拥有优先权。
当和 events, 一起使用时,行为会更加强大。当行为被绑定到组件时,行为里的一些方法就可以绑定到组件的一些事件上了。这样一来,行为就有机观察或者改变组件的常规执行流程。
一个行为的属性也可以通过绑定到的组件来访问。这些属性包含公共成员变量以及通过 getters 和/或 setters 方式设置的属性。例如, 若一个行为有一个 xyz 的属性,此行为被绑定到组件 $a,然后我们可以使用表达式 $a->xyz 访问此行为的属性。
八、模块
模块是一个独立的软件单元,它包含 模型, 视图, 控制器 和其他支持的组件。在许多方面上,模块看起来像一个应用。主要的区别就是模块不能单独部署,它必须存在于一个应用里。用户可以像他们访问普通应用的控制器那样访问模块中的控制器。
模块在一些场景里很有用。对大型应用来说,我们可能需要把它划分为几个模块,每个模块可以单独维护和部署。一些通用的功能,例如用户管理,评论管理,可以以模块的形式开发,这样他们就可以容易地在以后的项目中被复用。
1、创建模块
模块组织在一个目录中,目录名即为模块的唯一ID。模块目录的结构跟 应用基础目录 很相似。下面列出了一个 fourm 的模块的典型的目录结构:
forum/ 模块文件夹
ForumModule.php 模块类文件
components/ 包含可复用的用户组件
views/ 包含小物件的视图文件
controllers/ 包含控制器类文件
DefaultController.php 默认的控制器类文件
extensions/ 包含第三方扩展
models/ 包含模型类文件
views/ 包含控制器视图和布局文件
layouts/ 包含布局文件
default/ 包含 DefaultController 的视图文件
index.php 首页视图文件
模块必须有一个继承自 CWebModule 的模块类。类的名字通过表达式 ucfirst($id).'Module' 确定, 其中的 $id 代表模块的 ID (或者说模块的目录名字)。模块类是存储模块代码间可共享信息的中心位置。例如,我们可以使用 CWebModule::params 存储模块参数,使用 CWebModule::components 分享模块级的应用组件。
2、使用模块
要使用模块,首先将模块目录放在 应用基础目录的modules文件夹中。然后在应用的modules属性中声明模块ID。例如,为了使用上面的forum模块,我们可以使用如下应用配置:
return array( ...... 'modules'=>array('forum',...), ...... );
模块也可以在配置时带有初始属性值。做法和配置 应用组件 很类似。例如, forum 模块可以在其模块类中有一个名为 postPerPage 的属性,它可以在 应用配置 中配置如下:
return array( ...... 'modules'=>array( 'forum'=>array( 'postPerPage'=>20, ), ), ...... );
模块的实例可通过当前活动控制器的 module 属性访问。在模块实例中,我们可以访问在模块级中共享的信息。例如,为访问上面的 postPerPage 信息,我们可使用如下表达式:
$postPerPage=Yii::app()->controller->module->postPerPage; // 如如$this引用的是控制器实例,则可以使用下行语句 // $postPerPage=$this->module->postPerPage;
模块中的控制器动作可以通过路由“模块ID/控制器ID/动作ID”或“模块ID/存放控制器类文件的子目录名/控制器ID/动作ID”访问。例如,假设上面的 forum 模块有一个名为 PostController 的控制器,我们就可以通过路由 forum/post/create 访问此控制器中的 create 动作。此路由对应的 URL 即 http://www.example.com/index.php?r=forum/post/create。
3、嵌套的模块
模块可以无限级嵌套。这就是说,一个模块可以包含另一个模块,而这另一个模块又可以包含其他模块。我们称前者为 父模块 ,后者为子模块。子模块必须定义在其父模块的 modules 属性中,就像我们前面在应用配置中定义模块一样。
要访问子模块中的控制器动作,我们应使用路由 父模块ID/子模块ID/控制器ID/动作ID。
九、路径别名
Yii 中广泛的使用了路径别名。路径别名关联于一个目录或文件的路径。它以点号语法指定,类似于广泛使用的名字空间(namespace)格式:
RootAlias.path.to.target
其中的 RootAlias 是某个现存目录的别名,通过调用 YiiBase::setPathOfAlias(), 我们可以定义新的路径别名。为方便起见,Yii 预定义了以下几个根别名:
system: 表示 Yii 框架目录;
zii: 表示 Zii 库 目录;
application: 表示应用的 基础目录;
webroot: 表示 入口脚本 文件所在的目录。
ext: 表示包含了所有第三方 扩展 的目录。
额外的,如果应用使用了 模块, (Yii) 也为每个模块ID定义了根别名,指向相应模块的跟目录。
通过使用 YiiBase::getPathOfAlias(), 别名可以被翻译为其相应的路径。
使用别名可以很方便的导入类的定义。例如,如果我们想包含 CController 类的定义,我们可以调用如下代码
复制代码 代码如下:Yii::import('system.web.CController');
import方法跟 include 和 require 不同,它更加高效。导入(import)的类定义并不会真正被包含进来,直到它第一次被引用。多次导入同样的名字空间也会比 include_once 和 require_once 快得多。
我们还可以使用如下语法导入整个目录,这样此目录下的类文件就会在需要时被自动包含。
复制代码 代码如下:Yii::import('system.web.*');
除 import 外, 别名还在其他许多地方指向类。例如,路径别名可以传递给 Yii::createComponent() 以创建相应类的实例。即使类文件在之前从未被包含。
不要将路径别名和名字空间混淆了,名字空间是指对一些类名的一个逻辑组合,这样它们就可以相互区分开,即使有相同的名字。而路径别名是用于指向一个类文件或目录。路径别名与名字空间并不冲突。
十、开发规范
下面我们讲解 Yii 编程中推荐的开发规范。为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录。
1、URL
默认情况下,Yii 识别如下格式的 URL:
http://hostname/index.php?r=ControllerID/ActionID
r 变量意为 路由(route) ,它可以被Yii解析为 控制器和动作。如果 ActionID 被省略,控制器将使用默认的动作(在CController::defaultAction中定义);如果 ControllerID 也被省略(或者 r 变量不存在),应用将使用默认的控制器(在CWebApplication::defaultController中定义)。
通过 CUrlManager 的帮助,可以创建更加可识别,更加 SEO 友好的 URL,例如 http://hostname/ControllerID/ActionID.html。
2、代码
Yii 推荐命名变量、函数和类时使用驼峰风格,即每个单词的首字母大写并连在一起,中间无空格。变量名和函数名应该使它们的第一个单词全部小写,以使其区别于类名。对私有类成员变量来说,我们推荐以下划线作为其名字前缀(例如: $_actionList)。
コントローラー クラス名の特別なルールは、コントローラーという単語で終わる必要があることです。この場合、コントローラー ID はクラス名の最初の文字が小文字になり、コントローラーという単語が削除されます。たとえば、PageController クラスの ID は page です。このルールにより、アプリケーションの安全性が高まります。また、コントローラー関連の URL も簡素化されます (例: /index.php?r=PageController/index の代わりに /index.php?r=page/index)。
3. 構成
設定はキーと値のペアの配列です。各キーは構成されたオブジェクト内のプロパティ名を表し、各値は対応するプロパティの初期値です。
クラス内の書き込み可能なプロパティはすべて設定できます。構成されていない場合、プロパティはデフォルト値を使用します。プロパティを構成するときは、ドキュメントを読んで初期値が正しいことを確認することをお勧めします。
4. ファイル
ファイルの名前付けと使用に関する規則は、ファイルの種類によって異なります。
クラス ファイルには、そこに含まれるパブリック クラスにちなんで名前を付ける必要があります。たとえば、CController クラスは CController.php ファイルにあります。パブリック クラスは、他のクラスから使用できるクラスです。各クラス ファイルには、パブリック クラスを 1 つだけ含める必要があります。プライベート クラス (1 つのパブリック クラスでのみ使用できるクラス) は、それを使用するパブリック クラスと同じファイルに配置できます。
ビュー ファイルにはビューにちなんだ名前を付ける必要があります。たとえば、インデックス ビューは、index.php ファイルにあります。ビュー ファイルは、コンテンツのレンダリングに使用される HTML および PHP コードを含む PHP スクリプト ファイルです。
設定ファイルには任意の名前を付けることができます。構成ファイルは、構成を具体化する連想配列を返すことを主な目的とする PHP スクリプトです。
5. ディレクトリ
Yii は、さまざまな状況に応じて一連のデフォルトのディレクトリを想定しています。必要に応じて、各ディレクトリをカスタマイズできます。
WebRoot/protected: これはアプリケーションのベース ディレクトリであり、セキュリティに敏感なすべての PHP スクリプトとデータ ファイルが配置されます。 Yii には、このディレクトリを指すデフォルトのアプリケーションエイリアスがあります。このディレクトリとその中のファイルは、Web ユーザーによるアクセスから保護する必要があります。 CWebApplication::basePath を介してカスタマイズできます。
WebRoot/protected/runtime: このディレクトリには、アプリケーションの実行時に生成されるプライベート一時ファイルが含まれます。このディレクトリは、Web サーバー プロセスによって書き込み可能である必要があります。 CApplication::runtimePath を介してカスタマイズできます。
WebRoot/protected/extensions: このディレクトリには、すべてのサードパーティ拡張機能が格納されます。 CApplication::extensionPath を介してカスタマイズできます。
WebRoot/protected/modules: このディレクトリにはすべてのアプリケーション モジュールが含まれており、モジュールごとに 1 つのサブディレクトリが使用されます。
WebRoot/protected/controllers: このディレクトリには、すべてのコントローラー クラス ファイルが含まれています。 CWebApplication::controllerPath を介してカスタマイズできます。
WebRoot/protected/views: このディレクトリには、コントローラー ビュー、レイアウト ビュー、システム ビューを含むすべてのビュー ファイルが含まれます。 CWebApplication::viewPath を介してカスタマイズできます。
WebRoot/protected/views/ControllerID: このディレクトリには、個々のコントローラー クラスで使用されるビュー ファイルが配置されます。ここでのControllerIDはコントローラーのIDを指します。 CController::viewPath を介してカスタマイズできます。
WebRoot/protected/views/layouts: このディレクトリには、すべてのレイアウト ビュー ファイルが含まれます。 CWebApplication::layoutPath を介してカスタマイズできます。
WebRoot/protected/views/system: このディレクトリには、すべてのシステム ビュー ファイルが含まれます。システム ビュー ファイルは、例外とエラーを表示するために使用されるテンプレートです。 CWebApplication::systemViewPath を介してカスタマイズできます。
WebRoot/assets: このディレクトリにはパブリック リソース ファイルが配置されます。リソース ファイルは、Web ユーザーが公開してアクセスできるプライベート ファイルです。このディレクトリは、Web サーバー プロセスによって書き込み可能である必要があります。 CAssetManager::basePath を介してカスタマイズできます
WebRoot/themes: このディレクトリには、アプリケーションで使用されるさまざまなテーマが含まれています。各サブディレクトリはトピックであり、トピックの名前がディレクトリの名前になります。 CThemeManager::basePath を介してカスタマイズできます。
6. データベース
ほとんどの Web アプリケーションはデータベースによって駆動されます。テーブルと列に名前を付けるときは、次の命名規則を使用することをお勧めします。これらの仕様は Yii には必要ないことに注意してください。
㈠データベースのテーブル名とカラム名は小文字で付けられます。
(ii) 名前内の単語はアンダースコアで区切る必要があります (例: product_order)。
(iii) テーブル名には、単数形または複数形のいずれかを使用できます。ただし、両方を同時に使用しないでください。わかりやすくするために、単数形の名前を使用することをお勧めします。
(IV) テーブル名には、tbl_ などの共通の接頭辞を使用できます。これは、アプリケーションで使用されるテーブルが、別のアプリケーションで使用されるテーブルと同じデータベースに共存する場合に特に便利です。これら 2 つのアプリケーションのテーブルは、異なるテーブル接頭辞を使用することで簡単に区別できます。
Ⅱ、フォームを使用します
Yii でフォームを処理する場合、通常は次の手順が必要です:
1. 収集するデータフィールドを表すモデルクラスを作成します。
2. フォームの送信に応答するコントローラー アクションを作成します。
3. ビュースクリプト内にコントローラーアクションに関連するフォームを作成します。
1. モデルを作成します
在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则。模型类可用于记录这些信息。正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置。
取决于使用用户所输入数据的方式,我们可以创建两种类型的模型。如果用户输入被收集、使用然后丢弃,我们应该创建一个表单模型; 如果用户的输入被收集后要保存到数据库,我们应使用一个Active Record。两种类型的模型共享同样的基类 CModel ,它定义了表单所需的通用接口。
1、定义模型类
例如创建为一个表单模型:
class LoginForm extends CFormModel { public $username; public $password; public $rememberMe=false; }
LoginForm 中定义了三个属性: $username, $password 和 $rememberMe。他们用于保存用户输入的用户名和密码,还有用户是否想记住他的登录的选项。由于 $rememberMe 有一个默认的值 false,相应的选项在初始化显示在登录表单中时将是未勾选状态。
我们将这些成员变量称为特性(attributes)而不是属性(properties),以区别于普通的属性(properties)。特性(attribute)是一个主要用于存储来自用户输入或数据库数据的属性(propertiy)。
2、声明验证规则
一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。这是通过将用户的输入和一系列规则执行验证实现的。我们在 rules() 方法中指定这些验证规则,此方法应返回一个规则配置数组。
class LoginForm extends CFormModel { public $username; public $password; public $rememberMe=false; private $_identity; public function rules() { return array( array('username, password', 'required'), //username 和 password 为必填项 array('rememberMe', 'boolean'), //rememberMe 应该是一个布尔值 array('password', 'authenticate'), //password 应被验证(authenticated) ); } public function authenticate($attribute,$params) { $this->_identity=new UserIdentity($this->username,$this->password); if(!$this->_identity->authenticate()) $this->addError('password','错误的用户名或密码。'); } }
rules() 返回的每个规则必须是以下格式:
复制代码 代码如下:array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加选项)
其中:
AttributeList(特性列表)是需要通过此规则验证的特性列表字符串,每个特性名字由逗号分隔;
Validator(验证器) 指定要执行验证的种类;
on 参数是可选的,它指定此规则应被应用到的场景列表;
附加选项 是一个名值对数组,用于初始化相应验证器的属性值。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。