Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 29.12.2017 20:02:49

htclog81
Откуда: Москва
Сообщений: 192
Сайт

Применение middlewate или метода authorize в request классе

В каком случае лучше применять 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 то он нам не подходит решили... Не хотим осложнять вставку и хранить лишнее.

Не в сети

Подвал раздела