【问题标题】:Symfony2 - Methods for all controllersSymfony2 - 所有控制器的方法
【发布时间】:2014-09-07 10:30:35
【问题描述】:

在开发我的 Symfony2 应用程序时,我想像在 Ruby on Rails 中一样,在所有控制器中提供可用的方法。在 RoR 控制器中,只需在 ApplicationController 之后继承,这就是您放置所有方法的地方。但是什么是 Symfony 方式,这里有什么好的做法?

我想要的功能其实很简单,类似这样:

public function showAction()
{
    $user = $this->container->get('security.context')->getToken()->getUser();
}

我可以在此处加载当前用户,并且我希望在每次操作之前终止此功能,当然,无需将代码复制到每个控制器中。

【问题讨论】:

  • 请注意标准的 Symfony 2 基本控制器类已经有一个 getUser() 方法。值得看一下源代码,看看它能做什么。

标签: php symfony


【解决方案1】:

您可以为此使用服务。

Acme/DemoBundle/MyService/MyService.php

<?php
namespace Acme/DemoBundle/MyService

class MyService {

   public function myFunction(){
        [...]
   }

}

Acme/DemoBundle/Resources/config/services.yml

services:
    my_service:
        class: Acme/DemoBundle/MyService/MyService

或.xml版本

Acme/DemoBundle/Resources/config/services.xml

<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services
        http://symfony.com/schema/dic/services/services-1.0.xsd"
>
    <services>
        <service id="my_service" class="Acme\DemoBundle\MyService\MyService">

        </service>
    </services>
</container>

然后在控制器中

Acme/DemoBundle/Controller/MyController.php

$this->container->get("my_service")->myFunction();

要使其在所有捆绑包中可用,只需相应地更新每个捆绑包的服务配置文件。

文档是available here

【讨论】:

  • 我应该在 Acme\DemoBundle 目录中为 MyService 类创建特殊文件夹吗?
  • 您几乎可以随心所欲,但这是一种很好的做法。
  • 澄清一下,对于这个具体的例子是的。但是你可以随心所欲,只要你相应地更新命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多