YII2 初来乍到 在 2013 年,2014 年 YII2 刚刚发布的年份,YII2 被大家追逐的原因大概是面向对象数据,包加载的扩展属性,自带 Gii 自动化生成工具,清爽的 View 界面和工具包...我们以 YII2 工程为例,官方推荐的 Advanced 模版中有一个公共工程 common 那我们是不是应该把项目中可以共用的数据层都放到 common 里? ?...YII2-模块.png 如上图,passport 和 admin 两个模块,如果都涉及同一张 User 表,依据复制优于依赖的原则,没有必要公用一个 User 类,可以单独存放为两个 User 类,用命名空间做隔离...更何况因为模块不一样,即使同一个数据表对象,相关的数据操作也会不一样。...总结 看看程序语言的发展脉络,以及前后端发展的变革,可以总结出两个词:演变和趋势。在应用程序开发中,前端这个职位是从后端细化和演变而来的,前后端分离和独立就是技术的趋势。
复用随时要想到(小挂件) 编码的原则是尽最大努力让代码复用,尤其是小挂件,它让视图层实现了复用,小挂件的使用非常简单 1、在@app下建立一个文件夹components 2、在components内建立一个挂件类...为视图的PHP代码增加一个try 在写action或模型方法的时候,为了保证代码的稳定性,我们一般都会用try....catch语法结构,但是在yii2的视图内很少有人用,记住,也要用!...使用迁移脚本 我说过了很多次,本篇还是要说一次,对于一个yii2程序的数据库部分请用migration来管理。 并且这些脚本应该一起放到到你的版本控制里,记住,迁移脚本一般包含两个部分。...另外在做迁移脚本的时候,如果你的表有前缀,那么在脚本里的写法如下 {{%user}}// discuz_user 时间问题 使用yii2开发mysql类web应用的时候,数据表的时间类字段我们喜欢用时间戳...当然从理念上说也有点不同 行为 一些类附加的属性 父类 一些类共同的属性 我的用法(不一定就是对的),尤其在模块中我喜欢为控制器增加一层父类。
场景设置 yii中有对场景的定义,定义场景可以使得yii在不同的情况下返回不同的数据信息。用model的scenarios()方法来设置返回数据。...标签设置 在处理表单时,多用$model->attributes属性来表示全部的属性。...使用$res[n]->btable->attr来引用B表的对应属性。...13.使用ActiveForm创建表单 yii2中使用小部件创建view视图的步骤: 设置一个Model设置其属性 public $username; public $password; 设置其rule...在ActiveForm中如果数据表中有了此字段,就不要再用public声明一个属性了,会导致attribute无法赋值。。。。(血泪)。
考虑一个场景,一个函数需对相同表进行多次查询,多次查询中有部分查询条件相同。对于这种情况,Yii2和thinkphp5的实现方式要格外小心。...在Yii2中,可以直接使用clone 复用共同的查询条件,但是thinkphp5的话,必须把相同条件再重复写一次。 例如,需要查询总有效文章数,以及今日发布有效文章数。 Yii2 版本 ?...可以看出,clone model 之后,内部query其实还是同一个。虽然是在clone出来不同的两个model添加查询条件,但是最终都是添加在相同的query当做。...查看query对象的属性,只有builder,connection是对象,但是connection我们希望在整个请求中是一个单实例,所以没必要区分。...到此,对于一开始的使用场景,thinkphp5也可以使用clone完成 ? 在这其中有几点需要注意: 对象clone之后,其属性执行的是浅拷贝!!
1、Yii2所有的操作都是对象操作。所有的对象都继承Yii中的Object对象。TP中,有对象也有函数。TP中的各个对象没有明显的继承关系。各自为类,定义不同的属性以及方法。...2、Yii2架构组织明确,同一类的对象必定有一个父类,在父类中定义相同的方法。在TP中,同一类对象没有什么继承关系,有的完全没有任何关系,内部提供的一些方法也不同。...YII2中,数据model时跟数据表完全映射的。一个model对象就是一条数据记录。对象的属性数据就是记录中各字段的内容。TP5中,数据model时一数据表的操作对象。提供一些数据操作方法而已。...Yii2中,new model(),然后调用save()方法,这个model就是一个完整的数据表记录,数据表的多有字段映射成为对象属性。TP中的save()方法是把记录写入数据库。然后就没了。...这里有个很大的问题就是写入数据库之后,当前model不具备数据表该记录的所有字段数据。 举个栗子:user表中有id,username,password,create_time,四个字段。
开始应用级布局 在一个应用中多个控制器使用一个布局文件,那么可以在应用级配置文件config/web.php中设置yii/base/Application的$layout属性,代码如下: $config...> 嵌套布局实现页面渲染流程: 首先渲染视图文件article.php的内容,存储到布局文件reght.php的$content中。...因为在布局文件right.php 中使用了另外一个布局文件headerfooter.php,所以又把article.php和right.php两个文件的内容存储到headerfooter.php文件的$...,在Module类中定义了getViewPath()和setViewPath()方法,来获取和设置视图文件路径,代码如下所示: //所在文件路径vendor\yiisoft\yii2\base\Application.php...中并没有设施成员属性viewPath,但是使用viewPath成员属性时将自动调用_get()魔术方法间接调用getViewPath(),同理在设置viewPath成员属性时将自动调用_get()魔术方法间接调用
创建模型.png 创建控制器,实例化表单模型和渲染视图 ? 创建控制器.png 视图中使用ActiveForm创建表单元素 ? 创建元素表单.png 在控制器中接收表单数据并绑定数据到表单模型 ?...来进行文件保存 视图文件修改 需要传入多个文件,就需要在表单name属性加上[] 再加上multiple属性 ?...在视图中使用验证码 ?...,在Yii2中,不需要自己去写验证,直接在表单模型的 rules 中调用 captcha 验证就可以了 ['verifyCode','captcha'], 数据分页 Yii2也提供了类似于TP的数据分页类...在视图中要显示分页,要使用到LinkPager 小部件 使用方法: <?
//测试 A public function actionTest1() { //该文本消息会被翻译成中文,因为设定的目标语言是 zh-CN。我们也可以动态地改变应用程序的语言。...; } //测试 B //在一个转换(翻译)的消息,可以插入一个或多个参数 public function actionTest2() { $username = 'Username1';...视图文件翻译 测试 可以翻译整个视图脚本,而不是单独的翻译文本消息。...例如,如果目标语言是zh-CN,想翻译是 views/site/index.php 视图文件, 那么应该翻译视图并保存在 views/site/zh-CN 目录下。.../yii2/yii_localization.html (完)
然而1库1表的时候,tableName()返回是的order_info,于是理所应当的重载这个函数,提供一种动态变化的能力即可,例如: ?...无论选择哪种方案,我们都应该进一步改造tableName()函数,为database名称提供动态变化的能力,和table动态变化类似。 ?...假设分8张表,那么分别是00,01,02,03…07,然后决定分4个库,那么00,01表在00库,02,03表在01库,04,05表在02库,06,07表在03库,根据这个规律对应的计算代码如上。...database时候不存在报错),真实的库名是通过tableName()动态变化的。...总结 以上就是关于yii2实现分库分表的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
例如,在应用开发的过程中,新建了一张表,在应用部署到生产环境后,发现需要为这张表创建一个索引以提升查询性能,等等。...我们先找到一个核心文件:/vendor/yiisoft/yii2/console/controllers/BaseMigrateController.php 创建迁移的视图文件:/vendor/yiisoft...类型,createIndex方法代码在:/vendor/yiisoft/yii2/db/Migration.php 468行) 数据表有用到外键的朋友,代码你们可能要自己手写一小段了,作者项目中未遇到外键所以代码没写...现在开始到视图模板(/vendor/yiisoft/yii2/views/createTableMigration.php):我们修改up方法里面的代码,这里能看到只有一个自增ID。...例如,在mysql类型中是:smallint 但我在Migrations中必须是 smallinteger 包括 bigint 也要改为 biginteger,目前我就发现这两个不一样,其他的暂时还没遇到
昨天早上上班前,我无意间看到其它师傅们挖的yii2利用链,其中有一个是我之前忽略了的,就想着赶紧分享给大家,但是昨天恰了个饭(文末有福利),发不了文章,只有今天发了 这是一条利用__wakeup魔术方法作为入口的利用链...,原来是php版本问题,PREG_UNMATCHED_AS_NULL这个静态变量只在php7.2以上才有,而我用的是php7.1,所以升级一下,然后测试,结果 又报错了...如下 ?...我去查了一下,这个应该是yii的视图报错了导致无法回显命令执行的结果,所以,我利用dnslog来验证命令是否执行,如下: ? 可以看到命令成功执行了 poc1: yii2真是一个练习反序列化连挖掘的好靶场,我们可以通过它来练习各种魔术方法在反序列化链构造中的使用 php所有的魔术方法如下: __construct(),类的构造函数 __destruct()...__isset(),当对不可访问属性调用isset()或empty()时调用 __unset(),当对不可访问属性调用unset()时被调用。
业务领域模型 首先 Model 是一个业务领域概念,对应的业务模型,而非数据库字段或者说数据库字段的映射。这一点在 PHP 中被误解的尤其明显,大家都以为模型就是数据库的表映射。...为什么在 PHP 从业者眼中 Model 就代表着数据表,说白了就是 PHP 的项目业务简单到不足以启用领域模型相关的设计,进而我们可以思考 PHP 数据结构中惯用数组而非属性也是同样的道理。...我们以 YII2 工程为例,官方推荐的 Advanced 模版中有一个公共工程 common 那我们是不是应该把项目中可以共用的数据层都放到 common 里? ?...图4-YII2-模块.png 如上图,passport 和 admin 两个模块,如果都涉及同一张 User 表,依据复制优于依赖的原则,没有必要公用一个 User 类,可以单独存放为两个 User 类...更何况因为模块不一样,即使同一个数据表对象,相关的数据操作也会不一样。
PHP框架大PK php框架有很多种,在国内应用较多的有:Thinkphp, Yii, Laravel, Codeigniter等。关于这些框架,孰优孰劣,是一个极具争议性的话题。...本系列文章之所以选用yii2构建一个完整的应用,基于我最近在深入了解yii2,便将自己对于yii2的理解表达出来,希望能帮助那些想了解yii2的同学。如果你对yii2感兴趣,欢迎入坑。...我们下载的是高级模板,自带了前台与后台目录,因此需要设置两个域名,host配置如下: 127.0.0.1 frontend.test # 前台 127.0.0.1 backend.test #...; 在项目根目录新建log目录存放nginx日志, 不然会报错!...小结 本小节讲了如何安装配置yii2。下节将讲解yii2的控制器和视图是如何交互数据的。敬请关注...
它的功能就是把begin和end之间的内容作为变量$content的值,然后渲染指定的视图文件。 两列布局文件:@app/views/layouts/column_2.php 布局文件columns_2引用main,并通过 Block 的 id 指定main里面的两个变量的内容 布局文件columns_3:@app/views/layouts/columns_3.php...,然后在各个子布局中指定所使用的内容。...中使用$layout控制布局文件 yii2与yii在选择布局文件上有一点比较大的不同,yii是既可以在/protected/views/layout/main.php设置布局文件,也可以使用下面语句设置...,但yii2中我没有找到相关的设置文件,只能使用下面方法对布局文件进行设置了,不过下面的方法非常方便,使用起来非常好用。
为什么80%的码农都做不了架构师?>>> ? 我们的数据库常常都是很庞大的,一次查询的结果集也很大,这样很浪费内存,为了降低内存的使用率,我们可以使用yii2的batch和each方法。...为了让大家看的更明白,我们模拟一个场景,然后通过yii2的debug来查看all与batch/each方法下的内存使用情况。 开始准备 我们先建立一张表,它很简单。 ?...对比 为了方便,我们在视图里直接写循环体,如下面代码,你一定可以看懂。...果然,节省了一半的内存。...结果 当我们遇到需要一次读取出所有的或是大批量数据的时候,可以考虑使用batch和each,这一点点代码的优化帮你省掉了一半的内存。
Expression('count(*) as count , count(distinct mobile) as mnumber') ])->asArray() ->all(); Yii2...校验 country_id 在 Country 中是否存在,一般用于一些外键关联的数据表之间的数据约束。...] 表单验证两个字段选取一个 [ ['card_id', 'card_code'], //至少要一个 function ($attribute, $param) {...属性可以通过 extraFields()进行设置。...$data); 获取GET数据 Yii::$app->getRequest->get('id'); // 效率更高 Yii::$app->getRequest()->get('id'); ---- 视图中获取当前模块
副本数 同一个 CG 内所有表的所有分区(Partition)的副本数必须一致。如果不一致,可能出现某一个 Tablet 的某一个副本,在同一个 BE 上没有其他的表分片的副本对应。...同一个 CG 内的表,分区的个数、范围以及分区列的类型不要求一致。...每次调度时,会在注册表中读取动态分区表的属性,并根据动态分区属性动态添加及删除分区。...1.4.2 举例说明 建表时,可以在 PROPERTIES 中指定以下dynamic_partition属性,表示这个表是一个动态分区表。...物化视图是将预先计算(根据定义好的 SELECT 语句)好的数据集,存储在 Doris 中的一个特殊的表。
作为自己的周总结,平时遇到的问题,以及一不小心踩的坑,记录下来自己当复习: 表单验证 表单验证,两个参数中至少需要一个(2个以上): public function rules() {...给mysql数据库表添加字段后,立即使用这个字段时会出现未定义的情况(Getting unknown property) 原因:yii 对数据表结构进行了缓存。...'avatar_url']; // 输出内容: http://b.com/头像路径 } } Yii2-GridView 中让关联字段带搜索和排序功能 情境要求: 要在订单(Order)视图的...数据库结构 订单表order含有字段customer_id 与 客户表customer的id字段关联 首先确保在Order Model中包含以下代码: public function getCustomer...customer.customer_name', $this->customer_name]) ;//<=====加入这句 return $dataProvider; } 第三步: 修改order/index视图的
因此服务器端可以通过此字段是否为同一个域名来判断请求是否合法,因为客户自己做的网页发起的请求,其Referer为黑客网站。...在HTTP头部增加属性 这个方法在思路上和上面的token方式一样,只不过将token放到了HTTP头部中,不再参数传递,通过XMLHttpRequest类可以一次性的给所有请求加上csrftoken这个...HTTP头属性并设置值。...Yii2 首先要说的是每种CSRF防范措施都有其弊端,无论你的防范多么严密,黑客拥有更多的攻击手段,因此在重要逻辑上(必须写入和删除)必须非常小心,接下来我们把yii2框架在csrf上的部署说一下。...在CSRF这块,yii2框架采取了HTTP头部和参数token并行的方式,针对于每个请求,在beforeAction都会做一次判断,如下 // vendor/yiisoft/yii2/web/Controller.php
举个栗子,假设我们的分析视图中有一个客户表或属性视图,该客户表或属性视图使用左外部联接配置到销售数据表。...INNER JOIN INNER JOIN只有在两个表中找到匹配的值时才会返回记录。...假定在同一个属性视图中没有查询列。但是,如果查询中包含属性视图中的列,则此连接将充当内部连接。 如果在属性视图中定义了过滤器,则即使未选择任何属性视图列,连接也将被包含并强制为内部联接。...这意味着只有在属性视图和分析视图基础表中找到匹配项时才会返回记录。这也意味着REFERENTIAL JOIN并不总是从信息模型执行计划中进行裁剪。...通常在分析视图基础表,在属性视图中没有匹配记录的情况下定义LEFT JOIN。即使缺少主数据或者说数据不完整,也能确保返回所有的数据。
领取专属 10元无门槛券
手把手带您无忧上云