Система личных сообщений Symfony - PullRequest
0 голосов
/ 21 сентября 2018

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

У меня есть рекламные объявления, пользователи и, наконец, сообщение

У меня есть такие отношения:

user => message: OneToMany Реклама => message OneToMany

, поэтому мой вопрос, как ограничить маршрут только для 2 человек и как отображатьих сообщения?

я должен изменить свои отношения?Как я могу справиться с этим в моем контроллере?

Я делюсь своим кодом с небольшим контроллером:

/**
     * @Route("/messages/{id}", name="messages")
     * @param int $id
     * @return Response
     * @throws \Exception
     */
    public function messagesShow(int $id): Response {

        $user = $this->getUser();
        $advertisement = $this->getDoctrine()->getRepository(Advertisement::class)->findByMessages($id);

        $messages = $this->getDoctrine()->getRepository(Message::class)->findByMessages($user, $advertisement);

        return $this->render('advertisement/messages.html.twig', [
            'test' => $messages,
            'advertisement' => $advertisement
        ]);
    }

и хранилищем:

/**
 * @param int $id
 * @return Advertisement|null
 * @throws \Exception
 */
public function findByMessages(int $id): ?Advertisement {

    $query = $this->createQueryBuilder('a')
    ->select('a')
    ->from('App:Advertisement', 'r')
    ->where('a.id = :id')
    ->leftJoin('a.message', 'm')
    ->setParameter(':id', $id)
    ->getQuery()
    ;

    try {
        return $query->getOneOrNullResult();
    }
    catch (\Exception $e) {
        throw new \Exception('Problème' . $e->getMessage() . $e->getLine());
    }
}


/**
     * @param User $user
     * @param Advertisement $advertisement
     * @return Message|null
     * @throws \Exception
     */
    public function findByMessages(User $user, Advertisement $advertisement) {

    // SELECT * FROM `message` WHERE advertisement_id = 5 AND user_id = 1
        $query = $this->createQueryBuilder('m')
        ->select('m')
        ->from('App\Entity\Message', 'n')
        ->join('m.advertisement', 'a')
        ->where('m.advertisement = :advertisement')
        ->andWhere('m.user = :user')
        ->setParameter(':user', $user)
        ->setParameter(':advertisement', $advertisement)
        ->getQuery()
        ;

        try {
            return $query->getResult();
        }
        catch (\Exception $e) {
            throw new \Exception('Problème' . $e->getMessage() . $e->getLine());
        }
    }

Спасибо за вашу помощь!: D

1 Ответ

0 голосов
/ 21 сентября 2018

Создайте таблицу Conversation, которая имеет отношение к таблице ConversationUsers, отслеживая, каким пользователям разрешено участвовать в беседе.Объект Conversation также должен отслеживать Message объектов, принадлежащих этому Conversation.Тогда вы можете просто загрузить Conversation в свой код и на 100% быть уверены, что он будет виден только пользователям, участвующим в нем.Visual (Pardon x-mind as i dont have access to proper tools on current machine...)

...