В Symfony, как вызвать функцию контроллера в Menubuilder? - PullRequest
0 голосов
/ 25 апреля 2019

Я написал одну функцию как getAccess () в файле контроллера Appbundle/Controller/BackendController.php.

Я хочу получить доступ к методу этого контроллера в файле Menu/Menubuilder.php. Как я могу это сделать?

Папки Menu и Appbundle находятся на одном уровне.

Ответы [ 3 ]

5 голосов
/ 25 апреля 2019

Вы можете использовать Черта

Черты - это механизм повторного использования кода в языках с одним наследованием, таких как PHP. Черта предназначена для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику свободно повторно использовать наборы методов в нескольких независимых классах, живущих в разных иерархиях классов.

Итак, вы можете создать свою функцию getAccess () в файле свойств и просто использовать ее в BackendController.php и Menubuilder.php

trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
2 голосов
/ 25 апреля 2019

Для меня контроллер не может быть вызван в menuBuilder и он не будет "чистым". Я предлагаю вам создать менеджера или службу, которая содержит эту функцию, и вызвать вашу службу в вашем контроллере и в MenuBuilder.

namespace App\Service;

class MessageGenerator
{
    public function getHappyMessage()
    {
        $messages = [
            'You did it! You updated the system! Amazing!',
            'That was one of the coolest updates I\'ve seen all day!',
            'Great work! Keep going!',
        ];

        $index = array_rand($messages);

        return $messages[$index];
    }
}

Какая у вас версия Symfony?

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

Я создал сервис следующим образом:

namespace AppBundle\Services;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;


class UserAccessService {

    private $conn;
    private $container;
    private $tokenStorage;

    public function __construct(EntityManagerInterface $entityManager, ContainerInterface $container, TokenStorageInterface $tokenStorage) {
        $this->conn = $entityManager;
        $this->container = $container;
        $this->tokenStorage = $tokenStorage;
    }

и добавил следующий код в services.yml:

app.service.useraccessservice:
        class: AppBundle\Services\UserAccessService
        arguments: ['@doctrine.orm.default_entity_manager','@service_container','@security.token_storage']

    app.menu_builder:
        class: AppBundle\Menu\MenuBuilder
        arguments: ["@knp_menu.factory", "@security.authorization_checker", '@security.token_storage', '@translator', '@app.service.useraccessservice','@kernel']
        public: true
        tags:
            - { name: knp_menu.menu_builder, method: createMainMenu, alias: main_menu }
            - { name: knp_menu.menu_builder, method: createManagementMenu, alias: management_menu }
            - { name: knp_menu.menu_builder, method: createUserMenu, alias: user_menu }

Работает как положено.

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