Laravel по-русски

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

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

#1 26.11.2017 21:21:52

Что валидировать в реквесте?

Здравствуйте.

Вот пользователь редактирует какой-то свой объект. Заполняет форму и отправляет.

А я пишу валидатор для реквеста на основе FormRequest и прямо так указываю в экшене:

public function editSomeObject(SomeEditRequest $request, int $id)
{
}

В нём проверяется сама структура данных: все ли нужные поля заполнены, в требуемом ли формате.

Но, кроме того, ещё нужно проверить, существует ли вообще объект с таким ID, имеет ли авторизованный пользователь право что-то с ним делать, позволяет ли его статус менять указанные поля.

Где это лучше проверять? Как-то пытаться добавить в SomeEditRequest? Или оставить ему только чистую незамутнённую логику по простой проверки набора полей, а всё остальное уже проверять в контроллере/сервисе?

Изменено larakettle (26.11.2017 21:22:43)

Не в сети

#2 01.12.2017 11:24:40

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

Re: Что валидировать в реквесте?

Где это лучше проверять? Как-то пытаться добавить в SomeEditRequest?


Вроде бы в Request есть функция authorize() которая хорошее место что бы проверить то о чем говорите.

Кроме того проверить имеет ли вообще юзер доступ к данной форме можно проверить и в middleware. Тем более что им можно закрывать не один request скажем именно отправки данной формы, а удобно закрывать и несколько роутов или методов контроллера.

Поточнее когда лучше проверять права в Request а когда в Middleware адресую вопросы более опытным участникам форума!

Не в сети

#3 01.12.2017 11:33:03

Re: Что валидировать в реквесте?

существует ли вообще объект с таким ID

Правило валидации exists.

имеет ли авторизованный пользователь право что-то с ним делать

Как выше сказали, можно в authorize, можно использовать политики. Я использую политики, тогда вся логика авторизации находится ва одном месте.

Не в сети

#4 01.12.2017 11:39:44

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

Re: Что валидировать в реквесте?

Алексей, а middleware закрыть скажем все форму к которой в некоторой ситуации нет доступа не верно? Ну скажем и показ формы и отправку закрыть прямо в конструкторе контроллера вызвав middleware ? Скажем если у юзера только одна подписка может быть, а она уже есть. То закрыть например даже админу форму добавки подписки для юзера с этим ID с помощью middleware ?

Не в сети

#5 01.12.2017 11:50:48

Re: Что валидировать в реквесте?

Посредника лучше использовать глобально. Чтобы закрыть пользователю доступ в админку, в платную часть сайта и т.д.

Не в сети

#6 01.12.2017 11:55:09

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

Re: Что валидировать в реквесте?

А если я хочу закрыть одну форму? Но ведь если закрывать в реквестах то мне вместо одного тогда придется создавать 2 request'а, в show form и save form. Это же не красиво..

Не в сети

#7 01.12.2017 11:58:20

Re: Что валидировать в реквесте?

Но ведь если закрывать в реквестах то мне вместо одного тогда придется создавать 2 request'а, в show form и save form. Это же не красиво..

Политики

Не в сети

#8 01.12.2017 12:19:49

Re: Что валидировать в реквесте?

htclog81, AlexeyMezenin, спасибо за ответы!

Но, например, я не могу всю форму закрыть.
Пользователь может заполнить форму на странице "/items/edit/25".
Но не может на странице "/items/edit/26", потому что 26 это не его объект.

То есть, надо загрузить объект с ID 25 и проверить, что его, скажем, `user_id` ссылается на текущего пользователя.
Но как в authorized() по правильному получить ID объекта?

Использовать текщуий роут как-то не совсем правильно.
Ведь, это класс, который проверяет какой-то абстрактный запрос, а мы его связываем с текущим роутом.

Не в сети

#9 01.12.2017 12:29:45

Re: Что валидировать в реквесте?

  1. Но как в authorized() по правильному получить ID объекта?Использовать текщуий роут как-то не совсем правильно.

В документации приведен именно такой пример:

PHP
Comment::find($this->route('comment'));

Сам использую политики.

Не в сети

#10 01.12.2017 15:18:22

Re: Что валидировать в реквесте?

AlexeyMezenin, ясно, спасибо.
Для юнит-тестов, правда, придётся ещё и кастомный роутер как-то прокидывать, но это, кажется, тоже решаемо.

Не в сети

#11 01.12.2017 15:33:35

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

Re: Что валидировать в реквесте?

Ведь, это класс, который проверяет какой-то абстрактный запрос, а мы его связываем с текущим роутом.

Насчет authorize в request я понял что это не какой то абстрактный запрос, а самый что не на есть текущий. Именно запрос который по текущуму роуту идет и который принимаем в методе контроллера. Алексей поправь если не прав?

Не в сети

#12 01.12.2017 15:35:34

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

Re: Что валидировать в реквесте?

А я вообще сделал по простому

class AddSubscriptionController extends Controller {

	public function __construct() {
		$this->middleware('adminUserIsNotSubscriebed');
	}
namespace App\Http\Middleware\Admin;

use Closure;
use Illuminate\Support\Facades\Config;
use App\Classes\Models\User;
class UserIsNotSubscriebed
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
		$user = User::find($request->user_id);
        
		if ($user->subscribed()) {
            return redirect()->route('admin.subscription', $request->user_id);
        }

        return $next($request);
    }
}

Если юзер с данными ID имеет подписку то из данной формы посылаем и все.

Но да может с политиками как то и лучше

Изменено htclog81 (01.12.2017 15:35:47)

Не в сети

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