Yii 框架学习--02 进阶

应用结构

入口文件

文件位置: web/index.php

<?php

//开启debug,应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈
defined('YII_DEBUG') or define('YII_DEBUG', true);

//环境定义
defined('YII_ENV') or define('YII_ENV', 'dev'); //dev,prod

// 注册 Composer 自动加载器
require(__DIR__ . '/../vendor/autoload.php');

// 包含 Yii 类文件
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

// 加载应用配置
$config = require(__DIR__ . '/../config/web.php');

// 创建、配置、运行一个应用
(new yii\web\Application($config))->run();

需要注意的是,如果想通过命令行方式(cli)访问应用,入口文件是根目录下的yii。里面的内容实质是php代码,与config/web.php类似。Windows下请使用yii.bat。该文件在Linux下需要有执行权限,这样用户就能通过命令./yii <route> [arguments] [options] 来运行cli应用。

配置文件

config/web.php

下面列出全部配置属性,实际项目请选择性配置。

<?php

//加载全局配置文件
$params = require(__DIR__ . '/params.php');

//配置开始
$config = [
    /* 必要属性 */
    'id' => 'basic', //用来区分其他应用的唯一标识ID。主要给程序使用
    'basePath' => dirname(__DIR__), //指定该应用的根目录。根目录包含应用系统所有受保护的源代码。 在根目录下可以看到对应MVC设计模式的models, views, controllers等子目录

    /* 重要属性 */
    'aliases' => [
        '@name1' => 'path/to/path1',
        '@name2' => 'path/to/path2',
    ], //使用这个属性来定义别名,代替 Yii::setAlias() 方法来设置
    'bootstrap' => ['log'], //指定启动阶段yii\base\Application::bootstrap()需要运行的组件
    'catchAll' => [
        'offline/notice',
        'param1' => 'value1',
        'param2' => 'value2',
    ], //重定向所有请求到某个控制器方法,通常用于系统维护
    'components' => [
        'request' => [
            'cookieValidationKey' => 'test',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'useFileTransport' => true,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => require(__DIR__ . '/db.php'),
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ], //注册多个在其他地方使用的应用组件
    'controllerMap' => [
        [
            'account' => 'app\controllers\UserController',
            'article' => [
                'class' => 'app\controllers\PostController',
                'enableCsrfValidation' => false,
            ],
        ],
    ], //重映射控制器ID到任意控制器类
    'language'=> 'en', //语言
    'modules' => [
        // "booking" 模块以及对应的类
        'booking' => 'app\modules\booking\BookingModule',

        // "comment" 模块以及对应的配置数组
        'comment' => [
            'class' => 'app\modules\comment\CommentModule',
            'db' => 'db',
        ],
    ], //指定应用所包含的 模块
    'name' => '', //给终端用户展示的应用名称,可选
    'version' => '1.0', //版本,可选
    'sourceLanguage' => 'en', //应用代码的语言,可选
    'timeZone' => 'Asia/Shanghai', //默认时区,可选
    'params' => $params, //全局通用参数

    /* 实用属性 : 通常使用系统默认值 */
    'charset' => 'UTF-8', //默认值为 'UTF-8'
    'defaultRoute' => 'site', //对于网页应用,默认值为 'site' 对应 SiteController 控制器,并使用默认的动作
    'extensions' => [
        [
            'name' => 'extension name',
            'version' => 'version number',
            'bootstrap' => 'BootstrapClassName',  // 可选配,可为配置数组
            'alias' => [  // 可选配
                '@alias1' => 'to/path1',
                '@alias2' => 'to/path2',
            ],
        ],
    ], //指定应用安装和使用的 扩展,默认自动生成和维护更新
    'layout' => 'main', // 视图 默认使用的布局名字,默认值为 'main' 对应布局路径下的 main.php 文件
    'layoutPath' => 'layouts', // 布局文件的路径,默认值为 视图路径 下的 layouts 子目录
    'runtimePath' => '@app/runtime', //指定临时文件如日志文件、缓存文件等保存路径,默认值为带别名的 @app/runtime
    'viewPath' => '@app/views', //视图文件的根目录,默认值为带别名的 @app/views
    'vendorPath' => '@app/vendor', //第三方库。 默认值为带别名的 @app/vendor
    'enableCoreCommands' => true, //是否启用Yii中的核心命令,默认值为 true

    /* 应用事件:类似于钩子 */
    'on beforeRequest' => function ($event) {
    // ...
    },
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // 允许访问的 IP 地址
    ];
}

return $config;

使用配置:

components:使用\Yii::$app->ComponentID 全局访问
params:\Yii::$app->params['key']

使用GII

gii是yii提供的代码自动生成器,可以通过简单的输入生成ControllerModelView等文件代码,并提供代码预览功能。

开启gii需要将 YII_ENV_DEV 设为 true:

defined('YII_ENV') or define('YII_ENV', 'dev');

我们通过 URL 访问 Gii:http://hostname/index.php?r=gii

由于Gii 是 Yii 中的一个模块。可以通过配置应用的 yii\base\Application::modules 属性开启它。通常来讲在 config/web.php 文件中会有以下配置代码:

$config = [ ... ];

if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // 允许访问的 IP 地址,可选
    ];
}

这段配置表明,如果当前是开发环境,应用会包含 gii 模块,模块类是 yii\gii\Module

关于GII的用法请查看:http://www.yiichina.com/doc/guide/2.0/start-gii

数据库连接

切换数据库

默认使用的是config/db.php里的数据库配置。配置连接组件后Yii里可以使用以下语法访问:

$connection = \Yii::$app->db;

同理,我们可以修改config/web.php

return [
    // ...
    'components' => [
        'db' => require(__DIR__ . '/db.php'),
        'db2' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=testdb',
            'username' => 'demo',
            'password' => 'demo',
        ],
];

定义多个数据库连接配置。

Model里:
通过重写 yii\db\ActiveRecord::getDb() 方法切换数据库连接:

class Customer extends ActiveRecord
{
    // ...

    public static function getDb()
    {
        return \Yii::$app->db2;  // 使用名为 "db2" 的应用组件
    }
}

http://www.yiichina.com/doc/guide/2.0/db-active-record

使用SQL直接操作数据库

ActiveRecord 提供了数据库与模型(MVC 中的 M,Model) 的交互,QueryBuilder 用于创建动态的查询语句。

yii除了可以使用模型对象的方式(ORM)操作数据库外,还可以使用原生的SQL语句。通过yii\db\Command::createCommand可以执行SQL语句。

查询:

$connection = \Yii::$app->db;

//返回DataReader对象,需要使用yii\db\DataReader解析
$data = $connection->createCommand('SELECT * FROM post')->query();
$rows = $data->readAll(); //返回数组

//查询返回多行:(数组)
$command = $connection->createCommand('SELECT * FROM post');
$posts = $command->queryAll();  

//返回单行:(数组)
$command = $connection->createCommand('SELECT * FROM post WHERE id=1');
$post = $command->queryOne();  

//返回某个字段的集合:未指定字段返回第一个字段(数组)
$command = $connection->createCommand('SELECT title FROM post');
$titles = $command->queryColumn();  

//查询标量值/计算值:  (标量)
$command = $connection->createCommand('SELECT COUNT(*) FROM post');
$postCount = $command->queryScalar();  

可以使用insert,update,delete 方法,这些方法会根据参数生成合适的SQL并执行:

// INSERT
$connection->createCommand()->insert('user', [
    'name' => 'Sam',
    'age' => 30,
])->execute();

// INSERT 一次插入多行
$connection->createCommand()->batchInsert('user', ['name', 'age'], [
    ['Tom', 30],
    ['Jane', 20],
    ['Linda', 25],
])->execute();

// UPDATE
$connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();

// DELETE
$connection->createCommand()->delete('user', 'status = 0')->execute();

预处理语句

为安全传递查询参数可以使用预处理语句,首先应当使用:placeholder占位,再将变量绑定到对应占位符:

$command = $connection->createCommand('SELECT * FROM post WHERE id=:id');
$command->bindValue(':id', $_GET['id']);
$post = $command->query();
另一种用法是准备一次预处理语句而执行多次查询:

$command = $connection->createCommand('DELETE FROM post WHERE id=:id');
$command->bindParam(':id', $id);

$id = 1;
$command->execute();

$id = 2;
$command->execute();

切换数据库类型

修改config/web.php

return [
    // ...
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=mydatabase', // MySQL, MariaDB
            //'dsn' => 'sqlite:/path/to/database/file', // SQLite
            //'dsn' => 'pgsql:host=localhost;port=5432;dbname=mydatabase', // PostgreSQL
            //'dsn' => 'cubrid:dbname=demodb;host=localhost;port=33000', // CUBRID
            //'dsn' => 'sqlsrv:Server=localhost;Database=mydatabase', // MS SQL Server, sqlsrv driver
            //'dsn' => 'dblib:host=localhost;dbname=mydatabase', // MS SQL Server, dblib driver
            //'dsn' => 'mssql:host=localhost;dbname=mydatabase', // MS SQL Server, mssql driver
            //'dsn' => 'oci:dbname=//localhost:1521/mydatabase', // Oracle
            'username' => 'root', //数据库用户名
            'password' => '', //数据库密码
            'charset' => 'utf8',
        ],
    ],
    // ...
];

http://www.yiichina.com/doc/guide/2.0/db-dao

数据库复制和读写分离

很多数据库支持数据库复制 database replication来提高可用性和响应速度. 在数据库复制中,数据总是从主服务器 到 从服务器. 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行.

通过配置yii\db\Connection可以实现数据库复制和读写分离.

[
    'class' => 'yii\db\Connection',

    // 配置主服务器
    'dsn' => 'dsn for master server',
    'username' => 'master',
    'password' => '',

    // 配置从服务器
    'slaveConfig' => [
        'username' => 'slave',
        'password' => '',
        'attributes' => [
            // use a smaller connection timeout
            PDO::ATTR_TIMEOUT => 10,
        ],
    ],

    // 配置从服务器组
    'slaves' => [
        ['dsn' => 'dsn for slave server 1'],
        ['dsn' => 'dsn for slave server 2'],
        ['dsn' => 'dsn for slave server 3'],
        ['dsn' => 'dsn for slave server 4'],
    ],
]

以上的配置实现了一主多从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成。调用者无须关心。

http://www.yiichina.com/doc/guide/2.0/db-dao

类库扩展

新建helper

示例:新建一个Utils类。该文件可以在任何目录,例如 @app/components

我们在根目录新建components文件夹,并新建components/Utils.php:

<?php

namespace yii\helpers;

class Utils{

    public static function test() {
        echo 'test';
    }
}

引入:
在应用程序入口文件(index.php)处,在引入的 yii.php 文件后面 添加以下代码行,用 Yii 自动加载器 来加载自定义类 代替框架的原始助手类:

Yii::$classMap['yii\helpers\Utils'] = '@app/components/Utils.php';

未完待续。。。

时间: 2024-10-21 14:08:21

Yii 框架学习--02 进阶的相关文章

PHP的Yii框架中View视图的使用进阶_php技巧

视图名 渲染视图时,可指定一个视图名或视图文件路径/别名,大多数情况下使用前者因为前者简洁灵活, 我们称用名字的视图为 视图名. 视图名可以依据以下规则到对应的视图文件路径: 视图名可省略文件扩展名,这种情况下使用 .php 作为扩展, 视图名 about 对应到 about.php 文件名: 视图名以双斜杠 // 开头,对应的视图文件路径为 @app/views/ViewName, 也就是说视图文件在 yii\base\Application::viewPath 路径下找, 例如 //site

在Mac OS上搭建PHP的Yii框架及相关测试环境_php实例

YII集成了单元测试和功能测试,借助phpunit和selenium实现.笔者在配置过程中遇到了不少麻烦,纪录在此. 必要概念 seleniumselenium是个著名的自动化测试工具,可以调起本地的浏览器来完成测试,所以可以用来自动化测试web项目.selenium分为服务端和客户端,服务端使用java开发,所以需要一个jdk,服务端在启动时,会启动一个http服务,客户端通过与服务端进行http通信,向服务端发起测试请求,服务端会自动调起浏览器完成测试.测试人员负责编写客户端脚本,支持大部分

YII 框架相关收藏

YII YII Framework学习教程-YII的日志 - mr.coke - 博客园 Yii中的错误及异常处理 - 生命不息 折腾不息 - ITeye技术网站 yii 错误处理 - 一束光的日志 - 网易博客 yii之Log(日志)使用 - 郑星阳 - ITeye技术网站 yii获取当前url和域名 | 恋香缘 Yii的常用URL和渲染方法 - guoxiaoqian8028的专栏 - 博客频道 - CSDN.NET yii 路由 - xiaoguozi's Blog - C++博客 Yii

使用Composer安装Yii框架的方法_php实例

本文实例讲述了使用Composer安装Yii框架的方法.分享给大家供大家参考,具体如下: 现在流行使用Composer安装PHP框架,Composer是PHP用来管理依赖关系的工具,Yii,Laravel,七牛等框架或服务都用Composer作为安装的首选工具. 下面以下载安装Yii框架为例学习使用Composer安装PHP框架: 首先去Composer下载安装这个工具. 通过 Composer 安装 Yii 这是安装Yii2.0的首选方法.如果你还没有安装Composer,你可以按照这里的说明

详解PHP的Yii框架中扩展的安装与使用_php技巧

扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包.例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加一个方便用于调试的工具栏, 帮助你简单地抓取页面生成的情况. 你可以使用扩展来加速你的开发过程. 信息:本文中我们使用的术语 "扩展" 特指 Yii 软件包.而用术语 "软件包" 和 "库" 指代非 Yii 专用的通常意义上的软件包.使用扩展 要使用扩展,你要先安装它.大多数扩展以 Compose

实例讲解如何在PHP的Yii框架中进行错误和异常处理_php技巧

Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler,set_error_handler实现的.通过这两个PHP内置函数,可以对程序中未捕获的异常以及错误进行接管处理,从而提高程序的可维护性.这在大型系统是至关重要的,当发生错误时,我们希望能将相关详细信息记录,甚至是即时发送报警,从而缩短故障修复时间,提高整个系统的稳定性. 默认情况下,Yii会将异常处理分配给CApplication::handleException,

全面解读PHP的Yii框架中的日志功能_php技巧

Yii页面级日志开启在 Main.php中 log段添加. 下面显示页面日志 array( 'class'=>'CWebLogRoute', 'levels'=>'trace', //级别为trace 'categories'=>'system.db.*' //只显示关于数据库信息,包括数据库连接,数据库执行语句 ), 完整如下: 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=&

解析PHP的Yii框架中cookie和session功能的相关操作_php技巧

Sessions 和 请求 和 响应类似, 默认可通过为yii\web\Session 实例的session 应用组件 来访问sessions. 开启和关闭 Sessions 可使用以下代码来开启和关闭session. $session = Yii::$app->session; // 检查session是否开启 if ($session->isActive) ... // 开启session $session->open(); // 关闭session $session->clo

Yii框架中jquery表单验证插件用法示例_php实例

本文实例讲述了Yii框架中jquery表单验证插件用法.分享给大家供大家参考,具体如下: 运行效果图如下: 视图层: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtm