Невозможно передать данные в файл ветки с контроллера в symfony

Я пытаюсь передать данные из контроллера для просмотра, но когда я передал данные, я получаю следующую ошибку

Variable "products" does not exist.

Пожалуйста, найдите мой код контроллера ниже

<?php

namespace App\Controller;

USE App\Entity\Product;
use App\Repository\ProductRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ProductController extends AbstractController
{
    //#[Route('/product', name: 'app_product')]
    public function index(): Response
    {
        return $this->render('product/index.html.twig', [
            'controller_name' => 'ProductController',
        ]);
    }

    public function show(EntityManagerInterface $entityManager): Response
    {
        $products = $entityManager->getRepository(Product::class)->findAll();

        if (!$products) {
            throw $this->createNotFoundException(
                'No product found for id '.$id
            );
        }

        else{
           return $this->render('product/index.html.twig', ['product' => $products]);
        }

        

    }
}

Пожалуйста, найдите мой код шаблона ветки ниже

<form action = "{{ path('home') }}">
                                <fieldset>
                                    <label class = "all-label">Product</label>
                                    <div class = "input-group mb-3 select-down">
                                        <select class = "form-select form-control" aria-label = "Default select example" name = "product">
                                           
                                                {% for product in products %}
                                                    <option value = "{{ product.id }}">{{ product.name }}</option>
                                                {% endfor %}
                                           
                                        </select>
                                    </div>
                                </fieldset>
</form>

Коды в файле route.yaml

controllers:
    resource:
        path: ../src/Controller/
        namespace: App\Controller
    type: attribute
home:
  path: /
  controller: App\Controller\HomeController::index
create:
  path: /create
  controller: App\Controller\MainController::create
test:
  path: /xavier
  controller: App\Controller\HomeController::index
product:
  path: /product
  controller: App\Controller\ProductController::index

Почему я получаю эту ошибку, когда я пытался получить значение $ product, я также получаю данные. Почему он показывает ошибку Variable "products" does not exist

Пытаюсь загрузить страницу

  http://127.0.0.1:8000/product 

пожалуйста, поделитесь конфигурацией маршрута, чтобы увидеть, какой маршрут вы вызываете и какой контроллер используется для рендеринга ваших шаблонов. затем вы должны назвать и показать оба файла ветки. кажется, есть product/index.html.twig и index.html.twig. и в вашем контроллере есть запах кода. просто верните продукты из репозитория. и используйте twig, чтобы реагировать, если переменная products пуста.

rickroyce 24.05.2023 08:50

@rickroyce Я отредактировал файл и получил ту же ошибку

Xavier Issac 24.05.2023 09:02

@ Робби оба одинаковы, в чем разница между ними. Я также добавил URL-адрес, который пытаюсь загрузить в вопросе

Xavier Issac 24.05.2023 09:16

@XavierIssac Чем они похожи? Вы явно опечатались: ['product' => $products] VS ['products' => $products]

DarkBee 24.05.2023 09:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ваш ответ:

  • вы звоните по этому маршруту /product

  • ваша конфигурация здесь говорит, что используйте ProductController с методом index():

product:
  path: /product
  controller: App\Controller\ProductController::index

контроллер индекса отображает шаблон ветки со следующими переменными (controller_name):

return $this->render('product/index.html.twig', [
    'controller_name' => 'ProductController',
]);

решение:

измените свой маршрут продукта на метод show, чтобы вызвать правильный метод контроллера:

product:
  path: /product
  controller: App\Controller\ProductController::show

или поместите «продукты» в качестве переменной в методе index():

    //#[Route('/product', name: 'app_product')]
    public function index(): Response
    {
        $products = []; // insert products here 

        return $this->render('product/index.html.twig', [
            'controller_name' => 'ProductController',
            'products' => $products,
        ]);
    }

Это не имеет ничего общего с маршрутизацией. ОП сделал опечатку, смотрите комментарии

DarkBee 24.05.2023 09:33

или поместите «продукты» в качестве переменной в метод index(): это не сработает

Xavier Issac 24.05.2023 10:39

Другие вопросы по теме