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

2024-05-28 06:52
文章标签 php 框架 yii framework yii2

本文主要是介绍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 ipv6server_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 ipv4server_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.comServerAlias <Directory "E:\phpstudy\PHPTutorial\WWW\myproject\yii">Options FollowSymLinks ExecCGIAllowOverride AllOrder allow,denyAllow from allRequire 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](http://user.id)

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

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

10.关联模型:

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

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

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

这篇关于PHP框架 之YII2框架 (yii2 framework - Yii PHP Framework)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009844

相关文章

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War