Разрешить отношения laravel, только если условие выполнено

Я отредактировал вопрос, так как моя первая попытка ввела в заблуждение. Простите за это.

Я создаю API с laravel и имею следующие модели/таблицы:

user
---
id
name

customers
---
id
name
user_id

projects
---
id
name
user_id
customer_id (can be NULL)

Проект всегда принадлежит пользователю и, при желании, также может принадлежать заказчику. Клиент всегда принадлежит пользователю. Например:

users = [
    {id: 1, name: "user1"},
    {id: 2, name: "user2"}
]

customers = [
    {id: 1, name: "c1", user_id: 1},
    {id: 2, name: "c2", user_id: 1},
    {id: 3, name: "c3", user_id: 2}
]

projects = [
    {id: 1, name: "p1", user_id: 1},
    {id: 2, name: "p2", user_id: 1, customer_id: 1},
    {id: 3, name: "p3", user_id: 2, customer_id: 2}
]

Как предотвратить создание неверных данных в БД путем создания или обновления проекта с идентификатором customer_id, который действительно принадлежит клиенту другого пользователя, а не user_id проекта. Например:

newProject = {id: 4, имя: "p4", user_id: 1, customer_id: 3}

Как видите, новый проект должен принадлежать пользователю 1 и заказчику 3, что невозможно.

Ставим в контроллере галочку вот так: Auth::id() == $customer->user_id

dparoli 20.02.2019 10:13

Это именно то, что я делаю прямо сейчас, но я ищу лучший, более гибкий способ сделать это, потому что мне пришлось бы реализовать его во всех местах, где пользователь может изменить клиента (например, вложенные отношения)

bernhardh 20.02.2019 10:17

Вам нужна система авторизации: laravel.com/docs/5.7/авторизация

dparoli 20.02.2019 10:21

Это действительно общий ответ. Конечно, мне нужна система авторизации.

bernhardh 20.02.2019 10:27

Извините, но общий вопрос => общий ответ. Вы можете начать писать код, и, если у вас есть конкретная проблема, вы можете задать ее здесь.

dparoli 20.02.2019 10:30

Проверьте наличие laravel политика. Это поможет вам перейти на детальный уровень с разрешениями

Mihir Bhende 20.02.2019 10:37

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

bernhardh 20.02.2019 11:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
7
278
4

Ответы 4

Вы можете сделать это следующим образом.

 class User extends Eloquent {

        public function scopePopular($query)
        {
            return $query->where('votes', '>', 100);
        }

    }

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

Подробнее Области запроса

Надеюсь, это будет полезно для вас :)

Мой совет: не размещайте логику авторизации внутри модели, используйте для этого контроллер.

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

Вам действительно нужно прочитать главу об авторизации в файле официальные документы laravel.

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

Извините за вводящий в заблуждение вопрос. Моя проблема не проблема авторизации. Пожалуйста, взгляните на обновленный вопрос.

bernhardh 20.02.2019 11:31

Самым элегантным решением было бы использовать систему проверки запросов Laravel, потому что на самом деле это была ваша проблема: сложное ограничение проверки для входящего запроса.

Для этого:

  • Создайте правило, для этого есть генератор. Внутри определите свою конкретную логику правил. Вот документ: https://laravel.com/docs/5.7/validation#custom-validation-rules
  • Создайте форму запроса. для этого тоже есть генератор, и примените в нем свое правило. Вот документ: https://laravel.com/docs/5.7/validation#form-request-validation
  • Вставьте этот запрос в действие вашего контроллера. Если проверка не пройдена, код в вашем контроллере даже не будет выполнен, и фреймворк вернет код ошибки HTTP 422.

Это способ Laravel сделать это.

Извините за вводящий в заблуждение вопрос. Моя проблема не проблема авторизации. Пожалуйста, взгляните на обновленный вопрос.

bernhardh 20.02.2019 11:31

Хорошо, извините за плохой ответ. Ваша проблема связана с ограничением проверки, поскольку вы хотите создать проект только в том случае, если данные, полученные API + user_id, соответствуют определенному ограничению. Я бы порекомендовал вам проверить пользовательские правила проверки и форму (кроме имени, она работает с API) Запросить правила проверки,

elfif 20.02.2019 11:57

Нет, это была моя вина, так как вопрос изначально вводил в заблуждение. Я думаю, что вы правы, и проверка - это путь к получению.

bernhardh 20.02.2019 12:45

Хорошо, я отредактирую свой ответ, если кто-то еще зайдет на страницу, пока не ясно, где правильный ответ....

elfif 20.02.2019 16:30

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

public function update(User $user, Customer $customer)
{
    return $customer->user_id === $user->id;
}

и

public function create(User $user, Customer $customer)
{
    return $customer->user_id === $user->id;
}

Это заставит его работать с методами create и update.

The important part to note here is:

return $customer->user_id === $user->id;

Это гарантирует, что для данных customer и useruser_id на покупателе соответствует id на user, что вам и нужно.

Чтобы заставить его работать с моделью Projects, вам нужно будет сделать это в поставщике услуг аутентификации:

class AuthServiceProvider extends ServiceProvider
{

protected $policies = [
    Project::class => ProjectPolicy::class,
];

Где ProjectPolicy — это имя политики, которую вы устанавливаете при выполнении php artisan make:policy (как объяснено в связанных документах).

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