YiiFramework入门知识点总结(图文教程)

网络推广 2025-04-05 13:42www.168986.cn网络推广竞价

本文将为您深入浅出地介绍YiiFramework的入门知识点。如果您对YiiFramework充满好奇,那么本文将是您绝佳的参考资料。

我们来如何创建Yii应用骨架。在web作为网站根目录的前提下,通过运行命令“yiic webapp /web/demo”,即可轻松搭建Yii应用的基础架构。在此过程中,您会发现创建应用的步骤相当直观和简单。

接下来,我们将重点关注在使用GII创建model和CURD时需要注意的事项。在Model Generator操作中,即使您的表有前缀,也请在Table Name中填写表的全名,包括表前缀。而在Crud Generator操作中,您需要在Model Class中填写正确的model名称,首字母大写。如果您要为news、newstype、statustype这三个表生成CURD控制器,那么在Model Generator中,务必确保Model Class中输入的名称与文件名大小写一致。

在创建模块时,也需要注意一些细节。通过GII创建模块时,Module ID一般使用小写。这个ID将决定main.php配置文件中的配置。您需要确保在配置文件中,Module ID与创建模块时填写的大小写一致。对于指向的文件或目录路径,建议在Windows OS中,尽量保持与实际目录一致,以确保系统的正常运行。

我们来谈谈路由问题。在YiiFramework中,路由的指向非常重要。您需要明确知道system表示的是Yii框架的framework目录,而application则代表您创建的应用的protected目录。当您需要引用某个具体的文件或类时,如application.modules.Admin.AdminModule,这实际上是指向应用程序目录下modules目录中Admin目录下的AdminModules.php文件。同样,system.db表示的是YII框架下的framework目录下的db目录。

aessRules说明在控制器中

该控制器中的aessRules方法定义了访问控制规则,这些规则被"aessControl"过滤器所使用。它返回一个包含多个规则元素的数组,这些规则元素明确了不同用户对于不同操作的访问权限。

第一个规则允许所有用户执行'index'和'view'操作。这意味着无论用户身份如何,他们都可以访问index和view方法。这是通过定义一个允许规则并将操作设置为'index'和'view',同时将用户列表设置为空数组来实现的,表示对所有用户开放。

接下来,第二个规则允许经过身份验证的用户执行'create'和'update'操作。这意味着只有登录的用户才能创建和更新内容。规则同样定义了允许的操作('create'和'update'),并将用户列表设置为'@',表示只有经过身份验证的用户才能执行这些操作。

第三个规则进一步细分权限,只允许管理员用户执行'admin'和'delete'操作。这对于需要高级权限的管理任务非常有用。规则中的操作被设置为'admin'和'delete',同时用户列表指定为管理员用户,表示只有管理员能够执行这些操作。

第四个规则是一个拒绝所有用户的规则。这是一个基本的防护措施,确保某些区域或功能不被未经授权的用户访问。通过定义一个拒绝规则并将用户列表设置为空数组来实现这一点。

在任何地方,您都可以通过强大的Yii框架中的 `Yii::app()->user` 来访问用户状态。这在您的代码中也得到了很好的体现。让我们来看一下具体的代码段。

```php

public function beforeSave() {

if(parent::beforeSave()) { // 如果父类的beforeSave方法执行成功

if($this->isNewRecord) { // 如果是新记录

$this->password = md5($this->password); // 密码进行MD5加密处理

// 获取当前登录用户的ID,并设置到创建用户ID字段上

$this->create_user_id = Yii::app()->user->id;

$this->create_time = date('Y-m-d H:i:s'); // 设置创建时间为当前时间

} else { // 如果不是新记录,是更新操作

$this->update_user_id = Yii::app()->user->id; // 更新操作的用户ID为当前登录用户ID

$this->update_time = date('Y-m-d H:i:s'); // 更新时间为当前时间

}

return true; // 返回true表示保存操作可以执行

} else {

return false; // 返回false表示保存操作无法执行

}

}

```

接下来是关于 `UserIdentity` 类的部分,这个类主要负责用户的身份验证:

```php

// UserIdentity 类是用来标识用户的数据模型,它包含用于验证身份的方法。

class UserIdentity extends CUserIdentity {

// 这个方法用于验证用户身份。示例实现是检查用户名和密码是否都是 'demo'。在实际应用中,应该修改为从数据库或其他持久性存储中验证用户身份。

public function authenticate() {

$username = strtolower($this->username); // 将用户名转为小写形式进行验证

$user = User::model()->find("LOWER(username)=?", array($username)); // 从数据库中查找用户信息

if ($user === null) { // 如果找不到用户信息,设置错误代码为无效的用户名错误。

$this->errorCode = self::ERROR_USERNAME_INVALID;

} else {

// 这里原先的代码有误,应该是 $user->validatePassword($this->password),而不是 User::model()->validatePassword($this->password)。修改后验证用户密码是否正确。如果密码不正确,设置错误代码为无效的密码错误;否则设置用户ID和用户名并返回无错误状态。

if (!$user->validatePassword($this->password)) {

$this->errorCode = self::ERROR_PASSWORD_INVALID;

} else {

$this->_id = $user->id;

$this->username = $user->username;

$this->errorCode = self::ERROR_NONE;

}

}

return $this->errorCode === self::ERROR_NONE; // 返回是否验证成功的结果

}

// getId方法用于获取用户的ID

public function getId() {

return $this->_id;

}

}

```

当登陆账号的ID得以确认时,程序开始了它的生命周期中的某个环节。它记录下这一刻的时间戳,精确到秒。如果这是一个新创建的账号,`create_time`字段会被赋予当前的时间标记;如果是一个已有账号的更新操作,那么`update_user_id`会被设置为当前用户的ID,同时记录下更新的时间。这一切完成后,返回成功信号。但如果在处理过程中出现任何不符合预期的情况,程序会默默返回失败的结果。这是背后的逻辑在默默运行,确保每一个操作都有迹可循。

在一个更大的框架内,比如基于Yii框架的某个组件中,我们看到了关于属性和事件的协议实现。每一个组件都有它自己的属性和方法。通过getter和setter方法,我们可以轻松获取或设置这些属性。例如,通过调用`getText()`方法,我们可以获取组件的文本属性;通过调用`setText('abc')`方法,我们可以设置组件的文本属性为'abc'。这种设计使得代码更加简洁明了。在此基础上,我们进一步添加了getUrl方法,用于生成组件的URL链接。这个方法利用Yii框架提供的工具,根据组件的id和title属性生成一个可访问的URL。

在模型的rules方法中,我们定义了属性的验证规则。这些规则在模型实例调用validate或save方法时执行。重要的是,我们只验证用户输入的属性。那些通过代码或数据库设定的属性,如id、作者id等,不需要进行验证。这些规则确保了数据的完整性和准确性。例如,新闻标题的长度被限制在128个字符以内,新闻内容的长度被限制在8000个字符以内。其他一些字段如创建时间、更新时间等被视为安全字段,它们不需要验证。这些字段通常由系统自动生成并维护。

这些代码段是程序运行的关键部分,它们确保了系统的正常运行和数据的安全。每一个细节都经过了精心设计和考虑,以确保用户能够在一个安全、可靠的环境中与系统进行交互。

关于非表单提供数据的验证与处理

在Yii框架的News.php模型中,我们有一个名为rules()的方法。这个方法为我们提供了模型属性的验证规则。让我们深入了解下这个方法是如何工作的。

你需要明确一点:你只需为那些将接收用户输入的属性定义规则。对于没有在rules()方法中验证的数据,尤其是没有在表单中提供的数据,一定要加入到safe中,否则将无法成功写入数据库。这是一个重要的注意事项,确保我们数据的完整性和安全性。

下面是rules()方法的代码示例:

```php

public function rules()

{

return array(

array('news_title, news_content', 'required'), // 标题和内容为必填项

array('news_title', 'length', 'max' => 128, 'encoding' => 'utf-8'), // 标题最大长度为128个字符,编码为utf-8

array('news_content', 'length', 'max' => 8000, 'encoding' => 'utf-8'), // 内容最大长度为8000个字符,编码为utf-8

array('author_name', 'length', 'max' => 10, 'encoding' => 'utf-8'), // 作者名最大长度为10个字符,编码为utf-8

array('status_id, type_id', 'safe'), // status_id和type_id属性安全,无需验证

// 下面的规则用于搜索。请移除那些不应被搜索的属性。

array('id, news_title, news_content, author_name, type_id, status_id', 'safe', 'on' => 'search'),

);

}

```

接下来,让我们在视图中如何显示动态内容。这是一个非常重要的部分,因为它能帮助我们实现数据的实时更新和展示。以下是三种常见的方法:

1. 直接在视图文件中使用PHP代码实现。例如,要显示当前时间,你可以这样写:``。

2. 在控制器中实现内容的显示,然后通过render()方法的第二个参数将内容传递给视图。例如:

```php

$theTime = date("Y-m-d H:i:s");

$this->render('helloWorld', array('time' => $theTime));

```

在视图文件中,你可以这样使用传递过来的时间:``。这里,render()方法的第二个参数是一个数组,其中的键是提供给视图脚本的变量名,值则是相应的数据。

3. 视图和控制器是紧密关联的。你可以在控制器中定义一个类的公共属性,而不是局部变量,然后在视图中通过$this访问这个类的属性。例如,你可以在控制器中设置一个公共属性来存储当前日期和时间,然后在视图中通过$this访问这个属性。

关于视图命名约定,一般建议视图文件的命名与ActionID相同。但请记住,这只是一个推荐的命名约定。实际上,你只需要将文件名字作为第一个参数传递给render()就可以了。

关于数据库操作,以下是两个示例:

```php

$Prerfp = Prerfp::model()->findAll(array('limit' => '5', 'order' => 'releasetime desc'));

$model = Finishrfp::model()->findAll(array('select' => 'panyname,title,releasetime', 'order' => 'releasetime desc', 'limit' => 10));

foreach($model as $val){

$noticeArr[] = "在".$val->title."竞标中,".$val->panyname."中标。";

}

```

让我们看看如何获取通知的特定信息。使用特定的查询参数,我们可以轻松地从数据库中提取数据。例如,要获取状态为待处理的通知内容,我们可以这样操作:

```php

$model = Cgnotice::model();

$model->findAll(array(

'select' => 'status, content, updatetime', // 选择需要的字段

'condition' => 'status = :status', // 设置查询条件

'params' => array(':status' => 0), // 传递参数值

'order' => 'updatetime desc', // 设置排序规则

'limit' => 10 // 限制返回结果数量

));

foreach($model as $val){

$noticeArr[] = $val->content; // 将内容添加到数组中

}

```

接下来,我们要查找特定用户名对应的用户信息。我们可以使用大小写不敏感的匹配方式来查找用户名:

```php

$user = User::model()->find('LOWER(username)=?', array($username)); // 使用小写用户名进行查找

```

我们还可以根据特定的字典类型来获取通知类型信息:

```php

$noticetype = Dictionary::model()->find(array(

'condition' => '`type` = "noticetype"' // 设置查询条件获取特定类型数据

));

```

对于更复杂的查询需求,我们可以使用CDbCriteria实例或数组来指定查询条件。这样,我们可以构建更复杂的查询逻辑,而不仅仅是简单的WHERE子句。例如:

```php

$criteria = new CDbCriteria; // 创建CDbCriteria实例

$criteria->select = 'title'; // 仅选择标题列

$criteria->condition = 'postID=:postID'; // 设置查询条件

$criteria->params = array(':postID' => 10); // 设置参数值

$post = Post::model()->find($criteria); // 执行查询

```

当我们使用CDbCriteria实例时,可以直接在实例中设置所有的查询参数,无需再通过数组传递参数值。这种方法更加直观和灵活。传递数组也是一种有效的替代方法。无论是哪种方式,最终都能帮助我们轻松地从数据库中检索所需的信息。在编程的世界里,数组是数据结构的基石,其键和值分别对应着标准(criterion)的属性名和值。让我们以一段PHP代码为例,深入数组的键和值如何映射到标准属性。

假设我们正在使用某种模型(例如名为“Post”的模型)来查询数据库中的特定条目。这个查询可能看起来像这样:

```php

$post = Post::model()->find(array(

'select' => 'title',

'condition' => 'postID=:postID',

'params' => array(':postID' => 10),

));

```

在这个例子中,数组的键如 'select', 'condition', 和 'params' 对应着查询数据库的标准(criterion)的属性名。而它们的值,如 'title', ':postID=>10' 等则是这些属性的具体值。通过这种方式,我们可以明确地告诉模型我们想要执行什么样的查询。

接下来,让我们看一些关于链接、组件、路径等方面的代码。

关于链接的创建,有两种方式可以实现。第一种使用CHtml的link()方法,第二种使用CController的createUrl()方法。两种方法都可以创建链接,但具体实现和用法有所不同,具体细节需要查阅相关的API文档。这两种方法的目的是生成一个指向特定页面的链接,可能包含一些动态参数,如ID等。

在视图中,有时会使用组件来封装一些特定的功能或展示内容。例如,在视图中底部有一段代码 `$this->widget ('Notice');`。这行代码调用了一个名为“Notice”的组件。打开相应的文件,我们发现它继承自CPortlet类,这是一个用于创建可重用组件的类。在组件内部,可以通过调用`renderContent()`方法来渲染特定的视图,如这里的`banner`视图。要了解更多关于CPortlet和其他相关类的信息,建议查阅API文档。

获取当前host的信息对于构建URL或处理网络请求非常重要。在Yii框架中,可以通过`Yii::app()->request->getServerName()`或`$_SERVER['HTTP_HOST']`来获取当前host的信息。然后,我们可以使用这个信息来构建指向特定操作的URL,例如激活电子邮件的URL。

关于在使用CKeditor扩展时遇到的问题,我们可以使用Yii的widget机制来轻松集成CKeditor到我们的应用中。在这个例子中,我们创建了一个CKkceditor的widget实例,并传递了一些参数,如模型、属性、高度、宽度、文件路径等。这些参数允许我们定制CKeditor的行为和外观。关于路径问题,需要注意的是路径的格式和拼写需要仔细核对,确保应用的正常运行。

以上内容是对原文的深入理解与重新表述,希望能够帮助你更好地理解和掌握这些概念。在Yii框架的PHP程序设计之旅中,我们经常需要处理一些基础设置和路径问题。当你执行命令 `echo Yii::app()->baseUrl;` 时,如果项目目录位于 `d:\root\blog` 目录下,你将得到 `/blog` 作为结果。这里需要注意的是,路径并不包含反斜杠,这是Yii框架在处理URL时的惯例。

在网站根目录结构中,有两个重要的概念需要区分:basePath 和 baseUrl。basePath 通常指的是项目的物理路径,即你的文件存放在服务器上的位置;而 baseUrl 则是你访问网站时所使用的。理解这两个概念对于基于Yii框架的PHP开发至关重要。

除了这些基础设置,还有一些关于控制器和模型的交互问题。在一个名为A的控制器对应的视图中,如果你想调用B模型中的方法,你可以使用 `B::model()->方法名()` 的方式来调用。这种结构体现了Yii框架的模型-视图-控制器(MVC)设计模式,有助于保持代码的清晰和模块化。

还有一些重要的API需要开发者熟悉和掌握。比如 `CHtml` API,它是Yii框架中用于处理HTML的实用工具集,可以帮助开发者更高效地生成和处理HTML代码。掌握这些API对于提高开发效率和代码质量非常有帮助。

我想强调的是,本文所述内容仅为一些基础知识和常见操作。在基于Yii框架的PHP程序设计过程中,还有许多复杂和深入的内容需要学习和。即使是一个初学者,掌握了这些基础知识后,也能开始构建自己的Yii应用程序了。`cambrian.render('body')` 这行代码可能是特定项目或框架中的特定用法,需要结合具体的开发环境和文档来理解其含义和作用。希望本文能对你在Yii框架下的PHP程序设计有所启发和帮助。

上一篇:你敢面对未知的挑战吗 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by