Yiiのアセットマネージャーの主な利点は、コンポーネントを自己完結型の方法で構造化できることです。
ウィジェットの物語
UIウィジェットであるコンポーネントについて考えてみます。ディストリビューションに、コンポーネントの実装とともにいくつかのアセットが含まれていると仮定します。たとえば、次のファイルです。
SuperWidget.php
superwidget.css
superwidget.js
image_for_css.png
アセットマネージャーが存在しなかった場合に、このウィジェットをアプリケーションにどのように組み込むかを検討してください。一般的な手順は次のとおりです。
- ディレクトリ
SuperWidget.php
内のどこかにコピーしますprotected/
- ディレクトリにコピー
superwidget.js
しますjs/
- ディレクトリにコピー
superwidget.css
しますcss/
- ディレクトリにコピー
image_for_css.png
するimages/
か、おそらく内部にコピーしてcss/
、相対的なパスの依存関係を減らすのに役立ててください
次に、実行時にSuperWidgetはCSSとJavaScriptを含めるために適切なタグを発行します。これを行うには、これらのアセットを正確にどこに配置したかを知る必要があります。言い換えれば、インストールに関するいくつかの選択は任意に行うことができますが、ソースを編集しない限り、それらは石に設定されます。
ウィジェットは再利用できますか?
このウィジェットが高度にカスタマイズされており、アプリケーションの不可分の一部となることを意図している場合、このアプローチは正常に機能し、アセットマネージャーを用意する必要はあまりありません。しかし、配布したいのが広く役立つコンポーネントである場合はどうでしょうか。
問題が発生し始めます。
まず、調査した展開スキームでは、ウィジェットのユーザーがさまざまなファイルをさまざまなディレクトリにコピーする必要があり、インストール手順が複雑になり、エラーが発生する可能性が高くなります。
ただし、より大きな問題は、デプロイメントスキームが、独自に開発された他のコンポーネントのデプロイメントスキームと競合する可能性があることです。他の誰かがsuperwidget.js
ファイルを持っていると決めた場合はどうなりますか?
これら2つのコンポーネントのインストール手順が矛盾する場合は、明らかに一方を意図したとおりにインストールできないため、詳細を変更し、コンポーネントのソースコードをハッキングして、これらの変更に対応します。後でそのコンポーネントの新しいバージョンにアップグレードする場合は、カスタマイズを慎重に考慮する必要があり、「コピー/上書き」アップグレードは不可能になります。
これらすべては実際にはきれいではなく、実際には起こりそうにないかもしれませんが、それは確かに正しく感じられません。
資産運用会社、そうする
ここでアセットマネージャーが登場します。コンポーネントを次のように構成することにしたとしましょう。
superwidget/
SuperWidget.php
assets/
css/
superwidget.css
js/
superwidget.js
images/
image_for_css.png
protected/
インストールした他のコンポーネントに関係なく、これをディレクトリ内のどこかに直接コピーできます。ここで発生する可能性のある最悪の事態superwidget/
は、競合が発生した場合に別の名前に変更する必要があることです。
アセットマネージャーを使用して、ディレクトリ全体をSuperWidget.php
公開superwidget/assets/
します。コピーは、たとえばassets/1337c0de/
、assets/
アプリケーションのベースアセットパスで1337c0de/
あり、Yiiによって作成され、他の公開されたアセットと競合しないことが保証されたランダムハッシュです。
これは、SuperWidgetのアセットが他のコンポーネントのアセットと競合する可能性がないことを意味し、 SuperWidgetを真に再利用可能にします。また、内部のディレクトリ構造1337c0de/
はディストリビューションと同じであるため、CSSは../images/
、ランダムハッシュの値(公開後にのみ認識される)を参照しなくても、相対パスを使用して画像を参照できます。
資産運用会社ではないこと
- これはセキュリティを強化する方法ではありません。コンポーネントソースはとにかく内部のどこかにあり
protected/
(したがって、そこでは改善されません)、アセットは、コピーされる場所に関係なくWebアクセス可能である必要があります(何があってもセキュリティはありません)。
- これは、アセットを処理するための包括的なソリューションではありません(CSSの縮小など)。これを行うカスタムアセットマネージャーをインストールすることは可能ですが、再利用可能なコンポーネントに含まれるアセットは、すべての「ベースアプリケーション」アセットの中で少数派になることを忘れないでください。全面的に縮小したい場合は、他のすべても処理する必要があり、アセットマネージャーはそこであなたを助けません。
TL; DR
アセットマネージャーを使用すると、他のコンポーネントとの競合を恐れることなく、簡単に配布でき、アプリケーションに含めることができるコンポーネントを作成できます。