У меня есть видеозалы (через Twig), которые создаются на моей странице, когда пользователи хотят начать видеочат между собой. Когда они покидают комнату, она удаляется через некоторое время, поэтому, когда я пытаюсь получить к ней доступ, выдает ошибку ({room_id} не существует}. Ниже представлена функция:
/**
* @Route("/video/join/{room_name}", name = "videochat_join")
*
* @param $room_name
*
* @return RedirectResponse|Response
*
* @throws \Twilio\Exceptions\ConfigurationException
* @throws \Twilio\Exceptions\TwilioException
*/
public function joinVideo($room_name)
{
$user = $this->getCurrentUser();
$twilio = new Client(getenv('TWILIO_API_KEY'), getenv('TWILIO_API_SECRET'));
$room = $twilio->video->v1->rooms($room_name)->fetch();
$roomSid = $room->sid;
$token = new AccessToken(getenv('TWILIO_ACCOUNT_SID'), getenv('TWILIO_API_KEY'), getenv('TWILIO_API_SECRET'), 3600, $user->getEmail());
$videoGrant = new VideoGrant();
$videoGrant->setRoom($room_name);
$token->addGrant($videoGrant);
return $this->render('chat/video_join.html.twig', [
'roomSid' => $roomSid,
'roomName' => $room_name,
'accessToken' => $token->toJWT(),
]);
};
Как я могу поймать, если комната больше не доступна, и перенаправить пользователя на 404_room.html.twig? Потому что он не перенаправляет на шаблон 404 по умолчанию.
Ошибка:
RestException
Twilio\Exceptions\RestException:
[HTTP 404] Unable to fetch record: The requested resource /Rooms/1_2room808823 was not found
at vendor/twilio/sdk/Twilio/Version.php:85
at Twilio\Version->exception(object(Response), 'Unable to fetch record')
(vendor/twilio/sdk/Twilio/Version.php:109)
at Twilio\Version->fetch('GET', '/Rooms/1_2room808823', array())
(vendor/twilio/sdk/Twilio/Rest/Video/V1/RoomContext.php:58)
at Twilio\Rest\Video\V1\RoomContext->fetch()
(src/Controller/Chat/VideoController.php:93)
at App\Controller\Chat\VideoController->joinVideo('1_2room808823')
(vendor/symfony/http-kernel/HttpKernel.php:149)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/http-kernel/HttpKernel.php:66)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/http-kernel/Kernel.php:188)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(public/index.php:37)
Я пробовал делать:
try{
($twilio->video->v1->rooms($room_name)->fetch());
echo "Room exists"; //this one is working fine
} catch ( TwilioException $e ) {
echo 'Caught exception: ', $e->getMessage(), "\n"; //this doesn't
}
... без везения
Возможный дубликат Symfony - перенаправление 404 на настраиваемый шаблон только с одного URL
@FelippeDuarte нет, он автоматически удаляется с сайта Twig через 5 минут бездействия.
Какое полное имя класса для генерируемого исключения?
Итак, проверьте, пусто ли оно. Если пусто, перенаправьте на 404, в противном случае продолжайте нормально.
Я отредактирую пост
Похоже, вы были действительно близки. Единственное, чего вам не хватало, - это необходимость бросить NotFoundHttpException для вызова ответа 404.






Добавьте следующие операторы use в начало вашего класса Controller.
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Twilio\Exceptions\RestException;
Затем оберните свой код в блок try / catch. Если вы поймаете ожидаемый RestException, вы можете бросить NotFoundHttpException, чтобы принудительно ответить 404. Например:
/**
* @Route("/video/join/{room_name}", name = "videochat_join")
*
* @param $room_name
*
* @return RedirectResponse|Response
*
* @throws \Twilio\Exceptions\ConfigurationException
* @throws \Twilio\Exceptions\TwilioException
*/
public function joinVideo($room_name)
{
try {
$user = $this->getCurrentUser();
$twilio = new Client(getenv('TWILIO_API_KEY'), getenv('TWILIO_API_SECRET'));
$room = $twilio->video->v1->rooms($room_name)->fetch();
$roomSid = $room->sid;
$token = new AccessToken(getenv('TWILIO_ACCOUNT_SID'), getenv('TWILIO_API_KEY'), getenv('TWILIO_API_SECRET'), 3600, $user->getEmail());
$videoGrant = new VideoGrant();
$videoGrant->setRoom($room_name);
$token->addGrant($videoGrant);
return $this->render('chat/video_join.html.twig', [
'roomSid' => $roomSid,
'roomName' => $room_name,
'accessToken' => $token->toJWT(),
]);
}
catch (RestException $exception) {
throw new NotFoundHttpException("'{$room_name}' could not be found");
}
}
Фубар, ты спасатель, большое спасибо. Однако точка с запятой в конце не обязательна.
Что будет в
$room, если он удален? Я бы начал отсюда.