Задать вопрос
@accountnujen

Как выходить из ситуации, когда 2 действия возвращают один результат?

Требование api одного сервиса, чтобы я мог отобразить json своей страницы с таким видом:
website.com/json?url=website.com/data/hash
где website.com/data/hash - ссылку, которую нужно отобразить в виде json.
Я беру GET запрос и достаю нужную часть из сслки (path):
$url = parse_url($_GET['url'])['path']
Я точно знаю, что path - /data/hash - содержит 2 слеша.
И чтобы достать хеш, я могу воспользоваться explode
$path = explode("/", $url);.

Валидный URL будет иметь массив из трёх значений^
0 - пустой
1 - data
2 - hash

Я не хочу лишний раз долбать базу, если пользователь сделал кривой запрос, к примеру:
website.com/json?url=website.com/data/hash/
website.com/json?url=website.com/data/hash///
website.com/json?url=website.com/data/hash/index.php

Поэтому я делаю такую конструкцию:
if (count($path) === 3) {
	# запрос в БД и обработка
} else {
	http_response_code(404);
	die();
}


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

if (count($path) === 3) {
	# запрос в БД и обработка
	if ($result === true) { // если запись найдена
		#выводим результат
	} else {
		http_response_code(404);
		die();
	}
} else {
	http_response_code(404);
	die();
}


Меня напрягает двойное написание http_response_code(404); die();. Можно ли как-то избежать этого? Или это жертва за то, что я не хочу пускать к базе пользователей с неверным url?
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
Immortal_pony
@Immortal_pony Куратор тега PHP
В первом случае должен быть код 400, а не 404.
Ну и код будет красивее (на мой взгляд) выглядеть, если эту проверку вынести в начало, избавившись от else-спагеттин c помощью концепта "early return":

// Валидируем 
if (count($path) !== 3) {
    http_response_code(400); //  вот тут 400, потому что это корявый запрос, мы даже ничего и не искали
    die();    
}

// Получаем данные 
$result  = getGesult();

// Валидируем данные 
if ($result !== true) { 
    http_response_code(404);
    die();    
}

// Дальше код, который выведет данные
Ответ написан
Комментировать
Newto
@Newto
Просто проверяйте формат входящего URLa, перед проверкой удаляйте лишние слеши. И если он валиден, то делайте с ним дальше что хотите, тогда не придется писать две ошибки вместо одной.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽