laravelにtinyfilemanagerを組み込むメモ

laravelにtinyfilemanagerを組み込むメモ

2021年7月9日
ネット、計算機のお伴

laravel(v.8)で作成しているサイトにファイルアップロードの仕組みを組み込む必要があった。
自分の技術力で満足のいくものを自作するのは大変なので、既存のPHPのファイルマネージャをembedすることにした。

laravel用には


があるが、フォルダごとアップロード機能がないので利用断念。

tinyfilemanagerが使いやすいのと、embedモードがあったので、それを使わせてもらいました。
https://tinyfilemanager.github.io/

以下、そのメモ(手順に抜けがあるのが前提ですが、自分的に肝のところだけは書き残しておく)。

(1)tinyfilemanager(以下tfmと略)のファイルをincludeする設定

・routes/web.phpで、tfmを動作させたいパスとコントローラ(プラスfunction名)を指定

・コントローラーのfunction(ここではtfmとする)に、view(‘tfm.index’) (最低限の設定)

・viewで、mkdir tfm

・tfmの中にtfm/tinyfilemanager.phpとconfig.php

・tfmの中にindex.blade.phpを作り、@include(tinyfilemanager);

これでlaravel側の基本設定は終わる

(2)tinyfilemanagerは使いやすいのだが、phpファイルが実行+htmlハードコーディングのtinyfilemanager.phpと、configファイルの2つのみ。

当然、このままでは上のroutesのパスにアクセスすると色々と問題が生じるので、上の2つのphpを修正。
修正箇所は一杯あるが、長い(約4000行強ある)tinyfilemanager.phpをそのままいじると軽くしぬので、一旦phpを分割してそれぞれincludeし、

actions.php
auth.php
chmod.php

validate.php
viewer.php

つまり上のような感じにしておいて、これで本体を400行にする。

あとは、require(なんたら)
die()

とかしつつ、laravelのエラーメッセージを見ながら問題な部分を潰していく。

大体が、認証関係やパス設定関係で、どこかでエラーが出たり、勝手にリダイレクトされたりするので、そこを中心にコードを書き換える。

肝は6点(だいたい)
・FM_EMBEDED定数を定義すると、組み込みモードになる

・tfm独自の認証機構は使わないので、config.phpの$user_authをfalseにする。これで認証関係はパスしてくれる(laravel側の認証を使う)。

・config.phpの$root_pathに対して、ファイルアップロードフォルダをフルパスで書く

・同じく$root_urlは、ホスト名以下のURLパスを書く。たとえばhttps://example.com/somthing/admin/uploadでtfmを動作させたいなら、/somthing/admin/uploadと定義する。
・FM_SELF_URL定数に基づいて、$root_url変数を作る場所があるのだが、FM_SELF_URL定数はデフォルトでは定義されていない。$root_urlを定義しておけば問題はないがリバースプロキシも使っているので、FM_SELF_URLを明示的に定義しておく。この例では動作スキーマ+フルパスのhttps://example.com/somthing/admin/uploadとなる。

・functionでglobalを使っている変数がうまく動作しない。なので、それは必要な範囲でゴニョゴニョする(スーパーグローバルに書き換えるととうまくいくと思うがコードを追いつつ書き換えるのが面倒)

他にもコメントアウトしたりした部分(loginとか使わないし)があるが、それは略

(3)POSTを効かせるために@csrfを無効にする
最初はbladeっぽくformの中に@csrfを入れてみたがうまく動作しないので、\Middleware\VerifyCsrfTokenの、$except変数(protected)に、無効にしたいパスを書く。上の例では、admin/upload/*とか書けばいい。これで、uploadが可能となる。

(4)大体動作が確認されたら日本語化。
日本語化はハマった。translation.jsonで日本語化されてるのだが、国別配列が反映しない。$tr変数がglobalで受け渡しされてるんだがどうも・・・
というわけで、function lang($tr)の中の処理でデフォルトがenになってる部分を if (!strlen($lang)) $lang = ‘ja’;と書き換えた。

(5)あとは、不要な動作リンク(たとえばアップロードだけできればいい使い方だと、新規ファイル・フォルダをつくとか、不要な別名コピーとかそういうの)のhtmlをコメントアウfト。