Php 为什么我们使用;行动“;在Symfony2控制器中';什么方法?

Php 为什么我们使用;行动“;在Symfony2控制器中';什么方法?,php,symfony,Php,Symfony,我刚开始读symfony2这本书。 我想知道为什么我们将控制器的功能命名为动作: public function [something]Action() { // ... 到目前为止,在书中的everyone示例中,我在线看到的所有代码Action都是函数名。有什么原因吗 这非常有效: <?php // src/AppBundle/Controller/LuckyController.php namespace AppBundle\Controller; use Symfony\Bu

我刚开始读symfony2这本书。 我想知道为什么我们将控制器的功能命名为动作:

public function [something]Action() { // ...
到目前为止,在书中的everyone示例中,我在线看到的所有代码
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(){}
因为您的路由指向一个控制器,以及您要调用的操作

您还可以在控制器中使用私有函数,您只需命名这些函数

private function something(){}

我说使用yml配置控制器,我不相信使用注释时会有什么不同,但我的建议是使用yml配置控制器。。。真的

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

如果你有

public function somethingAction()
在控制器中,您可以通过以下方式在路由配置中引用它:

index:
    path:      /path_for_something
    defaults:  { _controller: AppBundle:Index:something }
\u控制器
参数使用一个简单的字符串模式,称为。所以,
AppBundle:Index:something
的意思是:

  • 捆绑包:AppBundle
  • 控制器类:IndexController
  • 方法名称:somethingAction
但是,您也可以在没有此功能的情况下执行此操作。Symfony非常灵活,几乎不强迫您做任何事情。这只是你做同样事情的众多方法之一

如果采用此约定,您将更容易理解控制器中有哪些
操作
,其他开发人员也更容易理解您的代码,symfony2也更容易在捆绑包中找到您的操作/控制器,以便您也可以。这是最好的做法

但如果您不想获得这些好处,也可以使用其完全限定的类名和方法:

index:
    path:      /something
    defaults:  { _controller: AppBundle\Controller\IndexController::indexAction }
但是,正如文件所说:

如果您遵循一些简单的约定,那么逻辑名称就更简单 简洁,允许更多的灵活性


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

$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()
    {
    }
}

好的,我想它现在明白了,当通过yml配置路由时,你实际上是在写速记,soo。。默认值:{u controller:AppBundle:Blog:show}实际上=“AppBundle:BlogController:showAction”。这似乎不是注释的情况,经过一点测试后,注释似乎只会在匹配时调用最近的函数(在它下面)。我想我会走yml路线。将所有路由保持在一个位置是非常有意义的。事实上,我使用yml作为控制器,但对于实体的注释,对我来说,这非常有意义。。如果你认为是的话,我很长一段时间都喜欢yaml。最近发布的Symfony最佳实践表明,注释是最简洁的,或者更确切地说,是开发人员友好的配置格式。使用yaml与注释相比,我遇到的最大问题是,使用yaml时,我在文件之间切换,以获得零可用性增益。如果没有一个好的IDE,你会经常搜索动作名称。我知道这已经是一年前的事了,但我不得不说这是一个非常简洁和完整的问题解释。谢谢