Почему ответ, полученный с помощью fetch, не отображается в виде DOM?

Я новички в Symfony и столкнулся с определенной проблемой. Я использую curl для обращения к внешнему API и получения данных. В Chrome я вижу результат запроса в разделе "Сеть", где отображается таблица с данными. Однако я хотел бы, чтобы страница, с которой выполняется запрос, обновлялась при нажатии кнопки "Искать". Как мне это реализовать?
  • 29 октября 2024 г. 21:12
Ответы на вопрос 2
Чтобы обновить DOM на странице с помощью данных, полученных через `fetch`, вам нужно выполнить несколько шагов. Давайте разберем, как это можно сделать, используя JavaScript для выполнения запроса и обновления содержимого HTML.

1. **Создайте HTML-кнопку для выполнения запроса:**

```html
<button id="search-button">Искать</button>
<div id="results"></div>
```

2. **Добавьте JavaScript для обработки нажатия кнопки и выполнения `fetch`-запроса:**

```html
<script>
document.getElementById('search-button').addEventListener('click', function() {
    fetch('/api/your-endpoint')  // Замените на ваш API endpoint
        .then(response => {
            if (!response.ok) {
                throw new Error('Сеть ответила с ошибкой: ' + response.statusText);
            }
            return response.json();  // Предполагая, что возвращается JSON
        })
        .then(data => {
            // Очистить предыдущие результаты
            const resultsDiv = document.getElementById('results');
            resultsDiv.innerHTML = '';

            // Обработать и отобразить новые данные
            data.forEach(item => {
                const div = document.createElement('div');
                div.textContent = item.property;  // Замените "property" на нужное вам свойство
                resultsDiv.appendChild(div);
            });
        })
        .catch(error => {
            console.error('Ошибка:', error);
        });
});
</script>
```

3. **Обработка данных на стороне Symfony:**

Убедитесь, что вы правильно настроили обработчик на стороне Symfony, который отвечает на запрос API и возвращает данные в формате JSON. Пример контроллера может выглядеть так:

```php
// src/Controller/YourController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;

class YourController extends AbstractController
{
    /**
     * @Route("/api/your-endpoint", name="api_endpoint")
     */
    public function yourApiMethod()
    {
        // Здесь вы делаете запрос к внешнему API, например с помощью cURL
        // и получаете данные в массиве $data

        // Пример данных
        $data = [
            ['property' => 'Значение 1'],
            ['property' => 'Значение 2'],
            ['property' => 'Значение 3'],
        ];

        return new JsonResponse($data);
    }
}
```

### Примечания
- Убедитесь, что ваш сервер правильно обрабатывает CORS, если вы делаете запросы с другого домена.
- Проверьте, что ваши данные возвращаются в правильном формате (обычно JSON).
- Если API возвращает другой тип данных, не забудьте изменить метод `response.json()` на соответствующий.

С помощью вышеуказанных шагов и кода у вас будет кнопка, которая при нажатии будет вызывать запрос к API, и результат будет отображаться в элементе `div` на странице.
Если вам нужно динамическое обновление частей страницы, и вы не можете это сделать сами, то вам не стоит изобретать велосипед, а воспользоваться готовыми библиотеками для этого. 

1. Вы можете вообще взять под контроль весь рендеринг DOM при помощи React, Vue и т.д. Но это вам надо будет серьёзно погрузиться в изучение этих фреймворков, и в классическом варианте вы потеряете поисковую оптимизацию.

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

- Для Symfony есть прекраснейший компонент Live Components . Вы пишете всё в Twig, вставляя там особые атрибуты, и компонент возьмёт на себя всю работу по замене частей страницы нужными компонентами.

- Либо, если вам не понравится почему-то Live Components, можете воспользоваться Htmx

В результате вам даже не нужно будет особо знать JavaScript, всё будет автоматом работать

P.S. Если вы уже пользуетесь фреймворком, то пользуйтесь его плюшками, сильно упрощающими жизнь. Я имею ввиду, что не стоит использовать голый curl с простынёй настроек, когда в наличии имеется превосходный HTTP Client https://symfony.com/doc/current/http_client.html
А для сериализации/десериализации из JSON в PHP и обратно, лучше всего использовать Serializer component https://symfony.com/doc/current/components/seriali...
Похожие вопросы