PHP框架之Yii

Yii框架的学习笔记

参考链接Click

1. Yii的工作流

不知道你怎么感觉,我反正是越来越觉得它和spring很像!


Yii 应用在处理用户请求时典型的工作流:

描述:

  1. 用户发出了访问 URL http://www.example.com/index.php?r=post/show&id=1 的请求, Web 服务器通过执行入口脚本index.php 处理此请求。
  2. 入口脚本创建了一个应用实例并执行。
  3. 应用从一个叫做 request 的应用组件 中获得了用户请求的详细信息。
  4. 应用在一个名叫 urlManager 的应用组件的帮助下,决定请求的控制器和动作。在这个例子中,控制器是 post,它代表 PostController 类; 动作是 show ,其实际含义由控制器决定。
  5. 应用创建了一个所请求控制器的实例以进一步处理用户请求。控制器决定了动作 show 指向控制器类中的一个名为 actionShow的方法。然后它创建并持行了与动作关联的过滤器(例如访问控制,基准测试)。 如果过滤器允许,动作将被执行。
  6. 动作从数据库中读取一个 ID为 1 的 Post 模型。
  7. 动作通过 Post 模型渲染一个名为 show 的 视图。
  8. 视图读取并显示 Post 模型的属性。
  9. 视图执行一些小物件。
  10. 视图的渲染结果被插入一个布局。
  11. 动作完成视图渲染并将其呈现给用户。

Yii 应用在处理用户请求时典型的工作流

Yii WEB应用

主应用实例(CWebApplication)

Yii 采用 MVC(模型-视图-控制器),首先是入口脚本和主应用程序类 CWebApplication 类。应用类的实例由 入口脚本创建为一个对象(Singleton)。这个应用单例对象可以在任何地方通过 Yii::app() 访问。

我们通常需要提供一个配置文件 (或数组) 以创建应用实例时初始化其属性值。通常在一个单独的 PHP 脚本(protected/config/config.php)中保存这些配置。在脚本中, 我们通过以下方式返回此配置数组:

应用组件

应用的功能可以通过其灵活的组件结构轻易地自定义或增强。应用管理了一系列应用组件,每个组件实现一特定功能。 例如,应用通过 CUrlManager 和 CHttpRequest 的帮助解析来自用户的请求。

要访问一个应用组件,使用 Yii::app()->ComponentID ,其中的 ComponentID 是指组件的 ID(例如 Yii::app()->log)。 (注意:可以结合后面的内容一起理解)

应用的组件可以通过在其配置中设置 enabled 为 false 禁用。当我们访问被禁用的组件时将返回 Null。

路由

用户访问网页的 URL 的基本格式为 /index.php?r=XController/YAction , 对应到代码为 protected 目录下 controllers 子目录下的 XController.php 中定义的的类 XController 的 YAction 方法。 例如,路由 post/edit 代表 PostController 及其 edit 动作。默认情况下,URL http://hostname/index.php?r=post/edit 即请求此控制器和动作。 模型(CModel类) 模型是 CModel 或其子类的实例。模型用于保持数据以及与其相关的业务逻辑.

视图View

视图是一个包含了主要的用户交互元素的 PHP 脚本.他可以包含 PHP 语句,但是我们建议这些语句不要去改变数据模型,且最好能够保持其单纯性(单纯作为视图)。为了实现逻辑和界面分离,大段的逻辑应该被放置于控制器或模型中,而不是视图中。
布局是一种用来修饰视图的特殊的视图文件.它通常包含了用户界面中通用的一部分视图.例如:布局可以包含 header 和 footer 的部分,然后把内容嵌入其间.

......header here......
<?php echo $content; ?>
......footer here......

其中的 $content 则储存了内容视图的渲染结果.

当使用 render() 时,布局被隐式应用.视图脚本 protected/views/layouts/main.php 是默认的布局文件.这可以通过改变 CWebApplication::layout 或者 CWebApplication::layout 进行自定义。要渲染一个不带布局的视图,则需调用 renderPartial() 。

应用添加日志

1.创建配置文件 protected/config/config.php

<?php
/**
 * 入口的主要配置文件
 */
return array(
    'name' => 'My YiiSmarty Test',
    'defaultController' => 'game',

    ///---------------------------------logconfig-------------------------------------///
    'preload' => array('log'), // log组件在应用启动时预启动
    'components' => array(

        'log' => array(
            'class' => 'CLogRouter',
            'routes' => array(
                array(
                    'class' => 'CFileLogRoute',
                    'levels' => 'trace,info',
                    'categories' => 'info.*',                   
                    'maxFileSize'=>1048576,//单文件最大1G
                    'logFile'=>'info.log', 
                ),
                array(
                    'class' => 'CFileLogRoute',
                    'categories' => 'error.*',
                    'levels' => 'error,warning',
                    'maxFileSize'=>1048576,//单文件最大1G
                    'logFile'=>'error.log',
                ),
            )

        )
    )
);

?>

2.修改入口脚本 index.php ,配置主应用实例使用新创建的配置文件。

<?php


$yii=dirname(__FILE__).'./framework/yii.php';

$config=dirname(__FILE__).'/protected/config/config.php';
// 包含Yii引导文件
require_once($yii);
// 发布应用时,去掉下面代码避免产生调试信息
defined('YII_DEBUG') or define('YII_DEBUG',true);

// 创建一个应用实例并执行   注意这里传入了config的配置信息的WebApplication
Yii::createWebApplication($config)->run();
/*
 *  Yii 采用 MVC(模型-视图-控制器),并介绍了入口脚本和主应用程序类 CWebApplication 类。
 *  应用类的实例由 入口脚本 创建为一个对象(Singleton)。这个应用单例对象可以在任何地方通过 Yii::app() 访问。
 *  !!!这个对象作用于应用的全局。
 * 
 * */

?>

3.创建 protected/runtime

4.这样就可以使用 Yii::log 或 Yii::trace 为应用添加日志。
区别是后者只在当应用程序运行在 调试模式(debug mode) 中时才会记录信息。
Yii::log( message, level, category);Yii::trace( message, $category);
当记录信息时,我们需要指定它的分类和级别 分类是一段格式类似于 路径别名 的字符串。 例如,如果一条信息是在 CController 中记录的,我们可以使用 system.web.CController 作为分类。信息级别应该是下列值中的一种:
trace: 这是在 Yii::trace 中使用的级别。它用于在开发中 跟踪程序的执行流程。
info: 这个用于记录普通的信息。
profile: 这个是性能概述(profile)。
warning: 这个用于警告(warning)信息。
error: 这个用于致命错误(fatal error)信息。
Yii 的日志通过 Level 和 Category 进行分类和过滤,正如我们所提到的, 多个级别或分类应使用逗号连接。 由于信息分类是类似 xxx.yyy.zzz 格式的,我们可以将其视为一个分类层级。 具体地,我们说 xxx 是 xxx.yyy 的父级,而 xxx.yyy 又是 xxx.yyy.zzz 的父级。 这样我们就可以使用 xxx.* 表示分类 xxx 及其所有的子级和孙级分类。

日志的调用样例:


public function actionIndex()
    {
        Yii::log("action","info","site.action");
        $this->render("index");
    }

5.运行应用,可以看到 Yii 在 protected/runtime 创建了一个 application.log

注: 日志存放的位置和文件名都可以通过配置来修改,一般情况使用缺省值就可以了。

URL 管理

Web 应用程序完整的 URL 管理包括两个方面。首先, 当用户请求约定的 URL,应用程序需要解析它变成可以理解的参数。第二,应用程序需求提供一种创造 URL 的方法,以便创建的 URL 应用程序可以理解的。
对于 Yii 应用程序,这些通过 CUrlManager 辅助完成。

   'urlManager'=>array(
            'urlFormat'=>'path',
            'rules'=>array(
                'game/guess/<g:\w>'=>'game/guess',

            ),
        ),      

指定的 URL 规则,我们必须设定 urlManager 应用元件的属性 rules.

数据库-Active Record

Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
在配置文件中配置model目录
‘import’=>array(
‘application.models.*’,
),
AR 类定义:


 class  BaseApp extends CActiveRecord
    {
        //默认的方法 必须有
        public static function model($className=__CLASS__)
        {
            return parent::model($className);
        }

        public function tableName()
        {
            return 'Employee';
        }

    }

数据表行中列的值可以作为相应 AR 实例的属性访问。

$baseApp = new BaseApp();
$baseApp->name='yii';
$baseApp->version='1.0';
$baseApp->save();


    $post=Post::model()->findByPk(10); // 假设有一个帖子,其 ID 为 10
    $post->delete(); // 从数据表中删除此行

 // 查找满足指定条件的结果中的第一行
    $post=Post::model()->find($condition,$params);
    // 查找具有指定主键值的那一行
    $post=Post::model()->findByPk($postID,$condition,$params);
    // 查找具有指定属性值的行
    $post=Post::model()->findByAttributes($attributes,$condition,$params);
    // 通过指定的 SQL 语句查找结果中的第一行
    $post=Post::model()->findBySql($sql,$params);  


    $post=Post::model()->findByPk(10);
    $post->title='new post title';
    $post->save(); // 将更改保存到数据库

警示:
使用 Active Record 的便利是以性能为代价的,通常情况下使用 Active Record 与使用DAO读写数据库性能相比要差一个级别。

关于Dao 链接数据库 Click

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值