初めに
前回はこちらの記事でファイルのダウンロード方法をまとめました。
今回はFlowにおける静的ファイルなどの参照可能なファイルの扱いについてまとめます。
事前知識
今回の記事は以下の記事に関連する内容を扱います。
必須ではないですが、必要に応じてご覧ください。
【PHP】マイナーフレームワーク「Flow」を試してみる~ファイルアップロード編~
【PHP】マイナーフレームワーク「Flow」を試してみる~ファイルダウンロード編~
Flowにおけるファイル管理
前提として、Flowではファイルを保存する領域が2つ存在します。
領域 | 用途 |
---|---|
Storage | アップロードされたファイルが保存される領域 |
Target | 外部から参照可能なファイルが保存されている領域 |
前回取り扱ったファイルアップロード、ダウンロードでは Storage領域を用いてファイルを管理していました。
今回は静的外部から参照されるファイルが保存されている Target領域について解説します。
Target領域とは
Target 領域とは、前述のとおり外部からアクセス可能なファイルを格納する領域です。
Flow では、プロジェクト直下にある Web
というディレクトリが外部から参照可能なディレクトリとなっています。その中の _Resources
というディレクトリが Target 領域になります。
Target領域は保存するデータの種類によって2種類の領域に分けられます。
領域名 | 詳細 |
---|---|
Static | 静的ファイル(cssファイルやファビコン画像など) |
Persistent | Storage領域に保存されたファイル(ユーザのアイコン画像など) |
以下のようなイメージです。
Project
└ Web
└ _Resources/
├ Persistent/
| └ [アップロードファイル名のHash値のディレクトリ]/
| └ upload.png ← アップロードファイル
|
└ Static/
└ Packages/
└ [パッケージ名のディレクトリ]/
└ favicon.png ← 静的ファイル
各領域について細かく説明していきます。
1. Static領域
ファビコンやcssファイルなどの静的ファイルが格納される領域です。
この領域に保存されているデータはすべてシンボリックリンクです。ファイルの実態は各パッケージ配下のClasses/Resources/Public
配下に存在します。
以下のようなイメージです。
Project/
├ Packages/
| └ Application/
| └ Neos.Welcome/
| └ Classes/
| └ Resources/
| └ Public(★リンク先)
| └ favicon.png
|
└ Web
└ _Resources/
└ Static/
└ Packages/
└ Neos.Welcome/(★リンク元)
└ favicon.png
この例でいうと、Web配下にあるNeos.Welcome
フォルダがシンボリックリンクフォルダになります。
このフォルダはFlowの起動時、または以下コマンドで作成されます。
$ ./flow resource:publish
2. Persistent領域
Persistent には Storage領域に格納されたファイルが保存されます。Storage領域とは違い、Hash化されていないファイル名で保存されます。
その代わりにディレクトリ名が Hash化された値と同じものになっており、これによってファイルの識別が可能になっています。
また、persistent領域に保存されているファイルの実態はStorage領域のファイルのシンボリックリンクになります。このシンボリックリンクはファイルがアップロードされたタイミングで自動的に作成されるようです。
Project
├ Data
| └ Persistent
| └ Resources
| └ 45a8c7...d8f ← アップロードしたファイル(★)
|
└ Web
└ _Resources
└ Persistent
└ 45a8c7...d8f/ ← Hash化された値がフォルダ名に
└ upload.png ← (★)ファイルのシンボリックリンク
Persistent領域の設定
Persistant領域を利用するには、以下のようにSettings.yamlに記載をする必要があります。
Neos:
Flow:
resource:
storages:
defaultPersistentResourcesStorage:
target: 'Neos\Flow\ResourceManagement\Target\FileSystemSymlinkTarget'
targetOptions:
path: '%FLOW_PATH_WEB%_Resources/Persistent/'
baseUri: '_Resources/Persistent/'
%FLOW_PATH_WEB%
はプロジェクト直下のWebディレクトリのことです。
baseUri はファイルにアクセスする際のパスになります。
実際に参照してみた
それでは実際にファイルにアクセスしてみましょう。
PersistentとStatic配下にあるファイルにアクセスしてみます。
Persistent領域配下のフォルダ構成は、ファイルアップロード編で作成されたものです。Hash名の上4桁がフォルダとして作成されるみたいです。
Project
└ Web
└ _Resources/
├ Persistent/
| └ f\
| └ d\
| └ 9\
| └ 3\
| └ fd9398696168cb57325e84cfef875f013e4d8c94/
| └ persistent.png
|
└ Static/
└ Packages/
└ Neos.Welcome/
└ static.png
URLは、サーバのホスト部の後に_Resources
後のパスをつけたものになります。
今回の場合以下です。
Persistent配下のファイル
http://localhost:8081/_Resources/Persistent/f/d/9/3/fd9398696168cb57325e84cfef875f013e4d8c94/persistent.png
Static配下のファイル
http://localhost:8081/_Resources/Static/Packages/Neos.Welcome/static.png
Persistentにアクセスしたところ、無事にアクセスできました。
終わりに
今回は参照可能なファイルの扱いについてまとめました。
次回はAOP関連についてまとめる予定です。
ここまで読んでいただきありがとうございました!
参考