【PHP】PHPフレームワーク「Flow」を試してみる～参照可能ファイル編～

# 初めに
前回は[こちら](https://qiita.com/nnhkrnk/items/535811002aaee3134db3)の記事でファイルのダウンロード方法をまとめました。
今回はFlowにおける静的ファイルなどの参照可能なファイルの扱いについてまとめます。

# 事前知識
今回の記事は以下の記事に関連する内容を扱います。
必須ではないですが、必要に応じてご覧ください。

[【PHP】マイナーフレームワーク「Flow」を試してみる～ファイルアップロード編～](https://qiita.com/nnhkrnk/items/f06f40bf8e1159eff80d)
[【PHP】マイナーフレームワーク「Flow」を試してみる～ファイルダウンロード編～](https://qiita.com/nnhkrnk/items/535811002aaee3134db3)


# 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に記載をする必要があります。
```yaml: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領域配下のフォルダ構成は、[ファイルアップロード編](https://qiita.com/nnhkrnk/items/f06f40bf8e1159eff80d)で作成されたものです。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にアクセスしたところ、無事にアクセスできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/6d4045e8-bfdb-7138-641c-6df1773b0917.png)


Staticも問題なしです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430841/6532a74c-0472-e023-3dee-db8d46fc79cf.png)





# 終わりに
今回は参照可能なファイルの扱いについてまとめました。
次回はAOP関連についてまとめる予定です。
ここまで読んでいただきありがとうございました！

# 参考

https://flowframework.readthedocs.io/en/9.0/TheDefinitiveGuide/PartIII/ResourceManagement.html