为什么我们使用“行动”在Symfony2控制器'


Why we use "Action" in Symfony2 controller's methods?

我刚刚开始阅读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>
        ');
    }
}
?>

我试着在谷歌上搜索这个,但我没有看到提及或原因。有人能解释一下为什么要用这个后缀吗?

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

如果你有

public function somethingAction()

,你可以这样在路由配置中引用它:

index:
    path:      /path_for_something
    defaults:  { _controller: AppBundle:Index:something }

_controller参数使用一个简单的字符串模式,称为逻辑控制器名称。因此,AppBundle:Index:something表示:

  • 包: AppBundle
  • 控制器类:IndexController
  • 方法名somethingAction
但是,您也可以在不使用这个特性的情况下使用。Symfony非常灵活,它几乎不会强迫您做任何事情。这只是你必须做同样事情的许多方法之一。

如果你采用这个约定,你就更容易理解你的控制器中有哪个action,其他开发人员也更容易理解你的代码,symfony2也更容易在你的bundle中找到你的动作/控制器,这样你也可以重写控制器。这是最佳实践。

但是如果你不想要这些好处,你也可以使用它的完全限定类名和方法:

index:
    path:      /something
    defaults:  { _controller: AppBundle'Controller'IndexController::indexAction }

但是,正如文档所说:

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

不,这不仅仅是一个命名约定。它用于在每个控制器"action"方法之前或之后执行一些代码。比如检查用户是否登录了。它基于magic __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()
    {
    }
}

你必须为你的动作命名

public function somethingAction(){}

,因为你的路由指向一个控制器,以及你想要调用的操作。

你也可以在你的控制器中有私有函数,你将只命名为

private function something(){}

我说使用yml配置控制器,我不相信它的不同,当使用注释,但我的建议是使用yml配置控制器…真的!