0

Symfony 1.4 で REST API に取り組んでいます

「api」アプリケーションに出入りするすべてをログに記録したいと思います。log/api フォルダーでは、さまざまなファイルで API 呼び出しを追跡します。myModule/myAction の呼び出しには、次の 3 つのファイルがあります。

  • すべてのリクエストの myModule_myAction_RQ.log
  • すべての応答の myModule_myAction_RS.log
  • すべてのエラー応答の myModule_myAction_error.log

各アクションの最初と最後にコードを追加して、手動で行う方法を知っています。これが私が行く方法です:

class myActions extends sfActions
{   
/**
 * log function
 */
private static function customLog($message, $seed, $url, $content, $type)
{
    $file =  sprintf('%s/%s_%s.log', sfConfig::get('sf_log_dir', "no_log_dir")."/api", $message, $type);
    $logger = new sfFileLogger(
                new sfEventDispatcher(), 
                array('file'=> $file)
            );

    $logger->log( sprintf("#%s# (%s) %s ", $seed, $url, $content),
                    0, 
                    "info"
    );
}

/**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    try {           
        $json_msg = $request->getContent();
        // LOG !!!
        $seed = rand();
        $current_uri = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        self::customLog("availability", $seed, $current_uri, $json_msg, 'RQ');

                    // Do some API logic to set $response_msg
                    // ...

                    $this->response_msg = $response_msg;

        // LOG !!!
        self::customLog("myModule_index", $seed, $current_uri, $response_msg, 'RS');

    }
    catch(Exception $e)
    {
        // throw $e;
        $this->setTemplate("error");
        $this->error = $e;

        // LOG !!!
        self::customLog("myModule_index", $seed, $current_uri, $e->getCode().":".$e->getMessage(), 'error');
    }

  }

ログに記録される情報の例を次に示します。

 myModule_index_RQ.log:
 Apr 25 11:49:31 symfony [emerg] #958824120# (http://host.local/api_dev.php/users/1/index {"price_km":0.66,"reservation_type":3, "position":{"long":2.139015,"lat":41.37947}} 
 Apr 25 11:56:27 symfony [emerg] #512729287# (http://host.local/api_dev.php/users/1/index {"price_km":0.66,"reservation_type":3,"position":{"long":2.161576,"lat":41.396896}}

myModule_index_RS.log:
Apr 25 11:49:32 symfony [emerg] #958824120# (http://host.local/api_dev.php/users/1/index) {"id_availability":539,"alternatives":[{"id_alternative":1,"duration":9,"reservation_type":3,"distance":3.5,"price":1.62,"original_price":2.31}]} 
Apr 25 11:56:27 symfony [emerg] #512729287# (http://host.local/api_dev.php/users/1/index) {"id_availability":540} 

myModule_index_error.log:
 Apr 25 11:38:20 symfony [emerg] #1059359810# (http://host.local/api_dev.php/users/1/index) 4205:Position to out of service area 

今、これはすぐに退屈になる可能性があります...

Symfony の内部構造に関する十分な知識があれば、これをうまく (DRYly) 達成できることを理解しています。だからここに私の質問があります:

  • イベントはそれを成し遂げる方法かもしれません。私は正しいですか?その場合、どのイベントを使用する必要がありますか? これをどのようにまとめますか?
  • $request->getContent() で、送られてきたメッセージの内容を取得できます。応答コンテンツを取得するにはどうすればよいですか? (私のビューの内容は私の行動が終わった後にしか分からないので、これは「いつものように」できることではありません)。
  • では、フィルターは、このすべてのログ機能を実現する方法になる可能性がありますか?
  • たぶん、この問題は非常に標準的であるため、構成ファイルで設定できますか?ばかげていますか?または、一部のモジュールがまさにそれを行っている可能性がありますか?

このレベルの Symfony の内部構造は、私にとってまだまったく新しいものです。

4

1 に答える 1