簡體   English   中英

為什么我們在Symfony2控制器的方法中使用“Action”?

[英]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>
        ');
    }

}
?>

我試過googline這個,但我沒有提到或推理為什么。 有人可以解釋為什么我們使用那個后綴?

這只是一個慣例。 您可以使用這些后綴,但也可以不使用它們。

如果你有

public function somethingAction()

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

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

_controller參數使用稱為邏輯控制器名稱的簡單字符串模式。 那么, AppBundle:Index:something意思是:

  • 捆綁: AppBundle
  • Controller類: IndexController
  • 方法名稱: somethingAction

但是,如果沒有此功能,您也可以這樣做。 Symfony非常靈活,它不會強迫你做任何事情。 這只是你必須做同樣事情的眾多方法之一。

如果你采用這個約定,你就更容易理解你的控制器中有哪些action ,其他開發人員很容易理解你的代碼,symfony2更容易在你的包中找到你的動作/控制器,這樣你就可以也是壓倒一切的控制器 這是最佳做法。

但如果您不想要這些好處,您也可以使用其完全限定的類名和方法:

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配置控制器......真的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM