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

相关文章

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

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简