1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-01-06

初めに

前回はこちらの記事でファイルのダウンロード方法をまとめました。
今回は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に記載をする必要があります。

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にアクセスしたところ、無事にアクセスできました。
image.png

Staticも問題なしです。
image.png

終わりに

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

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?