やりたいこと
管理画面でHTMLエディタを使う案件があった。
エディタ自体は良いんだけど、そのなかに画像を組み込みたい要望があったため、CKEditor + kcfinder の組み合わせで作ることにした。
kcfinder: github/sunhater/kcfinder
必要な条件
管理画面にログインしたユーザーごとに画像を管理したい。
その際、他のユーザーのディレクトリやファイルが絶対に見えないようにしたい。
途中経過(1) ... integration !
kcfinder/integration/laravel.administrator.php
なんていうファイルがあったから調べてみた。いや、調べようとしてみた。
が、ソース追いかけるうちに眠くなり・・・・💤
途中経過(2) ... 普通にLaravel突っ込むよ!
public/index.php を参考にして、config.php のreturn前に下記のコードを入れてみた。
require($_SERVER['DOCUMENT_ROOT'].'/../bootstrap/autoload.php');
require($_SERVER['DOCUMENT_ROOT'].'/../bootstrap/app.php');
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$kernel
をダンプしてみたらうまい事できてるみたいだったので、なんとかmiddlewareを通してセッション認証終わらせようとしてみたものの・・・うまくいかず。
結局この時点では
require($_SERVER['DOCUMENT_ROOT'].'/../bootstrap/autoload.php');
require($_SERVER['DOCUMENT_ROOT'].'/../bootstrap/app.php');
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$controller = app('\App\Http\Controllers\Controller');
$controller->middleware(['auth:admin']);
みたいな超無理矢理コントローラー使うみたいなやり方してみた。
これはこれでうまくいったんだけども、不格好極まりない。
途中経過(3) ... もうちょっとスマートに
で、この辺でgoogleさんの出番。だれかもうちょっとうまくやってねぇかんなぁ・・・なんてググってみてると、
Laravel5.4でCKEditorとKCFinderを使ってユーザーごとにコンテンツの画像管理をする
こんな記事を見つけた。
あぁ、まさにこれなんだけど、このやり方じゃァ他のユーザーのディレクトリが見えちゃうんだよね。
なので、middleware通すやり方だけ参考にさせてもらいました。
最終形
こうなりました。
<?php
require($_SERVER['DOCUMENT_ROOT'].'/../bootstrap/autoload.php');
require($_SERVER['DOCUMENT_ROOT'].'/../bootstrap/app.php');
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class)
->pushMiddleware(\App\Http\Middleware\EncryptCookies::class)
->pushMiddleware(\Illuminate\Session\Middleware\StartSession::class)
->handle(Illuminate\Http\Request::capture());
$id = auth()->guard('admin')->user()->id;
$uploadDir = '../../../../uploads/' . $id;
$fullPath = dirname(__FILE__) . '/' . $uploadDir;
if (!file_exists($fullPath)) {
mkdir($fullPath, 0777, true);
}
$fullPath = realPath($fullPath);
return array(
'disabled' => false,
'uploadURL' => $uploadDir,
'uploadDir' => $fullPath,
'theme' => "default",
//(以下略)
もっと最適化されたやり方があるのか、もしくはほんとにここに書いていいのか?っていう話はまだ検証してません。
何かの参考になれば。