为什么我们使用"行动"在Symfony2控制器的方法?

时间:2015-10-13 16:59:57

标签: php symfony

我刚刚开始研究symfony2书。 我想知道为什么我们命名控制器的函数Action

public function [something]Action() { // ...

到目前为止,本书中的所有示例中,我在网上看到的所有代码Action都是函数名称。有什么理由吗?

这非常有效:

<?php

// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;

class LuckyController extends Controller{

    /**
     * @Route("/lucky/number/{count}")
     */
    public function countTESTING($count){
        return new Response(
            '<html><body>I DONT HAVE TO CALL THIS somethingACTION</body></html>
        ');
    }

}
?>

我已经尝试了googline这个,但我没有提及或推理为什么。有人可以解释为什么我们使用那个后缀吗?

3 个答案:

答案 0 :(得分:13)

这只是一个惯例。您可以使用这些后缀,但也可以不使用它们。

如果你有

real*16
在控制器中,您可以通过以下方式在路由配置中引用它:

public function somethingAction()

index: path: /path_for_something defaults: { _controller: AppBundle:Index:something } 参数使用名为logical controller name的简单字符串模式。所以,_controller表示:

  • 捆绑: AppBundle
  • 控制器类: IndexController
  • 方法名称: somethingAction

但是,您也可以在没有此功能的情况下执行此操作。 Symfony非常灵活,它不会强迫你做任何事情。这只是你必须做同样事情的众多方法之一。

如果您采用此惯例,您可以更轻松地了解控制器中有哪些AppBundle:Index:something,其他开发人员可以轻松理解您的代码,并且&#39 ; symfony2更容易在你的包中找到你的动作/控制器,这样你也可以overriding controllers。这是最好的做法。

但如果您不想要这些好处,您也可以使用其完全合格的班级名称和方法:

action

但是,正如文件所说:

  

如果您遵循一些简单的约定,则逻辑名称更多   简洁,更灵活。

答案 1 :(得分:0)

不,这不仅仅是命名约定。它用于在每个控制器“操作”方法之前或之后执行一些代码。就像检查一样,用户已经登录。 它基于魔术__call函数,该函数针对不存在或不公开的方法调用执行。

$controller = new Posts();
$controller->index();

class Posts
{
    public function __call($name, $args)
    {
        //run code before    
        call_user_func_array()[$this, "$nameAction"], $args);
        //run code after
    }

    public function indexAction()
    {
    }
}

答案 2 :(得分:-3)

您必须为自己的行为命名

public function somethingAction(){}

因为您的路线指向控制器,以及您要调用的操作。

您也可以在控制器中拥有私人功能,只需命名

private function something(){}

我说使用yml配置控制器,我不相信它在使用注释时有所不同,但我的建议是使用yml来配置控制器......真的!