在Symfony中,如何在Menubuilder中调用控制器功能?

时间:2019-04-25 11:20:52

标签: php symfony

我已经在控制器文件Appbundle/Controller/BackendController.php中编写了一个名为getAccess()的函数。

我想在Menu/Menubuilder.php文件中访问此控制器的方法。我该怎么办?

Menu和Appbundle文件夹处于同一级别。

3 个答案:

答案 0 :(得分:5)

您可以使用Trait

特质是一种在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;
    /* ... */
}

答案 1 :(得分:2)

对我来说,不能在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?

答案 2 :(得分:0)

我已经创建了如下服务:

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 }

它按预期工作。