Какой самый чистый способ загрузки данных многократного использования из репозитория? - PullRequest
0 голосов
/ 07 апреля 2019

В symfony есть menubar, который загружается на каждый сайт моего проекта.Обычно я загружаю данные следующим образом:

/**
 * @Route("", name="main")
 * 
 * 
 */
public function main()
{
    $category_rep = $_om->getRepository(Category::class);
    $this->categories = $category_rep->findAll();
    ....
}

Это нормально, но я ищу лучшее решение для загрузки данных на весь контроллер или проект.Я нашел решение для автозагрузки данных по:

@Entity("category", expr="repository.find($id)")
public function index(Category $category)

, но он может дать мне только один результат из категории Entity (в меню я хочу показать все категории в репозитории).Вторая идея заключалась в том, чтобы сделать конструктор в контроллере, который загружает эти данные следующим образом:

private $categories;

public function __construct(ObjectManager $_om)
{
    $category_rep = $_om->getRepository(Category::class);
    $this->categories = $category_rep->findAll();

}

или создать службу, которая будет загружать эти данные и запускать эту службу в каждом методе.Я хочу спросить, какая из этих идей является лучшим («самым чистым») решением.Может быть, это еще лучший вариант ??

Спасибо за помощь, Крис

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Еще одним, также простым, но гораздо более элегантным (imho) было бы создание пользовательской функции Twig , например:

class MenuExtension extends AbstractExtension
{
    private $categories;

    public function __construct(CategoryRepository $categories)
    {
        $this->categories = $categories;
    }

    public function getFunctions()
    {
        return [
            new TwigFunction(
                'main_menu',
                [$this, 'mainMenu'],
                ['needs_environment' => true]
            ),
        ];
    }

    public function mainMenu(\Twig_Environment $environment)
    {
        $categories = $this->categories->findAll();

        return $environment->render('menu/main.html.twig', [
            'categories' => $categories,
        ]);
    }
}

Конечно, вам также нужен шаблон длясамо меню, как в предыдущем ответе:

# menu/main.html.twig

{% for category in categories %}
    <div>
        <a href="{{ path('/url/to/view/category/with/id', { id: category.id }) }}">
            {{ category.name }}
        </a>
    </div>
{% endfor %}

Теперь вы можете использовать пользовательскую функцию в вашем base.html.twig:

<div class="menubar">
    {{ main_menu() }}
</div>
0 голосов
/ 07 апреля 2019

Простое решение может быть отдельным действием контроллера для получения категорий для меню, что-то вроде:

class MenuController extends AbstractController
{    
    public function displayMainMenu()
    {
        $categories = $this->getDoctrine()->getRepository(Category::class)->findAll();

        return $this->render('menu/main.html.twig', [
            'categories' => $categories,
        ]);
    }
}

, который возвращает частичный шаблон с HTML-кодом меню, примерно так:

# menu/main.html.twig

{% for category in categories %}
    <div>
        <a href="{{ path('/url/to/view/category/with/id', { id: category.id }) }}">
            {{ category.name }}
        </a>
    </div>
{% endfor %}

Теперь вам нужно всего лишь включить этот обработанный шаблон в ваш base.html.twig с помощью , встраивая контроллер :

<div class="menubar">
    {{ render(controller('App\\Controller\\MenuController\\displayMainMenu')) }}
</div>

Для более сложных меню вы можете использовать выделенный пакет, например KnpMenuBundle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...