昨年、SitePoint Web サイトは、トップの PHP 開発フレームワークのいくつかに焦点を当てた記事を公開しました。 4 位は Yii (イーと同じ発音) フレームワークです。 当時、Yii フレームワークの最新バージョンは 1.1.14 でした。最近、Yii バージョン 2.0 がリリースされ、製品でバージョン 2.0 を使用できるようになりました。
Yii フレームワークがまだ RC 候補段階にあり、完全にリリース候補段階に達したばかりのときに私たちは Yii フレームワークについて報告しましたが、正式バージョンがリリースされた今、このトピックについてもう一度議論する時期が来たと感じています。 Yii Framework の理由。
1. インストールが簡単
Web 開発者にとって、時は金なりであり、複雑なインストールと構成のプロセスに貴重な時間を費やしたい人はいません。
インストールは Composer を使用して処理されます。インストール プロセスについて説明したい場合は、Sitepoint が最近ここで素晴らしい記事を公開しました。 Web サイトにフロントエンドとバックエンドのコンポーネントが分かれている場合でも、私は基本的なアプリケーション テンプレートを使用することが多いです。代わりに、Web サイトのバックエンド部分にモジュールを使用することにしました。 (Yii モジュールは、メインアプリケーション内に存在するミニアプリケーションとして説明するのが最も適切です)。
注: 以下の例では、単純なテンプレートからディレクトリ構造の使用まで、多くのディレクトリ参照が使用されています。
2. 最新のテクノロジーを活用する
Yii は純粋なオブジェクト指向フレームワークであり、遅延静的バインディング、SPL クラスとインターフェイス、匿名関数などの PHP のより高度な機能を利用しています。
すべてのクラスの名前空間。PSR-4 準拠のオートローダーを利用できます。これは、Yii の HTML ヘルパー クラスをインクルードするのが次のように簡単であることを意味します:
リーリーYii では、名前空間を簡素化するためにエイリアスを定義することもできます。 上の例では、 use ステートメントは、デフォルトのディレクトリ /vendor/yiisoft/yii2/helpers に配置されているクラス定義をロードします。このエイリアスは、BaseYii クラスの 79 行目で定義されています。 リーリー
フレームワーク自体は拡張機能である Composer を使用してインストールされます。 拡張機能を公開するプロセスも、独自のcomposer.jsonを作成してコードをGithubにホストし、拡張機能をPackagistにリストするだけで簡単です。
3. 高い拡張性
Yii は見栄えの良いスーツのように見えますが、フレームワークのほぼすべてのコンポーネントは拡張可能です。簡単な例は、一意のプリンシパル ID をビューに追加することです。 (これを行う理由に興味がある場合は、この記事を読んでください)。まず、appcomponents ディレクトリに View.php という名前のファイルを作成し、次のコードを追加します。 リーリー
次に、メイン レイアウト ファイル (appviewslayoutsmain.php) の body タグ内の HTML に次のコードを追加します。 リーリー
最後に、次のコードをメイン設定ファイルに追加して、Yii に独自のデフォルト クラスの代わりに拡張ビュー クラスの使用方法を知らせます。 リーリー 4. テストを奨励するYii フレームワークと Codeceptionフレームワーク は緊密に統合されています。 Codeception は、単体テストと機能受け入れテストの作成プロセスを簡素化するのに役立つ優れた PHP テスト フレームワークです。 すべてのアプリケーションの自動テスト ケースを作成しているとします。
Codeception 拡張機能を使用すると、テスト中にアプリケーションを簡単に構成できます。 アプリケーションをテストするには、既存のファイル /tests/_config.php を編集するだけです。例: リーリー 上記の構成を使用する場合は、次の点に注意する必要があります:
Codeception 内部には特別なモジュールがあり、特に Yii フレームワークのテストに使用されます。 これは、Active RecordYii の ORM) が機能テスト中に正常に動作できるようにするために、TestGuy クラスにいくつかのメソッドを追加します。 たとえば、登録フォームがユーザー名 testuser の User オブジェクトを正常に作成したかどうかを確認したい場合は、次のようにすることができます:
リーリー 5. シンプルなセキュリティソリューションセキュリティはあらゆる Web アプリケーションの重要な部分であり、幸いなことに Yii には負担を軽減するための優れた機能が数多くあります。 Yii には、より安全なアプリケーションの作成に役立ついくつかのメソッドを公開するセキュリティ アプリケーション コンポーネントが付属しています。より便利なメソッドのいくつかは次のとおりです。
generatePasswordHash: パスワードとランダムなソルトから安全なハッシュを生成します。このメソッドはランダムなソルトを作成し、PHP の crypt 関数を使用して指定された文字列に基づいてハッシュを作成します。
validatePassword: これは、generatePasswordHash と組み合わせて使用できるメソッドで、ユーザーが提供したパスワードが保存したハッシュ値と一致するかどうかを確認できます。
generateRandomKey: 可逆让你创建一个任何长度的随机字符串
Yii 会自动对所有非安全 HTTP 请求方法 (PUT, POST, DELETE) 的可用CSRF令牌进行检查, 并将在你使用 ActiveForm::begin() 方法创建你的开发表单标签时生成并输出一个令牌值. 这个特性可以通过编辑你的主配置文件,包含下面的代码来禁用:
<ol class="dp-c"><li class="alt"><span><span class="keyword">return</span><span> [ </span></span></li><li><span> <span class="string">'components'</span><span> => [ </span></span></li><li class="alt"><span> <span class="string">'request'</span><span> => [ </span></span></li><li><span> <span class="string">'enableCsrfValidation'</span><span> => false, </span></span></li><li class="alt"><span> ] </span></li><li><span>]; </span></li></ol>
为了堤防跨站脚本XSS的攻击,Yii提供了另外一个叫做 HtmlPurifier 的辅助类. 这个类有一个名为 process 的静态方法, 而它将会使用同名的 流行过滤器库 来过滤你的输出.
Yii 也包含了随时就绪的用于用户认证和授权的类. 授权被分成了两个类型: ACF (访问控制过滤器) 和RBAC (基于角色访问的控制).
两者中更加的是 ACF, 其实现是通过在你控制器的添加下列的 行为 方法:
<ol class="dp-c"><li class="alt"><span><span class="keyword">use</span><span> yii\filters\AccessControl; </span></span></li><li><span> </span></li><li class="alt"><span><span class="keyword">class</span><span> DefaultController </span><span class="keyword">extends</span><span> Controller { </span></span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> behaviors() { </span></span></li><li><span> <span class="keyword">return</span><span> [ </span></span></li><li class="alt"><span> <span class="comment">// ...</span><span> </span></span></li><li><span> <span class="string">'class'</span><span> => AccessControl::className(), </span></span></li><li class="alt"><span> <span class="string">'only'</span><span> => [</span><span class="string">'create'</span><span>, </span><span class="string">'login'</span><span>, </span><span class="string">'view'</span><span>], </span></span></li><li><span> <span class="string">'rules'</span><span> => [ </span></span></li><li class="alt"><span> [ </span></li><li><span> <span class="string">'allow'</span><span> => true, </span></span></li><li class="alt"><span> <span class="string">'actions'</span><span> => [</span><span class="string">'login'</span><span>, </span><span class="string">'view'</span><span>], </span></span></li><li><span> <span class="string">'roles'</span><span> => [</span><span class="string">'?'</span><span>] </span></span></li><li class="alt"><span> ], </span></li><li><span> [ </span></li><li class="alt"><span> <span class="string">'allow'</span><span> => true, </span></span></li><li><span> <span class="string">'actions'</span><span> => [</span><span class="string">'create'</span><span>], </span></span></li><li class="alt"><span> <span class="string">'roles'</span><span> => [</span><span class="string">'@'</span><span>] </span></span></li><li><span> ] </span></li><li class="alt"><span> ] </span></li><li><span> ]; </span></li><li class="alt"><span> } </span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span>} </span></li></ol>
上面的代码会告诉 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配置文件如下:
<ol class="dp-c"><li class="alt"><span><span class="keyword">if</span><span> (YII_ENV_DEV) { </span></span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span> <span class="vars">$config</span><span>[</span><span class="string">'modules'</span><span>][</span><span class="string">'gii'</span><span>] = [ </span></span></li><li><span> <span class="string">'class'</span><span> => </span><span class="string">'yii\gii\Module'</span><span>, </span></span></li><li class="alt"><span> <span class="string">'allowedIPs'</span><span> => [</span><span class="string">'127.0.0.1'</span><span>, </span><span class="string">'::1'</span><span>] </span></span></li><li><span> ] </span></li><li class="alt"><span>} </span></li></ol>
这确保了Gii只有设置了Yii的环境变量为development)开发环境时才加载,并且只在通过本地环境访问的时候加载。
现在,让我们来看看模型的生成:
表格名称使用了一个响应敲击就会显示的小窗口来尝试给出对你的模型将会关联的表格的猜测, 并且所有的域值输入框都会有一个翻转效果显示出来的提示,提醒你如何完成对它们的填写. 你可以在让Gii输出代码之前先进行一下预览, 而所有的代码模板都是完全可定制的.
也有几个可以用于数据库迁移、消息翻译I18N)以及生成用于自动化测试数据库道具的命令行辅助工具. 例如,你可以使用如下代码创建一个新的数据库迁移 文件:
<ol class="dp-c"><li class="alt"><span><span>yii migrate/create create_user_table </span></span></li></ol>
这将会在 {应用目录}/migrations 创建一个新的看起来像下面这样的迁移模板:
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span> </span></li><li class="alt"><span> <span class="keyword">use</span><span> yii\db\Schema; </span></span></li><li><span> </span></li><li class="alt"><span> <span class="keyword">class</span><span> m140924_153425_create_user_table </span><span class="keyword">extends</span><span> \yii\db\Migration </span></span></li><li><span> { </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> up() </span></span></li><li><span> { </span></li><li class="alt"><span> </span></li><li><span> } </span></li><li class="alt"><span> </span></li><li><span> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> down() </span></span></li><li class="alt"><span> { </span></li><li><span> <span class="func">echo</span><span> </span><span class="string">"m140924_153425_create_user_table cannot be reverted.\n"</span><span>; </span></span></li><li class="alt"><span> </span></li><li><span> <span class="keyword">return</span><span> false; </span></span></li><li class="alt"><span> } </span></li><li><span>} </span></li></ol>
如此假如说我想要想这个表添加一些列. 我就只要简单的将下面的代码添加到 up 方法中:
<ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> up() </span></span></li><li><span>{ </span></li><li class="alt"><span> <span class="vars">$this</span><span>->createTable(</span><span class="string">'user'</span><span>, [ </span></span></li><li><span> <span class="string">'id'</span><span> => Schema::TYPE_PK, </span></span></li><li class="alt"><span> <span class="string">'username'</span><span> => Schema::TYPE_STRING . </span><span class="string">' NOT NULL'</span><span>, </span></span></li><li><span> <span class="string">'password_hash'</span><span> => Schema:: TYPE_STRING . </span><span class="string">' NOT NULL'</span><span> </span></span></li><li class="alt"><span> ], null); </span></li><li><span>} </span></li></ol>
然后为了确保我可以进行迁移的逆向操作,我就会编辑down方法:
<ol class="dp-c"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">function</span><span> down() </span></span></li><li><span>{ </span></li><li class="alt"><span> <span class="vars">$this</span><span>->dropTable(</span><span class="string">'user'</span><span>); </span></span></li><li><span>} </span></li></ol>
创建表格可能就是简单的设计到在命令行上运行一个命令:
<ol class="dp-c"><li class="alt"><span><span>./yii migrate </span></span></li></ol>
而删除表格是下面的这个命令:
<ol class="dp-c"><li class="alt"><span><span>./yii migrate/down </span></span></li></ol>
7. 很容易通过调整获得更好的性能
所有人都知道一个慢吞吞的网站会造就许多心怀不满的用户, 因此Yii为你提供了一些工具来帮助你让应用程序获得更快的速度.
所有的Yii缓存组件都扩展自 yii/caching/Cache, 它能让你在使用一个公共API的同时选择任意某一个缓存系统. 你甚至可以同时注册多个高速缓存组件. Yii 当前支持数据库和文件系统缓存, 还有 APC, Memcache, Redis, WinCache, XCache 以及 Zend Data Cache.
默认情况下,如果你是使用的 Active Record ,那么 Yii 会额外运行一个查询来确定生成你模型的表的结构. 你可以通过像下面这样编辑你的主配置文件,对你的应用程序进行设置,以缓存这些表结构:
<ol class="dp-c"><li class="alt"><span><span class="keyword">return</span><span> [ </span></span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span> <span class="string">'components'</span><span> => [ </span></span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span> <span class="string">'db'</span><span> => [ </span></span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span> <span class="string">'enableSchemaCache'</span><span> => true, </span></span></li><li><span> <span class="string">'schemaCacheDuration'</span><span> => 3600, </span></span></li><li class="alt"><span> <span class="string">'schemaCache'</span><span> => </span><span class="string">'cache'</span><span>, </span></span></li><li><span> ], </span></li><li class="alt"><span> <span class="string">'cache'</span><span> => [ </span></span></li><li><span> <span class="string">'class'</span><span> => </span><span class="string">'yii\caching\FileCache'</span><span>, </span></span></li><li class="alt"><span> ], </span></li><li><span> ], </span></li><li class="alt"><span>]; </span></li></ol>
最后,Yii有一个命令行工具可以便于对前端字段进行缩小化. 简单地运行下面的命令就可以生成一个配置模板:
<ol class="dp-c"><li class="alt"><span><span>./yii asset/template config.php </span></span></li></ol>
然后编辑该配置,指定你想要用那些工具来执行缩小化操作(比如. Closure Compiler, YUI Compressor, 或者 UglifyJS). 生成的配置模板如下所示:
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span> <span class="keyword">return</span><span> [ </span></span></li><li class="alt"><span> <span class="string">'jsCompressor'</span><span> => </span><span class="string">'java -jar compiler.jar --js {from} --js_output_file {to}'</span><span>, </span></span></li><li><span> <span class="string">'cssCompressor'</span><span> => </span><span class="string">'java -jar yuicompressor.jar --type css {from} -o {to}'</span><span>, </span></span></li><li class="alt"><span> <span class="string">'bundles'</span><span> => [ </span></span></li><li><span> <span class="comment">// 'yii\web\YiiAsset',</span><span> </span></span></li><li class="alt"><span> <span class="comment">// 'yii\web\JqueryAsset',</span><span> </span></span></li><li><span> ], </span></li><li class="alt"><span> <span class="string">'targets'</span><span> => [ </span></span></li><li><span> <span class="string">'app\config\AllAsset'</span><span> => [ </span></span></li><li class="alt"><span> <span class="string">'basePath'</span><span> => </span><span class="string">'path/to/web'</span><span>, </span></span></li><li><span> <span class="string">'baseUrl'</span><span> => </span><span class="string">''</span><span>, </span></span></li><li class="alt"><span> <span class="string">'js'</span><span> => </span><span class="string">'js/all-{hash}.js'</span><span>, </span></span></li><li><span> <span class="string">'css'</span><span> => </span><span class="string">'css/all-{hash}.css'</span><span>, </span></span></li><li class="alt"><span> ], </span></li><li><span> ], </span></li><li class="alt"><span> <span class="string">'assetManager'</span><span> => [ </span></span></li><li><span> <span class="string">'basePath'</span><span> => __DIR__, </span></span></li><li class="alt"><span> <span class="string">'baseUrl'</span><span> => </span><span class="string">''</span><span>, </span></span></li><li><span> ], </span></li><li class="alt"><span> ]; </span></li></ol>
接下来,运行这个控制台命令以执行压缩.
<ol class="dp-c"><li class="alt"><span><span>yii asset config.php /app/assets_compressed.php </span></span></li></ol>
最后,修改你的web应用程序配置文件,使用压缩后的资源.
<ol class="dp-c"><li class="alt"><span><span class="string">'components'</span><span> => [ </span></span></li><li><span> <span class="comment">// ...</span><span> </span></span></li><li class="alt"><span> <span class="string">'assetManager'</span><span> => [ </span></span></li><li><span> <span class="string">'bundles'</span><span> => </span><span class="keyword">require</span><span> </span><span class="string">'/app/assets_compressed.php'</span><span> </span></span></li><li class="alt"><span> ] </span></li><li><span>] </span></li></ol>
注意: 你需要手动下载并安装这些额外的工具.
总结
跟任何好的框架类似,Yii可以帮助你快速的创建现代的web应用程序,并确保它们表现的良好. 它能通过为你代劳一些体力活,来促使你创建安全并且可测试的网站. 你可以简单的使用到他们所提供的大多数特性,或者你也可以修改它们以适应你自己的需要. 我真心鼓励你在你的下一个web项目中能试上它一试!
你尝试过 Yii 2 么? 你将会尝试它么? 让我们了解下吧!