Symfony 私人消息系统
Symfony private messaging system
我来找你是因为我需要帮助,现在我创建了一个广告网站,我想要的是创建一个私人消息系统,也就是说,有 2 个用户可以说这个,如果例如第 3 个找到 url 来吧 url 他不能写消息或其他人
所有这一切,无需通过第三方捆绑包,我想自己做所有事情
我有一个实体广告,用户,最后是消息
我有这样的关系:
用户 => 消息:OneToMany
广告 => 消息 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
创建一个与 ConversationUsers
table 相关的 Conversation
table,跟踪允许哪些用户参与对话。 Conversation
对象还应跟踪属于该 Conversation
的 Message
个对象。然后你可以简单地在你的代码中加载 Conversation
并且可以 100% 确保它只对参与其中的用户可见。
我来找你是因为我需要帮助,现在我创建了一个广告网站,我想要的是创建一个私人消息系统,也就是说,有 2 个用户可以说这个,如果例如第 3 个找到 url 来吧 url 他不能写消息或其他人 所有这一切,无需通过第三方捆绑包,我想自己做所有事情
我有一个实体广告,用户,最后是消息
我有这样的关系:
用户 => 消息:OneToMany 广告 => 消息 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
创建一个与 ConversationUsers
table 相关的 Conversation
table,跟踪允许哪些用户参与对话。 Conversation
对象还应跟踪属于该 Conversation
的 Message
个对象。然后你可以简单地在你的代码中加载 Conversation
并且可以 100% 确保它只对参与其中的用户可见。