Как добавить пользовательское правило проверки в Laravel?

Я хотел бы добавить пользовательские правила проверки в свой контроллер Laravel:

  • Контейнер существует в базе данных
  • Зарегистрированный пользователь является владельцем ресурса

Итак, я написал это:

public function update($id, Request $request) {
    $validator = Validator::make($request->all(), [
        'name' => 'required|unique:stock.containers|max:255'
    ]);

    $container = Container::find($id);

    if (!$container)
    {
        $validator->errors()->add('id', 'Not a valid resource');
    }

    if ($container->owner_id != user_id())
    {
        $validator->errors()->add('owner_id', 'Not owner of this resource');
    }

    if ($validator->fails()) {
        return response()->json($validator->errors(), 422);  //i'm not getting any
    }
}

К сожалению, $validator->errors() или даже $validator->addMessageBag() не работает. Я заметил, что $validator->fails() очищает сообщения об ошибках, и добавление ошибки не приведет к сбою проверки.

Каков правильный способ добиться этого?

Этот - правильный путь.
nakov 06.06.2019 14:34

Ну а как тогда применять это правило. Правило не знает id ресурса, и правило не применяется ни к одному значению в request...

nowox 06.06.2019 14:35

Я считаю, что вы используете неправильный подход. Потому что вы можете использовать существует в валидаторе, чтобы убедиться, что ресурс существует, но тогда вам нужно использовать политика, который авторизует пользователя для использования ресурса.

nakov 06.06.2019 14:40

@nakov, Да, я могу использовать существующие, но у меня нет $id моего ресурса, поэтому я не могу проверить, существует ли он :(

nowox 06.06.2019 14:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
1 629
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тогда вы можете использовать after:

public function update($id, Request $request) {
    $validator = Validator::make($request->all(), [
        'name' => 'required|unique:stock.containers|max:255'
    ]);

    $validator->after(function($validator) use($id) {
        $container = Container::find($id);

        if (!$container)
        {
            $validator->errors()->add('id', 'Not a valid resource');
        }

        if ($container->owner_id != user_id())
        {
            $validator->errors()->add('owner_id', 'Not owner of this resource');
        }
    });

    if ($validator->fails()) {
        return response()->json($validator->errors(), 422);  //i'm not getting any
    }
}

Другие вопросы по теме