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 Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

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

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