Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Вот пользователь редактирует какой-то свой объект. Заполняет форму и отправляет.
А я пишу валидатор для реквеста на основе FormRequest и прямо так указываю в экшене:
public function editSomeObject(SomeEditRequest $request, int $id)
{
}
В нём проверяется сама структура данных: все ли нужные поля заполнены, в требуемом ли формате.
Но, кроме того, ещё нужно проверить, существует ли вообще объект с таким ID, имеет ли авторизованный пользователь право что-то с ним делать, позволяет ли его статус менять указанные поля.
Где это лучше проверять? Как-то пытаться добавить в SomeEditRequest? Или оставить ему только чистую незамутнённую логику по простой проверки набора полей, а всё остальное уже проверять в контроллере/сервисе?
Изменено larakettle (26.11.2017 21:22:43)
Не в сети
Где это лучше проверять? Как-то пытаться добавить в SomeEditRequest?
Вроде бы в Request есть функция authorize() которая хорошее место что бы проверить то о чем говорите.
Кроме того проверить имеет ли вообще юзер доступ к данной форме можно проверить и в middleware. Тем более что им можно закрывать не один request скажем именно отправки данной формы, а удобно закрывать и несколько роутов или методов контроллера.
Поточнее когда лучше проверять права в Request а когда в Middleware адресую вопросы более опытным участникам форума!
Не в сети
существует ли вообще объект с таким ID
Правило валидации exists.
имеет ли авторизованный пользователь право что-то с ним делать
Как выше сказали, можно в authorize, можно использовать политики. Я использую политики, тогда вся логика авторизации находится ва одном месте.
Не в сети
Алексей, а middleware закрыть скажем все форму к которой в некоторой ситуации нет доступа не верно? Ну скажем и показ формы и отправку закрыть прямо в конструкторе контроллера вызвав middleware ? Скажем если у юзера только одна подписка может быть, а она уже есть. То закрыть например даже админу форму добавки подписки для юзера с этим ID с помощью middleware ?
Не в сети
А если я хочу закрыть одну форму? Но ведь если закрывать в реквестах то мне вместо одного тогда придется создавать 2 request'а, в show form и save form. Это же не красиво..
Не в сети
Но ведь если закрывать в реквестах то мне вместо одного тогда придется создавать 2 request'а, в show form и save form. Это же не красиво..
Не в сети
htclog81, AlexeyMezenin, спасибо за ответы!
Но, например, я не могу всю форму закрыть.
Пользователь может заполнить форму на странице "/items/edit/25".
Но не может на странице "/items/edit/26", потому что 26 это не его объект.
То есть, надо загрузить объект с ID 25 и проверить, что его, скажем, `user_id` ссылается на текущего пользователя.
Но как в authorized() по правильному получить ID объекта?
Использовать текщуий роут как-то не совсем правильно.
Ведь, это класс, который проверяет какой-то абстрактный запрос, а мы его связываем с текущим роутом.
Не в сети
AlexeyMezenin, ясно, спасибо.
Для юнит-тестов, правда, придётся ещё и кастомный роутер как-то прокидывать, но это, кажется, тоже решаемо.
Не в сети
Ведь, это класс, который проверяет какой-то абстрактный запрос, а мы его связываем с текущим роутом.
Насчет authorize в request я понял что это не какой то абстрактный запрос, а самый что не на есть текущий. Именно запрос который по текущуму роуту идет и который принимаем в методе контроллера. Алексей поправь если не прав?
Не в сети
А я вообще сделал по простому
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)
Не в сети
Страницы 1