Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
В каком случае лучше применять middlewate или метод authorize в request классе?
Мой кейс сейчас таков. Пишу скрипт файлового хостинга с Dropbox подобным функционалом. Нужно в различных случаях проверять права на папки по пути к ним.
К пример http://site.com/files/test/test2/test3/test4 верен ли путь до папки test4? Совпадает ли со структурой в БД? Принадлежит ли все это авторизованному юзеру? Но также нужно проверять другие роуту, по одному из них папка добавляется, по другому перемещается или удаляется. Иногда нужно проверить один путь, а в других случаях скажем перемещения папки проверить нужно два пути, исходный и конечный.
Для всего этого я создал в классе User метод который проходит циклом по пути и делает запросы нужные. На выходе получается найденный объект Folder который нужен в дальнейшем или false если путь не верный или юзеру не принадлежит. Можно конечно в сервис это запихнуть..
Но суть в том где этот метод вызывать в middleware или в request'ах в методе authorize.
Привежу код который работает в middleware и дальнейшее использование в контроллере
public function handle($request, Closure $next)
{
if (!$request->user()->buildCurrentFolderPath($request->route('path_parts'))) {
return redirect()->route('files')->with('status', 'wrong link');
}
return $next($request);
}
public function show(Request $request, $path_parts = null)
{
$user = $request->user();
$folders = $user->current_folder->getChildFolders();
return view('files.files', [
'folders' => $folders,
'path_parts' => $path_parts,
'user' => $user,
]);
}
И на всякий модель
public function buildCurrentFolderPath($path = null)
{
$pathArr = explode('/', $path);
$currentFolderPath = [];
$currentFolder = $this->rootFolder;
$currentFolderPath[] = $currentFolder;
foreach ($pathArr as $path_part) {
if (!$path_part) continue;
$currentFolder = $this->folders()
->where("name", $path_part)
-> where('parent_id', '=', $currentFolder->id)
->first();
if (!$currentFolder) {
return false;
}
$currentFolderPath[] = $currentFolder;
$currentFolder->path = $currentFolderPath;
}
$this->current_folder = $currentFolder;
return true;
}
Тут еще в данном методе данные для хлебных крошек собираются, тк при просмотре папки они нужны и что бы два раза в БД не лазить. Но это я постараюсь в другой метод вынести.
Вопрос скорее где правильнее такой метод вызывать?
Насчет использования паттерна nested tree то он нам не подходит решили... Не хотим осложнять вставку и хранить лишнее.
Не в сети