0


PHP框架 之YII2框架 (yii2 framework - Yii PHP Framework)

     又有新项目要撘框架,毫无意外的,我又被借调走了,又写一篇文章记录一下,这次讲的是:yii2 framework - Yii PHP Framework框架,有需要的同学自取,Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序,特别适合开发大型应用,如门户网站、社区、内容管理系统(CMS)、电子商务项目和 RESTful Web 服务

1.安转:

1.1Composer 安装:

(需要切换国内镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,科学上网的同学可以忽略这一步) 命令安装 Composer asset plugin,它是通过 Composer 管理 bower 和 npm 包所必须的,此命令全局生效,一劳永逸。 composer global require "fxp/composer-asset-plugin:~1.0.0"

1.1.1 基础版本

(basic作为指定目录:比如你本机的E:\phpstudy\PHPTutorial\WWW\myproject\yii)。 composer create-project --prefer-dist yiisoft/yii2-app-basic E:\phpstudy\PHPTutorial\WWW\myproject\yii 2.0.22

1.1.2 基础开发版本

composer create-project --prefer-dist --stability=dev yiisoft/yii-app-basic E:\phpstudy\PHPTutorial\WWW\myproject\yii 2.0.22

1.1.3完整版本(basic作为指定目录:比如你本机的E:/yii)

composer create-project --prefer-dist yiisoft/yii2 E:\phpstudy\PHPTutorial\WWW\myproject\yii 2.0.22

1.2官网下载安装(此种方式安装PHP版本必须大于8.1):

https://www.yiiframework.com/download

2.配置秘钥:

文件路径:yii\config\web.php

需要配置项:cookieValidationKey

3.目录结构:

basic 应用根目录
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 应用入口文件 yii Yii 控制台命令执行脚本

├── commands/ # 命令行工具
├── config/ # 配置文件
│ ├── console.php # 命令行应用程序配置
│ ├── db.php # 数据库配置
│ ├── params.php # 应用程序参数
│ ├── web.php # Web 应用程序配置
├── controllers/ # 控制器类
├── models/ # 模型类
├── runtime/ # 运行时文件(如日志和缓存)
├── views/ # 视图文件
│ ├── layouts/ # 布局文件
│ └── site/ # 默认控制器视图文件
├── web/ # Web 应用的根目录(入口文件和公共资源)
│ ├── .htaccess # Apache 重写规则
│ ├── index.php # Web 应用入口文件
│ └── assets/ # Web 资源(CSS, JS, 图片等)
├── yii # Yii 命令行工具
├── console.php # 命令行应用程序入口文件

4.nginx配置:

server {
        charset utf-8;
        client_max_body_size 128M;

        listen 80; ## listen for ipv4
        #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

        server_name frontend.test;
        root        /path/to/yii-application/frontend/web/; # 你的项目路径
        index       index.php;

        access_log  /path/to/yii-application/log/frontend-access.log; # nginx日志存放在项目目录下
        error_log   /path/to/yii-application/log/frontend-error.log;

        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ ^/assets/.*\.php$ {
                deny all;
        }

        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass 127.0.0.1:9000;
                try_files $uri =404;
        }
    
        location ~* /\. {
                deny all;
        }
}
     
server {
        charset utf-8;
        client_max_body_size 128M;
    
        listen 80; ## listen for ipv4
            
        server_name backend.test;
        root        /path/to/yii-application/backend/web/; # 你的项目路径
        index       index.php;
    
        access_log  /path/to/yii-application/log/backend-access.log;
        error_log   /path/to/yii-application/log/backend-error.log;
    
        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location ~ ^/assets/.*\.php$ {
                deny all;
        }

        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass 127.0.0.1:9000;
                 try_files $uri =404;
        }
    
        location ~* /\. {
                deny all;
            }
}

5.apach配置:

<VirtualHost *:80>
        DocumentRoot "E:\phpstudy\PHPTutorial\WWW\myproject\yii"
        ServerName www.yi.com
        ServerAlias 
        <Directory "E:\phpstudy\PHPTutorial\WWW\myproject\yii">
                Options FollowSymLinks ExecCGI
                AllowOverride All
                Order allow,deny
                Allow from all
                Require all granted
        </Directory>
</VirtualHost>

5.路由:

访问:域名/web/index.php
URL访问规则:index.php?r=路由 传参使用&参数=值 的方式

比如:
访问方式一:http://www.yi.com/web/index.php?Site/index
访问方式二:http://www.yi.com/web/index?r=site/index
带参数访问:http://www.yi.com/web/index.php?r=users/index&uid=2

Site 表示:SiteController
index 表示(方法名的命名要用action为前缀,且用驼峰法):public function actionIndex(){}

路由文件:/web/目录下添加.htaccess文件
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d # 如果是一个目录或者文件,就访问目录或文件
RewriteCond %{REQUEST_FILENAME} !-f # 如果文件存在,就直接访问文件,不进行下面的RewriteRule
RewriteRule . index.php [L] # 路由重写

路由美化(yii\config\web.php)
打开前路由:http://www.yi.com/web/index.php?Site/index
打开后路由:http://www.yi.com/web/site/index

//设置规则
'urlManager' => [
'enablePrettyUrl' => true, //是否启用 URL 美化(路径友好化).
'showScriptName' => false, //是否或略脚本名index.php
'rules' => [
],
],

'urlManager' => [
'enablePrettyUrl' => true, //是否启用 URL 美化(路径友好化).
'showScriptName' => false, //是否或略脚本名index.php
'enableStrictParsing' => false,//是否开启严格解析路由
'suffix' => null,
'rules' => [
//匹配通用带
'index' => 'site/index',
//匹配通用的url
'controller:\w+/action:\w+/id:\d+' => '<controller>/<action>',
],
],

打开前路由:http://www.yi.com/web/index.php?Site/index
打开后路由(rules:可以设置路由指定路由规则):http://www.yi.com/web/index

7.控制器(Controller):

//获取GET数据
$getData = Yii::$app->request->get('key', 'default');
//获取POST数据
$postData = Yii::$app->request->post('key', 'default');

//跳转
url = '';
$this->redirect($url);

//页面渲染(和TP框架的渲染方式一样):参数一表示页面;参数二渲染数据数组
return $this->display('transfer', ['project' => $model]);

//行为控制器
public function behaviors()
{
        return [
            'access' => [
                    'class' => \yii\filters\AccessControl::className(),
                    'only' => $this->actions, // 针对哪些方法有效,默认所有
                    'except' => $this->except, // 针对哪些方法不进行控制
                    'rules' => [
                            [
                                    'allow' => false,
                                    'actions' => empty($this->mustlogin) ? [] : $this->mustlogin,
                                    'roles' => ['?'] // 未登录用户默认均不可访问
                            ],
                            [
                   'allow' => true,
                   'actions' => empty($this->mustlogin) ? [] : $this->mustlogin,
                             'roles' => ['@'] // 登陆用户默认均可访问
              ]
          ]
      ],
      'verbs' => [
           'class' => \yii\filters\VerbFilter::className(),
           'actions' => $this->verbs, // 针对某些方法限制其访问方式
      ]
    ];
}
<?php
namespace app\controllers;

use app\models\User;
use Yii;
use yii\web\Controller;
use app\models\Users;

Class UsersController extends Controller{
    //初始化
    public function __construct($id, $module, $config = [])
    {
        parent::__construct($id, $module, $config);
    }

    //测试(访问地址:http://www.yi.com/web/index.php?r=users/index&id=1)
    public static function actionIndex(){
        $uid = Yii::$app->request->get('uid', '1');
        $userid = Users::getdatone($uid);
        var_dump($userid);die;
    }

    //sum,max,min,average 测试
    public function actionData_test(){
        //加法
        $data_sum = Users::find()->sum('age');
        var_dump($data_sum);
        echo '<br>------<br/>';

        //最大值
        $data_max = Users::find()->max('age');
        var_dump($data_max);
        echo '<br>------<br/>';

        //最小值
        $data_min = Users::find()->min('age');
        var_dump($data_min);
        echo '<br>------<br/>';

        //平均值
        $data_average = Users::find()->average('age');
        var_dump($data_average);
        echo '<br>------<br/>';
    }
    

    //一对一(访问地址:http://www.yi.com/web/index.php?r=users/actionGetextendone&id=3)
    public static function actionGetextendone(){
        $id = Yii::$app->request->get("id",1);
        $customer =  Users::findone($id);
        $phone = $customer->getUserextendone()->asArray()->one();
        var_dump($phone);die;
    }

    //一对多(访问地址:http://www.yi.com/web/index.php?r=users/getextendmore&id=3)
    public static function actionGetextendmore(){
        $id = Yii::$app->request->get("id",1);
        $customer =  Users::findone($id);
        $phone = $customer->getUserextendmore()->asArray()->all();
        var_dump($phone);die;
    }
}
?>

8.模型(Model):

绑定数据表(GOlang实现绑定数据表和验证规则 是通过接口interface一起实现的)
public static function tableName()
{
        return '{{%数据表名}}';
}

验证规则(GOlang实现绑定数据表和验证规则 是通过接口interface一起实现的)
public function rules()
{
        return [
                [['encode_id', 'title', 'status', 'creater_id'], 'required'],
                [['type', 'sort'], 'filter', 'filter' => 'intval'], //此规则必须,否则就算模型里该字段没有修改,也会出现在脏属性里
                [['encode_id'], 'string', 'max' => 50],
                [['title', 'remark'], 'string', 'max' => 250],
                [['encode_id'], 'unique'],
                [['created_at', 'updated_at'], 'safe'],
        ];
}

字段字典(相当于备注)
public function attributeLabels()
{
        return [
                'id' => 'ID',
                'encode_id' => '加密id',
                'title' => '项目名称',
                'remark' => '项目描述',
                'sort' => '项目排序',
                'status' => '项目状态',
                'type' => '项目类型',
                'creater_id' => '创建者id',
                'updater_id' => '更新者id',
                'created_at' => '创建时间',
                'updated_at' => '更新时间',
        ];
}
<?php
namespace app\models;
use yii\db\ActiveRecord;

class Users extends ActiveRecord
{
    //初始化表名
    public static function tableName()
    {
        return '{{%users}}';
    }

    //查询方法
    public static function getdatone($uid=1){
        return self::find()->where("id= {$uid}")->exists();
    }

    //一对一
    public function getUserextendone()
    {
        return $this->hasOne(Userextend::className(), ['user_id' => 'id']);
    }

    //一对多
    public function getUserextendmore()
    {
        return $this->hasMany(Userextend::className(), ['user_id' => 'id']);
    }
}
?>

8.视图(Views):

要显示纯文本,先调用 yii\helpers\Html::encode() 进行转码(防止注入和跨站脚本)

替代语法(里面的条件、循环和TP和CI框架一致):{{}}
例如:{{$变量名}}

替代语法(里面的条件、循环和TP和CI框架一致):<?php ?>

渲染语法:
yii\base\Controller::render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
yii\base\Controller::renderPartial(): 渲染一个 视图名 并且不使用布局。
yii\web\Controller::renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
yii\base\Controller::renderFile(): 渲染一个视图文件目录或别名下的视图文件。

例如(渲染一个名称为"view"的视图并使用布局 ):
namespace app\controllers; 
use Yii; use app\models\Post; 
use yii\web\Controller; 
use yii\web\NotFoundHttpException; 
class PostController extends Controller{ 
    public function actionView($id) { 
        $model = Post::findOne($id); 
        if ($model === null) { 
                throw new NotFoundHttpException; //错误抛出
        }
        return $this->render('view', [ 'model' => $model, ]); 
    } 
}

9.数据库:

关键词:
one() // 根据查询结果返回查询的第一条记录。
User::find()->one();
all() // 根据查询结果返回所有记录。
User::find()->all();

count() // 返回记录的数量。
User::find()->count();

sum() // 返回指定列的总数。

average() // 返回指定列的平均值。
User::find()->average();

min() // 返回指定列的最小值。
User::find()->min();

max() // 返回指定列的最大值。
User::find()->max();

scalar() // 返回查询结果的第一行中的第一列的值。
User::find()->scalar();

column() // 返回查询结果中的第一列的值。
User::find()->column();

exists() // 返回一个值,该值指示查询结果是否有数据。
User::find()->exists();

where() // 添加查询条件
User::find()->where($condition)->asArray()->one(); // 根据条件以数组形式返回一条数据
User::find()->where($condition)->asArray()->all(); // 根据条件以数组形式返回所有数据
User::find()->where($condition)->asArray()->orderBy('id DESC')->all(); // 根据条件以数组形式返回所有数据,并根据ID倒序

with() // 该查询应执行的关系列表。
$UserList = User::find()->with('orders', 'country')->all();

joinWith // 该查询应执行的关系列表。
$UserList = User::find()->joinWith('orders')->all();

with方式原理流程:
总共执行了2条SQL语句: A) 先执行主表SQL:SELECT * FROM order B) 再执行关联表SQL:SELECT * FROM user WHERE user_id IN (1,2,…) C) 再通过关联表SQL数据进行内存分配到各自的主表的每条数据上。

joinWith方式:
流程和with一样。只有A步骤不一样,A步骤的主表查询出使用的是关联SQL查询,如 SELECT * FROM order LEFT JOIN user ON order.user_id=user.id

indexBy() // 根据索引的列的名称查询结果。

asArray() // 以数组的形式返回每条记录。
User::find()->asArray()->one(); // 以数组形式返回一条数据
User::find()->asArray()->all(); // 以数组形式返回所有数据

10.关联模型:

ActiveRecord::hasOne() //一对一模型 返回对应关系的单条记录

ActiveRecord::hasMany() //一对多模型 返回对应关系的多条记录

    到这里,框架的基础知识就讲得差不多了,其他的就是舔砖加瓦的工作了,大家自行补全
标签: php 开发语言

本文转载自: https://blog.csdn.net/masterphp/article/details/139002547
版权归原作者 masterphp 所有, 如有侵权,请联系我们删除。

“PHP框架 之YII2框架 (yii2 framework - Yii PHP Framework)”的评论:

还没有评论