yii简明教程

使用composer安装yii

//composer的安装和介绍

composer global require "fxp/composer-asset-plugin:^1.2.0"

//到web根目录创建名为learnyii项目
cd  /Users/free/www/
composer create-project yiisoft/yii2-app-basic learnyii 2.0.16

我的工作习惯会配置一个虚机以www为根目录,再配置一个虚机以当前开发中的项目为根目录,配置如下:

// /usr/local/etc/nginx/nginx.conf文件中最后一行 } 大括号前增加下面这句

include servers/*;

// vi /usr/local/etc/nginx/servers/dtest
// 我的www根目录
server {
    listen 80;
    server_name  www.dtest.com;
    root /Users/free/www/;
    
    access_log /usr/local/var/logs/nginx/default.access.log;
    location / {
    if (!-e $request_filename){
        rewrite ^/(.*) /index.php last;
    }
    index index.html index.htm index.php;
    autoindex on;
    include /usr/local/etc/nginx/conf.d/php-fpm;
    }
}

// vi /usr/local/etc/nginx/servers/dtemp
//当前学习yii的项目【learnyii】
server {
    listen 80;
    server_name  www.dtemp.com;
    root /Users/free/www/learnyii/web/;
    
    access_log /usr/local/var/logs/nginx/dtemp.access.log;
    location / {
        if (!-e $request_filename){
            rewrite ^/(.*) /index.php last;
        }
        index index.html index.htm index.php;
        autoindex on;
        include /usr/local/etc/nginx/conf.d/php-fpm;
    }
}



配置好虚机,nginx重新加载配置

sudo nginx -s reload

yii 环境要求检查,是否满足条件查看

//从浏览器中可以看到支持情况
http://www.dtest.com/learnyii/requirements.php
//项目查看
http://www.dtemp.com/

应用结构【我创建的项目名为learnyii】:

learnyii/                  应用根目录
    composer.json       Composer 配置文件, 描述包信息
    config/             包含应用配置及其它配置
        console.php     控制台应用配置信息
        web.php         Web 应用配置信息
    commands/           包含控制台命令类
    controllers/        包含控制器类
    models/             包含模型类
    runtime/            包含 Yii 在运行时生成的文件,例如日志和缓存文件
    vendor/             包含已经安装的 Composer 包,包括 Yii 框架自身
    views/              包含视图文件
    web/                Web 应用根目录,包含 Web 入口文件
        assets/         包含 Yii 发布的资源文件(javascript 和 css)
        index.php       应用入口文件  //所以nginx虚机web根目录设置为/Users/free/www/learnyii/web/
    yii                 Yii 控制台命令执行脚本

Yii 实现了模型-视图-控制器 (MVC)设计模式

请求框架处理过程

请求到learnyii/web/index.php这个入口文件,该文件会加载框架应用主体,加载框架封装好的方法和类,根据请求路径,会有路由模块进行解析交给对应的控制器下的action方法进行处理,通过model类可以方便地操作数据库,拿到数据之后交给视图去显示这些数据,在视图中调用小部件【系统封装的方法和类】可以省去自己编写某些样式和结构的时间。

命名空间

新建项目learnyii,site控制器index action作为默认控制器和处理方法,可以看到命名空间为app\controllers,app对应learnyii文件夹代表开发主目录,controllers对应controllers文件夹,命名空间和文件夹的这样清楚的对应关系对自动加载类十分方便。拿到命名空间就可以确定类所在文件夹和文件。规则:控制器大写字母开头,Controller结尾,继承Controller,处理方法以action开头,方法名大写。如actionIndex为Index处理方法


命名空间.png

创建自己的控制器,在controllers文件夹中创建TestController.php,访问http://www.dtemp.com/?r=test/index

<?php

namespace app\controllers;

use yii\web\Controller;

class TestController extends Controller
{

    public function actionIndex()
    {
       echo "test me";
    }

}

处理请求之获取请求参数

//\Yii这个全局类的静态变量$app包含请求组件request
$request = \Yii::$app->request;
var_dump($request->get()); //打印所有get请求参数
var_dump($request->post());//打印所有post请求参数
var_dump($request->get('name',''));//如果没有传入name参数则为空串
//request组件的isGet变量可以判断请求动作类型
if($request->isGet{
   echo 'get 请求';
}
//用户ip
echo $request->userIP; 
//该组件还可以获取用户userAgent等等,很强大

返回响应数据之设置响应

php 原生有些方法可以设置响应头,在框架项目中yii对返回响应做了封装,我们可以使用response对响应做一些设置。
//响应组件
$response = \Yii::$app->response;
//设置http响应码
$response->statusCode=500;

使用视图显示数据

我们使用 echo "test me"; 可以在页面显示这句话,实际页面有丰富的文字、图片等,我们不可能全部放在控制器中利用echo 打印出来。yii为我们准备了视图。

//第一个参数是指明要渲染的页面路径和名称,第二个参数是要传入到视图文件的变量
//yii的规则是到控制器为名称的文件夹中寻找名为index【可以任意起名】的文件
//该控制器名为TestController,所以会去views下的test文件夹中寻找index.php

return $this->renderPartial('index',['name'=>'pipagg','age'=>18]);

views/test/index.php 内容:

我的名字 <?= $name ;?><br/>
年龄<?= $age ;?>

render和renderPartial的区别就是前者会将视图内容嵌入到一个layout文件中,默认layout为views/layouts/main.php。我们很多页面都有相同的部分,比如底部备案信息,联系方式等,我们不需要每个页面都写一遍,只要写在一个文件中,然后在需要这部分内容的页面使用该layout即可。

return $this->render('index',['name'=>'pipagg','age'=>18]);
//创建自己的layout views/test/mylayout.php
$this->layout='mylayout';
return $this->render('index',['name'=>'pipagg','age'=>18]);

我们可以指定自己的layout,在views/layouts/创建mylayout.php 内容:

我是公共头部 <br/><br/>
<?= $content ?><br/><br/>
我是公共底部

操作数据库,增删改查

cd ~/www/learnyii/config
vi db.php
//内容如下:
<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=learnyii',
    'username' => 'freeuser',
    'password' => 'free99',
    'charset' => 'utf8',
];

//创建 learnyii 数据库,创建mems表
CREATE TABLE `mems` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
  `mobile` char(11) DEFAULT '' COMMENT '手机号',
  `email` varchar(60) DEFAULT '',
  `salt` char(6) DEFAULT '',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户表'

//新建mems 表对应的 model,yii中使用model操作数据库,
<?php
namespace app\models;

class Mems extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'mems';
    }
}
//\yii\db\ActiveRecord这个类封装类操作数据库的方法
vi ~/www/learnyii/controllers/TestController.php
开头加 use app\models\Mems;
//actionIndex中加入创建一条用户记录
$mem = new Mems();
$mem->name = 'pipagg';
var_dump($mem->save());

//[查询name为pipagg的记录](https://www.yiichina.com/doc/api/2.0/yii-db-activerecord#find()-detail)
$mem = Mems::find('name=:n',array(':n'=>'pipagg'))->asArray()->one();
//$mem = Mems::find()->where(['name' => 'pipagg'])->one();

//更为灵活的方式
$mem = Mems::findBySql('select * from '.Mems::tableName().' where name=:n',array(':n'=>'pipagg'))->asArray()->one();
var_dump($mem);
//如果不使用asArray(),返回的则为ActiveRecord的对象,
//也就可以使用该对象的所有方法,比如更新方法update()
$mem = Mems::find()->where(['name' => 'pipagg'])->one();
$mem->name = 'pipaggcn';
var_dump($mem->update());
//以上查询方法都使用了'name=:n',array(':n'=>'pipagg')这种结构,是为了避免sql注入,yii封装的方法会防止sql注入
//sql注入的简单形式:
// select * from mems where uid=1 or 1=1  用户传入的uid为 '1 or 1=1'
//查询出来再进行删除
$mem = Mems::find()->where(['name' => 'sky'])->one()->delete();
var_dump($mem);
//删除uid大于1的所有记录
var_dump(Mems::deleteAll('uid >:u',array(':u'=>1)));

文档解释
find()会创建用来查询的yii\db\ActiveQueryInterface 实例。
并返回 yii\db\ActiveQueryInterface实例,该类包含asArray()和one()方法,调用asArray()返回$this,所以可以再调用one()

asArray() 设置是否按数组而不是活动记录返回查询结果。
return  $this;查询对象本身
one() 查询结果的单行,取决于asArray() 的设置,
查询结果可以是数组或活动记录对象,如果查询没有结果将返回 null

where 条件可以写的很复杂

$mems = Mems::find()->where(['like', 'name', 'pipagg'])->asArray()->all();
var_dump($mems);

session操作

点击理解session和cookie

$session = \Yii::$app->session;
$isactive = $session->getIsActive();
var_dump($isactive);
$session->open();
$isactive = $session->getIsActive();
var_dump($isactive);
var_dump($session->get('name'));  //NULL
$session->set('name','pipagg');  //设置键为name 值为pipagg
var_dump($session->get('name')); //获取键为name的值

cookie操作response类中包含cookie操作方法,该方法接收cookie类进行操作

//cookie操作
$cookies= \Yii::$app->response->cookies;
$cookies->add(new Cookie(['name'=>'mem','value'=>'pipagg']));

总结:

yii框架目录结构清晰,学习之前可以让自己先感觉下什么是MVC,为什么要使用这种结构,从php基础到简易MVC,跟着教程了解下,或者直接使用yii去感受MVC,再尝试自己构建一个MVC框架。yii的类封装层级不是很扁平,想要应用特别熟练,还需动手写项目,要了解框架源码会更需要耐心。yii2的类文档十分清楚,在使用yii方法时要注意参数是哪个系统类还是普通数据类型,返回值是哪个系统类还是普通类型,能够级联操作的原因就是返回的是类对象,可以再次调用该对象的方法。本教程输入yii简单入门,程序地址:
https://github.com/onerole1024/learnyii.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • PHP学习线路图 PHP教程 PHP教程PHP简介PHP环境设置PHP语法概述PHP变量类型PHP常量类型 PHP...
    茶茶点阅读 773评论 1 4
  • 一、入口文件 入口文件内容:一般格式如下: 二、主配置文件 保存位置:你的应用/protected/config/...
    layjoy阅读 1,200评论 4 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 1、PHP语言的一大优势是跨平台,什么是跨平台?一、PHP基础: PHP的运行环境最优搭配为Apache+MySQ...
    __书山有路__阅读 1,479评论 0 15
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,067评论 4 62