热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

列举PHP的Yii2框架的开发优势

这篇文章主要介绍了PHP的Yii2框架的开发优势,正是因为有很多新兴框架的涌现才得以维持PHP的生命力,需要的朋友可以参考下
当 Yii框架仍处于 RC(候选版)阶段时,我们 对它进行过报道,那时它刚刚全面达到候选版本阶段,(现在它已经发布了正式版本)我们感觉是时候再次讨论这个话题:选择 Yii框架的原因。

1. 易于安装

对于web开发人员来说,时间就是金钱,没有人愿意把宝贵的时间花在一个复杂的安装和配置过程。

安装处理使用Composer。如果你想要描述安装的过程,Sitepoint最近发表了一篇很棒的文章,在这儿。我倾向于使用基本的应用程序模板,即使我的网站有一个单独的前端和后端组件。相反,我选择使用一个模块给我的网站的后台部分。(Yii模块是最好的描述,小应用驻留在主应用程序里面)。

注意:许多目录的引用在后面的示例中,从简单的模板去使用目录的结构。

2. 利用现代技术

Yii是一种纯粹的面向对象框架,并且利用PHP的一些更高级的功能,包括延迟静态绑定,SPL类和接口,和匿名函数。

所有的类名称空间,它允许你利用PSR-4兼容的自动装载器。这意味着包括Yii 的 HTML的帮助类一样的简单:

use yii\helpers\Html;

Yii 也允许你定义别名来帮助简化你的命名空间。 在上面的示例中, use 语句将加载一个类定义,默认放的目录 /vendor/yiisoft/yii2/helpers. 这个别名在BaseYii 类在第79行中定义:

public static $aliases = ['@yii' => __DIR__];

框架本身的安装使用Composer,是其扩展。 甚至出版的过程扩展一样容易创建自己的 composer.json,并在Github托管代码,列出您的扩展在Packagist。

3. 高度可扩展性

Yii 看起来就像一件样式很棒的西装,但也非常容易根据你的需求来进行定制. 实际上框架的每一个组件都是可以扩展的。一个简单的示例就是添加一个唯一的主体ID到你的视图上。 (你如果对自己为什么可能会想要这样做感兴趣的话,可以看看这篇 文章).

首先,我会在我的 app\components 目录相面创建一个名为 View.php 的文件, 并加入如下代码:

namespace app\components;
 
class View extends yii\web\View {
 
  public $bodyId;
 
  /* Yii allows you to add magic getter methods by prefacing method names with "get" */
 
  public function getBodyIdAttribute() {
    return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : '';
  }
 
}

然后,在我的主布局文件 (app\views\layouts\main.php) 中,我会将如下代码添加到我的HTML中body标签的里面:

BodyIdAttribute?>>

而最后,我会加下列的代码添加到我的主配置文件中,以便让Yii知道如何去使用我扩展的视图类,而不是它自己默认的那个类:

return [
  // ...
  'components' => [
    // ...
    'view' => [
      'class' => 'app\components\View'
    ]  
  ]
];

4. 鼓励测试

Yii 框架和Codeception框架紧密地集成在一起。 Codeception 是一个优秀的PHP测试框架,它帮助简化创建单元测试、功能验收测试的流程。 条件是你在为所有的应用程序编写自动化的测试用例,对吧?

Codeception 扩展使得在测试时配置应用程序变得简单。 测试应用程序,只需编辑一个已存在的文件/tests/_config.php。例如:

return [
  'components' => [
    'mail' => [
      'useFileTransport' => true,
    ],
    'urlManager' => [
      'showScriptName' => true,
    ],
    'db' => [
        'dsn' => 'mysql:host=localhost;dbname=mysqldb_test',
    ],
  ],
];

使用上面的配置,需要注意下面一些事项:

  • 在功能验收测试期间,所有发送的邮件都会被写入一个文件中保存,而非真正地发送出去。
  • 测试时URL的格式是index.php/controller/action,而非/controller/action。
  • 测试时需要使用测试数据库,而非生产数据库。

Codeception 内部存在一个特殊的模块,专门用于Yii 框架测试。 它在TestGuy类里添加了一些方法,保证功能测试时 Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注册表单是否成功地创建了一个用户名为testuser的User对象,你可以这样做:

$I->amOnPage('register');
$I->fillField('username', 'testuser');
$I->fillField('password', 'qwerty');
$I->click('Register');
$I->seeRecord('app\models\User', array('name' => 'testuser'));


5. 简化的安全方案

安全性是任何web应用的重要组成部分,幸运的是Yii有许多很棒的特性能帮你减轻负担.

Yii 带来了一个安全性 应用程序组件,它暴露了一些可以帮助可以用来创建一个更加安全的应用程序的方法. 其中一些相对而言更加有用的方法有:

generatePasswordHash: 从一个密码和一个随机的盐值生成一个安全的哈希值. 这个方法会为你创建一个随机的盐值,然后使用PHP的 crypt 函数来根据所提供的字符串创建一个哈希值.

validatePassword: 这是一个可以同 generatePasswordHash 搭配使用的方法, 并可以让你检查用户提供的密码是否同你存储的哈希值匹配.

generateRandomKey: 可逆让你创建一个任何长度的随机字符串

Yii 会自动对所有非安全 HTTP 请求方法 (PUT, POST, DELETE) 的可用CSRF令牌进行检查, 并将在你使用 ActiveForm::begin() 方法创建你的开发表单标签时生成并输出一个令牌值. 这个特性可以通过编辑你的主配置文件,包含下面的代码来禁用:

  return [
    'components' => [
      'request' => [
        'enableCsrfValidation' => false,
      ]
  ];

为了堤防跨站脚本XSS的攻击,Yii提供了另外一个叫做 HtmlPurifier 的辅助类. 这个类有一个名为 process 的静态方法, 而它将会使用同名的 流行过滤器库 来过滤你的输出.

Yii 也包含了随时就绪的用于用户认证和授权的类. 授权被分成了两个类型: ACF (访问控制过滤器) 和RBAC (基于角色访问的控制).

两者中更加的是 ACF, 其实现是通过在你控制器的添加下列的 行为 方法:

use yii\filters\AccessControl;
 
class DefaultController extends Controller {
  // ...
  public function behaviors() {
    return [
      // ...
      'class' => AccessControl::className(),
      'only' => ['create', 'login', 'view'],
        'rules' => [
        [
          'allow' => true,
          'actions' => ['login', 'view'],
          'roles' => ['?']
        ],
        [
          'allow' => true,
          'actions' => ['create'],
          'roles' => ['@']
        ]
      ]
    ];
  }
  // ...
}


上面的代码会告诉 DefaultControllerto 让访客用户访问login和view的action, 而不是create这个action. (问号 ? 是匿名用户的别名, 而 @ 表示的是已经被授权的用户).

RBAC 是一个可以在应用程序中指定那些用户可以执行特定的动作的强大方法. 它涉及为你的用户创建角色,为你的app定义权限,并然后为他们预期的角色使用这些角色. 如果你想要创建一个审核员(Moderator)的角色就可以使用这个方法, 并可以让所有分配到这个角色的用户可以对文章进行审核.

你也还可以使用 RBAC 定义规则, 它可以让你在特定条件下针对你应用程序的某些方面进行授权. 例如,你可以创建一个规则让用户可以编辑他们自己的文章, 而不能修改由其他人创建的文章.

6. 缩短开发时间

大多数的项目都包含了重复的任务,没有人想把时间浪费在这些重复工作上面。Yii 提供了一些工具来帮助你在这些任务上花费更少的时间,把大多数时间都用在定制应用来满足你客户的需求上。

其中最强大的一个工具就是“Gii”。Gii是一个基于web脚手架代码工具,它可以让你快速的创建一个代码模板如下所示:

  • Models
  • Controllers
  • Forms
  • Modules
  • Extensions
  • CRUD controller actions and views

Gii是高度可配置的。你可以设置它只从一个特定的环境加载。简单的编辑web配置文件如下:

 
if (YII_ENV_DEV) {
  // ...
  $config['modules']['gii'] = [
    'class' => 'yii\gii\Module',
    'allowedIPs' => ['127.0.0.1', '::1']
  ]
}

这确保了Gii只有设置了Yii的环境变量为(development)开发环境时才加载,并且只在通过本地环境访问的时候加载。


现在,让我们来看看模型的生成:

201573142815193.jpg (1366×914)

表格名称使用了一个响应敲击就会显示的小窗口来尝试给出对你的模型将会关联的表格的猜测, 并且所有的域值输入框都会有一个翻转效果显示出来的提示,提醒你如何完成对它们的填写. 你可以在让Gii输出代码之前先进行一下预览, 而所有的代码模板都是完全可定制的.

也有几个可以用于数据库迁移、消息翻译(I18N)以及生成用于自动化测试数据库道具的命令行辅助工具. 例如,你可以使用如下代码创建一个新的数据库迁移 文件:

yii migrate/create create_user_table

这将会在 {应用目录}/migrations 创建一个新的看起来像下面这样的迁移模板:

<&#63;php
 
  use yii\db\Schema;
 
  class m140924_153425_create_user_table extends \yii\db\Migration
  {
    public function up()
    {
 
    }
 
    public function down()
    {
      echo "m140924_153425_create_user_table cannot be reverted.\n";
 
      return false;
    }
}

如此假如说我想要想这个表添加一些列. 我就只要简单的将下面的代码添加到 up 方法中:

public function up()
{
  $this->createTable('user', [
    'id' => Schema::TYPE_PK,
    'username' => Schema::TYPE_STRING . ' NOT NULL',
    'password_hash' => Schema:: TYPE_STRING . ' NOT NULL'
  ], null);
}

然后为了确保我可以进行迁移的逆向操作,我就会编辑down方法:

public function down()
{
  $this->dropTable('user');
}

创建表格可能就是简单的设计到在命令行上运行一个命令:

./yii migrate

而删除表格是下面的这个命令:

./yii migrate/down

7. 很容易通过调整获得更好的性能

所有人都知道一个慢吞吞的网站会造就许多心怀不满的用户, 因此Yii为你提供了一些工具来帮助你让应用程序获得更快的速度.

所有的Yii缓存组件都扩展自yii/caching/Cache, 它能让你在使用一个公共API的同时选择任意某一个缓存系统. 你甚至可以同时注册多个高速缓存组件. Yii 当前支持数据库和文件系统缓存, 还有 APC, Memcache, Redis, WinCache, XCache 以及 Zend Data Cache.

默认情况下,如果你是使用的 Active Record ,那么 Yii 会额外运行一个查询来确定生成你模型的表的结构. 你可以通过像下面这样编辑你的主配置文件,对你的应用程序进行设置,以缓存这些表结构:

return [
  // ...
  'components' => [
    // ...
    'db' => [
      // ...
      'enableSchemaCache' => true,
      'schemaCacheDuration' => 3600,
      'schemaCache' => 'cache',
    ],
    'cache' => [
      'class' => 'yii\caching\FileCache',
    ],
  ],
];


最后,Yii有一个命令行工具可以便于对前端字段进行缩小化. 简单地运行下面的命令就可以生成一个配置模板:

./yii asset/template config.php

然后编辑该配置,指定你想要用那些工具来执行缩小化操作(比如. Closure Compiler, YUI Compressor, 或者 UglifyJS). 生成的配置模板如下所示:

<&#63;php
  return [
    'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}',
    'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}',
    'bundles' => [
      // 'yii\web\YiiAsset',
      // 'yii\web\JqueryAsset',
    ],
    'targets' => [
      'app\config\AllAsset' => [
        'basePath' => 'path/to/web',
        'baseUrl' => '',
        'js' => 'js/all-{hash}.js',
        'css' => 'css/all-{hash}.css',
      ],
    ],
    'assetManager' => [
      'basePath' => __DIR__,
      'baseUrl' => '',
    ],
  ];

接下来,运行这个控制台命令以执行压缩.

yii asset config.php /app/assets_compressed.php

最后,修改你的web应用程序配置文件,使用压缩后的资源.

'components' => [
  // ...
  'assetManager' => [
    'bundles' => require '/app/assets_compressed.php'
  ]
]

注意: 你需要手动下载并安装这些额外的工具.

推荐阅读
  • 2月4日每日安全热点节日期间某企远程办公遭XRed攻击 ... [详细]
  • JVM(三)虚拟机栈 多合一总述
    虚拟机栈概述虚拟机栈出现背景:由于跨平台性的设计,Java的指令都是根据栈来设计的。不同CPU架构不同,所以不能设计为基于寄存器的跨平台的优点:指令集小,编译器容易实现,缺点是性能 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • jvm内存区域与溢出为什么学习jvm木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握。当一个系统出现内存溢出,内存泄露的时候 ... [详细]
  • 通过存储型XSS漏洞获取目标用户本地私钥信息
    运维|安全存储型XSS漏洞,目标用户,本地,私钥信息运维-安全舍得网源码,vscode代码检查工具,ubuntu壁纸修改,tomcat网页部署项目,爬虫枯木,php采集文件,马鞍山 ... [详细]
  • JDK1.7及之前的JMM先看一张图,很清晰的说明了JAVA内存结构布局:JAVA内存结构主要分为三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块内存,由年轻代和老年代组成。 ... [详细]
  • php生成shtml类用法的简单介绍
    本文目录一览:1、phpcmsv9怎么生成shtml ... [详细]
author-avatar
caihuiqian_558
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有