yii api接口开发(yii框架官网)

网友投稿 297 2023-02-05

本篇文章给大家谈谈yii api接口开发,以及yii框架官网对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享yii api接口开发的知识,其中也会对yii框架官网进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

高并发的API接口选用什么PHP框架合适

Yaf的其实本质上讲,是个基础框架,仅提供了一个简单粗暴的基础URI路由功能,完事了。
最关键是并发和多线程以及定时器等等,Yaf本身不能实现。
这点小性能没有必要在乎,c框架有些bug让你无从下手,phalcon就被坑过
如果想用的6都会去看框架源码,用c写的框架看源码多么痛苦
我觉得随着php逐渐的发展,性能逐渐的优化,这种类型框架迟早会被淘汰的

php全栈框架有哪些

PHP全栈~
全球前100万的站点中,有70%左右的站点用PHP开发,它与Linux/Mysql/Apache/Nginx等组成黄金搭档,无论从成本投入和开发周期的考虑,PHP都是一个不错的选择。
PHP可用在网站开发,API接口开发,服务器端开发,广告系统开发,内部OA系统开发,移动端后台开发,游戏开发等,特别在移动互联网发展迅猛的今天,PHP借机上位,重回一线开发语言行列。
全栈是全面横向发展,单学PHP是专精纵向发展。PHP学精了,也是有前途的。但是,现在有几个做PHP的自己不会写点前端?再说你不可能一来就进大公司做团队开发,你只负责PHP开发。而小公司基本上也不会让你只写PHP,都是一个人当几个人用。这就是为什么全栈更有前途的原因。
最近国内外都在流行一个词叫Full Stack,中文翻译过来叫全栈工程师,也叫全端工程师。微博上很多专业人士都在讨论全端工程师,有赞有毁的。我对全端工程师的定义是:掌握多种技能,并 能利用多种技能独立完成产品的人。打外比方,全栈工程师就是一个能独立盖一幢10层小洋楼的人,而普通工程师,则是可以和一群人盖一幢摩天大楼的人。至于 要掌握哪些技能,我觉得这个要跟从事的行业与技术方向有关,做互联网的和做软件的是不一样的,即使是做互联网的,后端也可以分为很多种技术流派。

LAMP系统部署RESTful API应该用JAVA、PHP还是ASP.net?

java和php都可以,建议按自己容易掌握的做,一般php入门相对容易。
php和java都有现成的框架做api,
例如php有laravel和yii等框架,国内有thinkphp框架,在框架下面写会比从0开始写好很多。
你的apache, centos, mariadb, php,已经满足php运行环境要求。
asp.net每次都要编译,相对较慢,但如果你已经有c#基础和html开发,应该这个也可以。asp.net也有类似的开源开发框架,但数量较少。
多动手,多试试,祝好运!

PHP开发工程师岗位职责

PHP开发工程师岗位职责15篇

在现实社会中yii api接口开发,岗位职责的使用频率逐渐增多,岗位职责是指工作者具体工作的内容、所负的责任,及达到上级要求的标准,完成上级交付的任务。那么岗位职责怎么制定才能发挥它最大的作用呢yii api接口开发?以下是我为大家收集的PHP开发工程师岗位职责,欢迎大家借鉴与参考,希望对大家有所帮助。

PHP开发工程师岗位职责1

职责:

1. 负责公司内部运营ERP管理系统和跨境电商(外贸平台)行业相关软件系统的设计和开发;

2. 需要您使用PHP技术,完成系统的开发工作;

3. 准确理解部门员工需求,及时跟进系统的改良和新模块的开发;

4. 较快掌握公司产品业务和系统架构逻辑,尽快参与到项目开发中;

5. 承担产品主要功能开发,分析模块需求和解决开发中遇到的技术难点,编写符合公司要求的高质量代码;

6. 参与公司的软件体系建设工作,为公司内部提供软件的技术支持和服务;

7. 对互联网电商软件行业有浓厚兴趣;

8. 完成上级分配的其yii api接口开发他软件开发相关工作任务。

岗位要求:

1.计算机专业毕业,三年以上的开发经验;

2. 编程功底:具备良好的项目开发经验,能独立的承担开发任务,负责软件开发,编码、测试;

3. 编程语言:精通PHP;

4. 项目经验:有开发过大型项目的开发经验;高性能系统;有跨境电商(外贸)项目(ERP、独立站、或刊登系统)开发经验者优先考虑;熟悉主流跨境电商平台(Amazon、eBay、Aliexpress、Wish等)的API集成者优先考虑;有在物流、仓储、电子商务等行业从事软件开发者优先考虑;

6. 数据库:对索引、事务、锁有一定的了解;

7. 项目沟通:具有良好的沟通表达能力、执行力、责任心、自我管理能力和团队精神,对待工作积极、严谨、踏实,能承受较大1000的工作压力;

8. 编码规范:具备良好的编码规范和编程风格,命名规范,逻辑性强,代码冗余率低;

PHP开发工程师岗位职责2

职责:

1、负责网站平台上线维护及网站功能拓展;

2、负责系统框架的整合,程序开发和维护;

3、负责新功能各业务模块的流程设计及实现;

4、合理的性能优化、代码设计优化、数据库结构的设计及优化;

任职要求:

1.本科及以上学历,计算机相关专业;3年以上PHP工作经验.

2.具备极强的责任心

2.擅长PHP语言,熟悉面向对象编程,熟悉的thinkphp3.2 , thinkphp5等开源框架.

3.精通MySQL数据库开发,能熟练地运用SQL语言,了解数据库配置管理,性能优化.

4.熟悉前端WEB开发技术,包括js,jq,div+css,ajax,等技术.

5.熟悉运用各种API接口。

6.有独立的二次开发能力,和良好的审美观、逻辑性强,代码冗余率低,了解网站空间服务器等网络安全.

7.有物流行业开发经营或电商方面项目经验优先.

PHP开发工程师岗位职责3

职责:

1、负责公司后端的研发,保障系统的稳定性和质量

2、与业务需求部门及项目经理沟通,理解需求,进行架构设计;

3、搭建开发框架、负责核心代码的编写,解决技术难点;

4、界定、分析和解决系统中存在的问题和缺陷;

5、对系统进行持续改进,提升系统的性能、可扩展性、可维护性;

6、持续改进系统架构、核心算法或者核心技术等,保证系统高性能、高可用性和高可扩展性-新技术预研,完成项目的`选型和设计,难点攻关

任职资格:

1.本科及以上学历,3年以上开发经验;

2.良好的代码习惯,要求结构清晰、命名规范、逻辑性强、代码冗余率低;

3.熟悉Mysql,有较为熟练地掌握mysql语言及编写存储过程、触发器等数据库开发的能力;

4.精通PHP语言,精通CGI标准和HTTP等互联网协议;

5.熟练掌握javascript、div+css等web前端布局及多浏览器兼容相关技术;

6.熟练使用Linux系统,熟悉在Linux下配置php+mysql的运行环境;

7.有良好的沟通、协调能力和学习能力,具备良好的团队合作精神,对工作积极严谨踏实,能承受较大的工作压力。

PHP开发工程师岗位职责4

职责:

1、负责快速迭代产品线开发、升级、维护;

2、参与或主导需求分析,并实现新需求(功能);

3、独立或分组进行项目分解开发及优化;

4、负责核心功能板块开发;

5、独立解决技术难题,及时定位并驱动落实。

任职要求:

1、计算机相关专业专科及以上学历,3年以上开发经验;

2、熟练掌握PHP语言知识,至少熟练使用一个流行框架TP5、Laraval、Phalcon;

3、熟练掌握MySQL数据库操作、熟练使用存储过程、事务;

4、熟练完成第三方接口接入,微信、支付宝、短信、云存储等;

5、熟练使用git、SVN等开发工具,掌握Linux环境操作;

6、有高并发、大数据开发经验,有较好的学习能力和沟通能力,有创新能力和责任感,熟悉软件工程,具有良好的代码编写规范和书写文档的习惯。

PHP开发工程师岗位职责5

职责:

1、参与产品初期的需求定义

2、根据需求快速完成开发方案设计

3、高效完成功能开发

4、功能自测、代码定期自查、框架及系统完善

5、参与日常的功能快速迭代,完成开发、自动化测试到产品发布的整个流程。

任职要求:

1、扎实的计算机编程及网络基础,熟悉常用软件设计模式

2、3年以上PHP开发经验,熟练练使用PHP框架,有一个以上Laravel或Swoft的完整项目的开发经验

3、熟练使用MySQL数据库,对索引、锁和事务有了解,有并发处理和调优经验

4、熟练使用Redis、Memcache等常见非关系型数据库

5、熟练使用HTML、CSS、Javascript、Jquery、Vue等前端技术,有Vue实际使用经验

6、有支付、OSS、消息通讯等一种以上三方应用的集成经验

7、熟悉Docker、Git、及常用Linux命令使用有,有生产服务器运维经验的优先

8、熟悉或掌握一种或以上其他服务端语言的优先

9、有SaaS系统、社交软件、直播平台高并发处理能力经验的优先

10、有责任心,具备良好的编码习惯,较强的学习及沟通能力。

PHP开发工程师岗位职责6

职责:

1.负责主要项目结构设计,架构原型实现及核心模块的开发工作;

2.负责软件项目平台的设计与开发;

3.负责技术方案决策、技术风险防范与化解,分析系统瓶颈,解决各种疑难问题,对系统进行性能调优;

4.指导团队不断提高技术能力和开发效率,从技术层面持续提高用户体验;

5.负责技术团队建设和管理,注重人才培养和营造创新的研发文化。

任职资格:

1.计算机专业全日制本科以上学历,4年以上PHP网站设计编程(多语言)经验;

2.有扎实的PHP基础并熟练独立使用php+mysql开发;

3.理解ajax原理,熟悉javascript、jquery使用,理解web标准;

4.理解http协议,熟悉linux环境下的web开发优先,有丰富电子商务相关经验的优先;

6.具备良好的代码编程习惯,逻辑思维严密,有较强的数据分析和问题排查能力;

7.熟悉JAVA、C、Python其中一种优先;

8.良好的表达能力,能够清晰和准确地描述问题;

9.能适应快速成长型技术团队的要求,具备自我管理能力和创业精神,能够承担一定的工作压力;

10、有责任心,善于沟通,有钻研和学习精神,擅长分析问题解决问题。

PHP开发工程师岗位职责7

工作职责:

1、承担机器学习系统和算法的研发,为字节跳动全系产品提供增长算法策略支持,包括不限于头条、西瓜视频、抖音、TikTok等yii api接口开发

2、负责头条用户增长智能引擎中的算法策略部分,例如人群Lookalike、触达决策、着陆页个性化等。

任职要求:

1、具备强悍的编码能力和扎实的数据结构和算法功底;

2、熟悉至少一种主流深度学习编程框架(TensorFlow/Caffe/MXNet),熟悉其底层架构和实现机制,熟悉深度学习算法(CNN/RNN/LSTM等);

3、熟悉常见的开源组件,参与过高性能在线服务研发者优先;

4、有大规模海量数据机器学习/数据挖掘/计算广告/搜索引擎相关经验者优先;

5、具备良好的沟通和表达能力,有较好的产品意识者优先。

PHP开发工程师岗位职责8

职责:

1、负责企业网站产品的开发及技术设计;

2、从事php项目开发,能独立开发、制作整站或独立完成局部程序;

3、熟练使用PHP/MySQL开发;熟悉Sql语法,包括数据库设计,速度优化;

4、熟悉Yii框架

5、熟悉php、Html5、JavaScript、div+CSS。

任职要求:

1、熟练使用PHP+MySQL,有扎实的php语言基础知识,能独立设计网站架构,完成前后台代码编写工作;

2、专科及以上学历,做过PHP网站程序开发2年工作经验以上,能独立完成一般性网站的开发,有大中型项目开发经验优先;

3、熟练掌握thnkphp框架,熟悉smarty, 具有PHP开发经验和MVC实际开发经验;

4、熟悉各种WEB技术,并有实际的项目经验;

5、良好的编程习惯、阅读能力、理解能力、学习能力,思路清晰,工作规范。

PHP开发工程师岗位职责9

职责:

1.负责金融类交易项目产品的开发。

2.参与需求讨论并能独立完成的程序,以及撰写程序文档;

3.与产品经理一起配合开发以及系统的日常维护;

4.对测试环境,开发环境,以及线上环境能独立进行部署;

5.积极的与同事进行技术交流与沟通。

岗位要求:

1、计算机相关技术专业,大专及以上学历;

2、有金融行业,数字货币交易所工作经验优先;

3、有3年以上使用PHP开发工作经验;

4、精通分布式、缓存、消息、搜索等机制;

5、熟练运用PHP、JavaScript、MySQL、HTML、CSS等WEB开发技术,能独立完成功能前后端开发和数据库调优。

6、责任心强,学习能力强,分析和解决问题能力强;

7、良好的团队协作和沟通能力,能够承担一定工作压力。

PHP开发工程师岗位职责10

职责:

1.根据业务需求,进行架构分析、设计及实现;

2.依照业务需求,进行相关功能的数据库设计;

3.根据业务及前端需求,及时、高效、高质量产出符合RESTFUL规范的api接口;

4.参与系统微服务化,如微服务实现、Docker环境建设、Jenkins等自动化部署。

任职资格:

1.熟悉关系型数据库,如MySQL,能依据业务需求进行合理的数据库设计;

2.精通PHP,PHP方面至少精通一种MVC框架,熟悉Yii框架优先;

3.熟悉前后端分离开发模式;

4.熟练使用git进行代码管理;

5.热爱互联网开源生态,充满求知欲,具有非常强的持续学习能力;

6.有良好的沟通能力和团队协作精神;

7.有微服务开发实践,熟悉Docker、Kafka、Flink更佳。

PHP开发工程师岗位职责11

职责:

1、负责公司网站的开发设计及开发小组工作安排;

2、负责高性能应用架构设计和优化及技术调研,性能调优等技术开发工作,负责网站程序的详细设计、编码和内部测试的组织实施;

3、协调系统内部、跨系统的技术方案制定和评审,保证系统的可扩展、易维护性;

4、参与开发和维护现有的网站程序。

5、对项目的规划,开发与前后端的接连,跟进整个项目各模块的进度。

6、对线上系统的稳定性和可用性负责;

任职资格:

1、计算机相关专业,需3-5年及以上PHP后端工作经验,熟练掌握HTML、Ajax、JavaScript、技术,有vuejs开发经验者优先;

2、熟悉yii2、laravel等至少一种框架,熟悉各种主流的MVC开发框架的使用及其原理;精通LAMP/LNMP架构开发,掌握MySQL主从开发、索引优化、查询优化和存储优化,以及PHP缓存、静态化等技术。

3、熟悉Linux服务器性能优化,NGINX的PHP环境配置和PHP应用,精通MySQL一种或以上关系数据库使用,至少精通redismemcach等一种nosql数据库;

4、工作认真,有条理,责任心强;具有很强的沟通能力及团队合作精神,具备很好的学习钻研能力,乐观开朗,工作能够服从安排;有很强的进取精神,能承受一定的工作压力;

PHP开发工程师岗位职责12

职责:

1、负责公司网站及网络应用产品开发和维护;

2、根据产品需求完成架构和模块设计、编码、测试工作;

3、按照项目计划,遵循公司软件开发流程按时提交高质量代码,完成开发任务;

4、项目,软件开发设计文档的编写、维护,以及其他与项目相关工作;

5、与产品、项目经理、测试部门沟通保证产品的质量和开发进度;

6、参与产品、项目设计方案评审,并提出问题和改进意见。

职位要求:

1、计算机及相关专业,学历本科以上;

2、3年以上PHP/Web开发经验,至少有3个完整项目的开发经验;

3、熟悉Linux,MySQL,熟悉B/S系统前后端相关开发技术及框架;

4、英语读写流利,能在工作环境中熟练运用,听说流利的优先;

5、熟悉Html/CSS/Div布局,熟练使用JQuery,JavaScript,XML,AJAX ;

6、具有独立分析、解决问题的能力,具有良好的编码习惯;

7、具有良好的沟通能力,团队合作精神,高度的责任心,能承担工作压力。

PHP开发工程师岗位职责13

职责:

1.熟悉thinkcmf5框架优先录取

2.核心业务功能开发和代码维护;

3.负责网站后端程序开发、数据库结构设计和搭建;

4.参与网站产品的设计和开发,配合产品经理进行技术决策。

岗位要求:

1.有开发商城系统/微信定制开发优先;1-2年工作经验也可考虑;

2.熟练掌握PHP,熟悉面向对象的软件设计方法;熟悉MVC三层架构的开发,熟练应用PHP框架Thinkphp5。

3.熟悉HTML、CSS、Javascript等前端技术,熟悉jquery者优先;

4.熟悉Linux常用命令;MySQL数据库开发及常用优化方法;

5.有良好的代码习惯,要求结构清晰、命名规范、逻辑性强、代码冗余率低,代码注释清晰;

6.性格开朗、喜欢钻研技术,具有较强的分析和解决问题的能力。

PHP开发工程师岗位职责14

职责:

1、负责公司CMS系统优化和新产品开发;

2、按照项目计划,与项目组其他成员协同工作实现开发目的;

3、协助工程师测试和发布系统,准备相关的技术文档,协助解决各种技术问题;

4、负责文档撰写,在前期期间设计交付URL接口文档、模板数据描述文档,在编码期间能撰写清晰明了的注释。

任职资格:

1、熟练基于windows/Linux系统的PHP+MySQL开发;

2、相关专业毕业,1年以上PHP编程经验,熟悉Ajax的前台技术;

3、拥有良好的代码习惯,要求结构清晰,命名规范,逻辑性强,代码冗余率低;

4、熟悉ThinkPHP框架开发或者二次开发的优先;

5、能独立用php开发一般的项目,对软件编程有较透彻的了解;

6、良好的沟通能力和团队合作精神。

PHP开发工程师岗位职责15

职责:

1、参与项目的架构设计,架构原型实现及核心模块的开发工作;

2、参与系统需求分析与设计,并负责完成PHP核心代码,接口规范制定;

3、重构现有架构,优化服务端性能。

任职要求:

1、1年以上LNMP开发经验,熟悉Ecshop二开的优先。

2、熟练运用PHP、mysql,至少熟悉一种MVC框架;

3、熟悉Mysql数据库,掌握各种调优技巧,熟悉多种nosql;

4、对代码和设计质量有严格要求,重视CodeReview,良好的编码习惯和严格的编码规范;

5、有软件架构、服务器架构等方面经验,了解大负载大流量服务器端解决方案;

6、有带团队经验,具备良好的团队合作精神;

7、能承受大工作量负荷。

;

请教 关于 权限判断 admin

说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等。最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门老大下面分子部门等等,恶心的需求。我们这个项目使用yii框架开发,yii在php届还是比较流行的,虽然说laravel现在横行,但是一些部门一些团队还是采用了yii框架,比如我们。我是刚接触yii这个框架,开始的时候对这种面向组件的框架甚是别扭。当时打算自己写权限的,自己创建权限表,关联表等,但是学习使用yii开发文档后,发现有个权限控制RBAC,借助于yii-admin可以实现完美的权限,菜单的控制。这篇博客分两部门,第一部分我会讲述怎么搭建权限管理包括:安装yii-admin,创建权限表,使用权限控制菜单和访问权限等基本的操作,这部分大致说一下,想要看更详细的步骤可以参考这个比较详细的讲解:/yiisoft/yii2yii2-admin:https://github.com/mdmsoft/yii2-admin当然你可以使用composer来安装,这样最好不过,如果你安装好了yii,你就可以切换到项目目录下,直接执行下面的命令:php composer.phar require mdmsoft/yii2-admin "~2.0" php composer.phar update 然后配置中加入yii-admin的配置项,值的注意的是如果yii2-admin配置在common目录下是全局生效,那么你在执行命令控制台的时候就会报错,所以应将权限控制作用于web模块,我们这个项目没有使用高级模板,所以你可以直接把配置写在config下面的web.php中,配置如下:先定义别名:'aliases' = [ '@mdm/admin' = '@vendor/mdmsoft/yii2-admin', ], 在modules中添加admin组件:'admin' = [ 'class' = 'mdm\admin\Module', 'layout' = '@app/views/layouts/main_nifty',//yii2-admin的导航菜单 ], 添加添加authManager配置项:需要强调的是,yii中的authManager组件有PhpManager和DbManager两种方式,这两种方式是由区别的,PhpManager将权限关系保存在文件里,DbManager方式,将权限关系保存在数据库。我们采用保存在数据库中的方式。'authManager' = [ 'class' = 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager' ], 添加as access:'as access' = [ 'class' = 'mdm\admin\components\AccessControl', 'allowActions' = [ // add or remove allowed actions to this list // 'admin/*', //'*', 'site/*', 'api/*', ] ], 需要说的是未知不要放错了,如下图所示:2、配置数据库权限表这一步不用自己去写,命令行切换到yii2目录,执行下面命令,创建rbac需要的表,但是数据库需要自己创建名字是:yii2basic,如果要执行命令,就需要把你刚下配置好的配置文件在在console.php中也写一份,如果执行不成功,可以吧生成数据表的脚本拿出来自己执行。yii migrate --migrationPath=@yii/rbac/migrations yii migrate --migrationPath=@mdm/admin/migrations 如果执行成功会生成5张表,还需要一张user表,你可以自己添加menu //菜单表auth_rule //规则表auth_item_child //角色对应的权限,parent角色,child权限名auth_item //角色、权限表,type=1表示角色,type=2表示权限auth_assignment //角色与用户对应关系表如果全部成功的话,再访问index.php?r=admin 就可以了看到权限的控制可视化页面,如果出错,你认真查看错误原因,基本上都是配置不对。配置好的话,访问其他页面就没有权限了,然后你可以修改as access中的allowActions,在开发api或者一些共用的模块的时候很有用,因为这些页面不需要进行权限的控制。权限控制页面如下图:3、进行菜单控制要进行菜单控制,就需要用到刚才创建的那几个表中的menu表,左侧的导航按照我们的设计应该可以通过权限进行控制,写死的导航不能达到目的,可扩展行还不强,所以菜单控制必须要支持。需要注意的是,如果你的后台框架中用到了自己的layout,你需要自己去指定,我们这个项目就是,有我们自己的layout,上面再添加admin组件的时候已经添加了:'layout' = '@app/views/layouts/main_nifty', 然后我们操作菜单列表。添加菜单项,然后在打开layout文件,其实获取菜单的逻辑已经写好了,在MenuHelper中,添加命名空间mdm\admin\components\MenuHelper; 然后注销原来的导航,添加下面的代码,基本上就可以实现权限-用户-导航的控制了。echo Nav::widget( [ "encodeLabels" = false, "options" = ["class" = "sidebar-menu"], "items" = MenuHelper::getAssignedMenu(Yii::$app-user-id), ] ); 好了说完了,最后看一下这个页面:二、yii-admin优化和重写在使用的过程中,yii-admin实现的导航权限控制远不能满足我们的需求,并且,这种组件试的开发,每个操作是完全独立的,比如,检查权限,取菜单,取用户信息,每个操作都需要执行SQL来进行下面是正常的检查权限和得到菜单的sql执行过程。其实这个过程是极其费时的,当用户量比较多,菜单比较大,权限表中的数据非常多的时候是不能这样干的,使用我们自己的sql检测工具可以看到,这个过程执行了20条之多的sql语句:在图中可以看出,权限检查涉及了14次的sql查询,菜单涉及了5次sql查询,如此多的sql 执行一旦上线事没有什么并发可言的。yii-admin这个组件提供了方便的权限控制,菜单控制,但是性能上面我们不敢苟同。查看源码你就知道,这个组件在我看来是一个解耦比较高的组件,每个成分之间可以单独的使用,这就需要每个操作必须要有自己独立的数据库来源,说白了就需要每次都执行sql去取到想要的值,中间很少使用连表查询这样的sql,其实10条sql做的功能,在耦合上网情况下,一条sql就搞定了。像我这种人是不能忍受这么多不相关的sql执行的,所以我就在根源上面修改了yii-admin的权限检查部分,修改的方法是我自己想的,不一定对,也不一定适合所有的场景,下面就写出来与大家分享。1、菜单的优化我们通过查看菜单的生成过程大致会执行了5条以上的sql,这个还算可以,我没有做sql上的优化,原因是我们的菜单是要对应不同的角色和子父级关系,在原来的基础上我添加了一个type来区分是那种角色能看到这种菜单,一级哪种角色对应某一个菜单显示的层级关系。这样管理员,省代用户,客户都会呈现不同的菜单。即使配置相同的权限,不同层级的用户也会看到不同的菜单。我们的优化是缓存菜单的生成数据,我们这个菜单是定制的,没有采用一开始配置的Nav::widget来呈现,而是我们自己循环层级关系,这样虽然麻烦,但是能很好的提取菜单中我们需要的没一个逻辑,比如:面包屑的自动生成,就可以每次提取菜单的label,再比如子页面,不同控制器下得左导航的高亮,下面是代码,php和html混写了,以后会慢慢的提取。<ul class="nav nav-list" <?php $idx = ; $request_url = '/' . $mod_id . '/' . $con_id . '/' . $act_id . '/'; foreach ($menus_new['list'] as $label = $menu): ? <?php if (empty($menu['label']) empty($menu['url'][])) { continue; } ? <?php if(!isset($menu['items'])):? <li class="<?php if (isset($menu['openurl']) strstr($menu['openurl'], $request_url)) { echo 'active'; $breadcrumb[] = $menu['label']; } ?" <a href="<?php echo $menu['url'][] ?" <i class="menu-icon fa fa-<?php echo $menu['icon'] ?"</i <span class="menu-text" <?php echo $menu['label'] ? </span </a <b class="arrow"</b </li <?php else:? <li class="<?php if (isset($menu['openurl']) strstr($menu['openurl'], $request_url)) { echo 'open'; $breadcrumb[] = $menu['label']; } ?" <a href="index.html"data-target="#multi-cols-<?php echo $idx ?"class="dropdown-toggle" <i class="menu-icon fa fa-<?php echo $menu['icon'] ?"</i <span class="menu-text" <?php echo $menu['label'] ? </span <b class="arrow fa fa-angle-down"</b </a <b class="arrow"</b <ul id="multi-cols-<?php echo $idx ?" class="submenu" <?php foreach ($menu['items'] as $label = $menu): ? <?php if (empty($menu) !is_array($menu)) { continue; } if(!isset($menu['items'])):? <li class="<?php if (isset($menu['openurl']) strstr($menu['openurl'], $request_url)) { echo 'active'; $breadcrumb[] = $menu['label']; } ?" <a href="<?php echo $menu['url'][] ?" <i class="menu-icon fa fa-caret-right"</i <?php echo $menu['label'] ? </a <b class="arrow"</b </li <?php else:? <li class="<?php if (isset($menu['openurl']) strstr($menu['openurl'], $request_url)) { echo 'open'; $breadcrumb[] = $menu['label']; } ?" <a href="#" class="dropdown-toggle" <i class="menu-icon fa fa-caret-right"</i <?php echo $menu['label'] ? <b class="arrow fa fa-angle-down"</b </a <b class="arrow"</b <ul class="submenu" <?php foreach ($menu['items'] as $label = $url): ? <?php if (empty($url) !is_array($url)) { continue; } ? <li class="<?php if (isset($url['openurl']) strstr($url['openurl'], $request_url)) { echo 'active'; $breadcrumb[] = $url['label']; } ?" <a href="<?php echo $url['url'][] ?" <i class="menu-icon fa fa-caret-right"</i <?php echo $url['label'] ? </a <b class="arrow"</b </li <?php endforeach ? </ul  </li <?php endif? <?php endforeach ? </ul </li <?php endif? <?php $idx++; ? <?php endforeach ? </ul 这个导航是我自己改了好多版总结出适合我们自己的方案,其中breadcrumb是控制面包屑的显示,有时间我会抽离php。我介绍的是菜单优化,现在才完成了第一步,菜单的显示,说到优化我是采用缓存菜单数据的策略,就是缓存上面那个$menus_new['list'],策略如下:这个策略使用角色缓存数据,就是使用每个角色的权限加上uid和环境配置MD5以后生成key,考虑到用户比较多每个用户都缓存的话开销太大,并且用户相同权限的的比较多,特殊权限的可以特殊对待,这样省去了存储好多重复的数据,环境配置是区分线上数据和测试数据,便于我们进行调试。过期机制:更重要的是缓存的过期机制,缓存有了但是当菜单或者权限发生变化的时候就要更新缓存,这里我们引入了版本的概念,能做到缓存变更的最小开销。比如菜单变化,所有人导航都应该修改,这里我们在redis中加入一个导航版本的变量,每次读入缓存的时候都会先判断这个版本与缓存中自己存储版本是否一致,如果一致证明导航没有变化,如果不一致认为菜单有修改,导航已过期,需要重新得到缓存,这样相同的角色,只要有一个人更新了导航,其他人下次再进来的时候就会访问到最新的导航(统一角色)。这个全局的redis变量会在导航变更和权限变更的时候自动加1,保证版本的变化,这样如果有4类角色,几万人的用户,实际的数据修改只发生的4次(实际会比这个多,比如同一个角色不同的权限,那么他对应的redis key 就不一样,它需要自己去取缓存)。具体的代码实现如下:$user_id = Yii::$app-user-id; $breadcrumb = []; $menus_new['list'] = MenuHelper::getAssignedMenu($user_id); $redis_key = MenuHelper::getMenuKeyByUserId($user_id); $redis_menu = Yii::$app-redis-get($redis_key); $redis_varsion = getVersion(); if (!empty($redis_menu)) { $menus_new = json_decode($redis_menu, true); $old_version = isset($menus_new['version']) ? $menus_new['version'] : ''; //判断菜单的版本号,便于及时更新缓存 if (!isset($menus_new['list']) empty($old_version) intval($old_version) != $redis_varsion) { $menus_new = getMenu($user_id, $redis_varsion, $redis_key); $log = json_encode([ 'user_id' = $user_id, 'varsion' = $redis_varsion, 'redis_key' = $redis_key, 'value' = $menus_new ]); writeLog($log, 'update_menu'); } } else { $menus_new = getMenu($user_id, $redis_varsion, $redis_key); } function getMenu($user_id, $varsion, $redis_key) { $menus_new['list'] = MenuHelper::getAssignedMenu($user_id); $menus_new['version'] = $varsion; Yii::$app-redis-set($redis_key, json_encode($menus_new)); Yii::$app-redis-expire($redis_key, 300); return $menus_new; } //设置更新key便于时时更新redis function getVersion() { $version_key = Yii::$app-params['redis_key']['menu_prefix'] . md5(Yii::$app-params['redis_key']['menu_version'] . Yii::$app-db-dsn); $version_val = Yii::$app-redis-get($version_key); return empty($version_val) ? 1 : $version_val; } 生成key和更新key的逻辑如下: /** * get menu one user by the id * @param $user_id * @return key string */ public static function getMenuKeyByUserId($user_id) { if (empty($user_id)) { return false; } $list = (new \yii\db\Query())-select('**') -from('**') -where(['user_id' = $user_id]) -all(); if (empty($list)) { return false; } $role_str = ''; foreach ($list as $key = $value) { $role_str .= $value['item_name']; } $redis_key = Yii::$app-params['key'] . md5($role_str . Yii::$app-db-dsn); return $redis_key; } /** * 修改菜单更新状态,更新redis */ public static function UpdateMenuVersion() { $version_key = Yii::$app-params['key'] . md5(Yii::$app-params['key'] . Yii::$app-db-dsn); $version_val = Yii::$app-redis-get($version_key); if (empty($version_val)) { $version_val = '1'; } else { $version_val++; } $log = json_encode([ 'user_id' = Yii::$app-user-id, 'version_key' = $version_key, 'version_val' = $version_val ]); writeLog($log, 'update_menu_version'); Yii::$app-redis-set($version_key, $version_val); } 2、导航的高亮,图标,是否显示默认的导航高亮是按照模块,控制器,方法来进行直接匹配的,这样一来有一种需求无法满足,比如:A控制器下得页面下载B控制器下面高亮,这种事无法实现的,所以要修改他们高亮机制。我们没有再采用他的高亮逻辑,而是自己实现了一个新的逻辑。我首先把要高亮的页面url加入到菜单的data里面,data是一个json数据,如下所示:{"icon": "fa fa-home", "visible": true, "openurl":"/web/site/index/"} 这样我们通过openurl就能知道哪个导航高亮,在页面中直接判断当前请求的url在不在这个openurl里面就可以,但是这样做有缺点,必须要有把高亮的页面加入到要高亮的导航里面,如果页面太多这种方式不怎么好,但是我没有想到更好的方法去解决,如果哪位大神有好的方法可以在中写出,非常感谢。图标和可见性的控制可以借助于MenuHelper中getAssignedMenu的回调方法实现,你可以在调用该方法的时候传入回调方法,我直接写的匿名方法,添加在了该方法里面,如下所示:$user_type = Yii::$app-user-identity-type; $customer_id = Yii::$app-user-identity-customer_id; $callback_func = function($menu) use ($user_type, $customer_id) { $data = json_decode($menu['data'], true); $items = $menu['children']; $return = [ 'label' = $menu['name'], 'url' = [$menu['route']], ]; $return['visible'] = isset($data['visible']) ? $data['visible'] : ''; //菜单隐藏的逻辑 if (empty($return['visible'])) { return false; } $return['icon'] = isset($data['icon']) ? $data['icon'] : ''; //控制菜单打开的逻辑 $return['openurl'] = isset($data['openurl']) ? $data['openurl'] : ''; $items $return['items'] = $items; return $return; }; 3、重写权限检测刚才已经说了,yii-admin 的权限检测执行太费时间,执行SQL太多,所以我打算重写他的权限检查的方法,通过读源码可以看到,他们检查是通过user中的can方法调用的,然后通过mdm\admin\components\AccessControl中的beforeAction实现的,我们可以看一下:/** * @inheritdoc */ public function beforeAction($action) { $actionId = $action-getUniqueId(); $user = $this-getUser(); //预留系统检查权限的逻辑,一旦重写检查权限失败,调用系统检查权限的方法 if ($user-can('/' . $actionId)) { return true; } $obj = $action-controller; do { if ($user-can('/' . ltrim($obj-getUniqueId() . '/*', '/'))) { return true; } $obj = $obj-module; } while ($obj !== null); $this-denyAccess($user); } 因为全权限的检查包含了子父级检查,也就是说 /admin/menu/update的权限是对/admin/menu/* 和/admin/* 和 /*都可见的,所以我们会看到$user-can的调用会使用do -while来进行,这样就增加的检查的复杂度,执行的sql就会批量的增加,你想啊,没一个父级的检查都是一次全新的函数调用,所以最恶心的也莫过于此了,感兴趣的同学可以去看看他的这个过程,当你自己调用这个函数检测的时候就会发现,执行的sql不是一般的多。下面是我的重写方法,一条SQL,兼容了权限,角色,批量检查和未登录用户的权限检查,具体实现如下:/** * 权限判断方法 (先不要使用该方法,用的系统方法,效率极低,等有时间重写之后再用) * @param string/array $permission_name 权限值(URL 或者 权限名)/批量检测可以传入数组 * @param int $user 用户id,不传值会取当前的登陆用户 * @return boolen * @author zhaoyafei */ public static function permissionCheck($permission_name, $user = 0) { //检查是否登陆过 if (Yii::$app-user-isGuest) { Yii::$app-response-redirect('/site/login'); } if (empty($permission_name)) { return false; } if (empty($user)) { $user = Yii::$app-user-id; } //管理员权限不能直接返回true,会存在管理员type = 1分到非管理员权限的人员(有坑) //匿名方法,处理管理员返回值的情况 /*$setAdminSet = function($param) use ($permission_name) { $paramtmp = $permission_name; if (is_array($paramtmp)) { if (count($paramtmp) == 1) { return true; } $paramtmp = array_flip($paramtmp); foreach ($paramtmp as $key = $value) { $value = true; } } else { $paramtmp = true; } return $paramtmp; };*/ //检查是否是管理员, 管理员都有权限 /*if (empty($user)) { $user = Yii::$app-user-id; $user_type = Yii::$app-user-identity-type; if ($user_type == TYPE_ADMIN) { return $setAdminSet($permission_name); } } else { $user_sql = "SELECT type FROM xm_user WHERE id = :id"; $user_info = Yii::$app-db-createCommand($user_sql)-bindValue(":id", $user)-queryOne(); if (empty($user_info)) { return false; } if ($user_info['type'] == TYPE_ADMIN) { return $setAdminSet($permission_name); } }*/ //根据用户去取权限 $permission_list = []; $sql = "SELECT xc.child, xc1.child as role_name FROM xm_auth_assignment xa INNER JOIN xm_auth_item_child xc ON xa.item_name = xc.parent LEFT JOIN xm_auth_item_child xc1 ON xc.child = xc1.parent WHERE xa.user_id = :user_id"; $permission = Yii::$app-db-createCommand($sql) -bindValue(":user_id", $user) -queryAll(); if (empty($permission)) { return false; } //组合权限列表 foreach ($permission as $key = $value) { if (!empty($value['child']) !in_array($value['child'], $permission_list)) { $permission_list[] = $value['child']; } if (!empty($value['role_name']) !in_array($value['role_name'], $permission_list)) { $permission_list[] = $value['role_name']; } } //匿名方法,处理子url生成 $getUrlList = function($url) { if (!strstr($url, '/')) { return [$url]; } $url = '/' . trim($url, '/'); $params = explode('/', $url); $param_arr = []; $param_str = []; if (!empty($params) is_array($params)) { foreach ($params as $key = $value) { if (!empty($value)) { $param_arr[] = $value; } } } if (!empty($param_arr)) { $tmp_str = ''; $param_str[] = $url; $count = count($param_arr); //生成子父级关系 for ($i = $count -1; $i = 0; $i--) { $tmp_str = '/' . $param_arr[$i] . $tmp_str; $chold_url = str_replace($tmp_str, '/*', $url); if (!in_array($chold_url, $param_str)) { $param_str[] = $chold_url; } } } return $param_str; }; //拼接检查数据,兼容单传和传输组的情况 $check_list = []; if (is_array($permission_name)) { foreach ($permission_name as $key = $value) { $check_list[$value] = $getUrlList($value); } } else { $check_list[$permission_name] = $getUrlList($permission_name); } if (empty($check_list)) { return false; } //批量检查是否有权限 $ret = []; foreach ($check_list as $key = $value) { $ret[$key] = false; foreach ($value as $k = $v) { if (in_array($v, $permission_list)) { $ret[$key] = true; break; } } } //兼容一维数组 if (count($ret) == 1) { $ret = array_values($ret); return $ret[0]; } return $ret; } 需要说明的是,注释掉的部分是管理员的权限检查,如果是管理员会自动返回所有的权限,但是这种不太好,因为实际情况中会分多种管理员,这样管理员不一定拥有所有的权限,如果这样不是超级管理员就不能使用,所以用的时候还是要慎重,最好统一使用权限检查。如果感觉那个SQL执行太慢可以添加缓存,缓存过期的时间和菜单过期类似,当用户的权限有变动的时候和菜单修改的时候跟新缓存。两一种解决办法是把这个方法协程单利,利用单利只是执行一次权限的查询,检查的阶段可以单独写成方法提供。 关于yii api接口开发和yii框架官网的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 yii api接口开发的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于yii框架官网、yii api接口开发的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:zabbix api接口(zabbix调用api接口进行监控)
下一篇:whois api接口(api是接口吗)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~