0

MVCの理由から、関数をトリガーして関数が呼び出されたときにそれを見つけられるようにしたいのですが、Codeigniterはコアの周りに関数を持っているので、などの関数をフックして、setcookie呼び出されたときにファイルを作成したいと思います(トリガーされたものから)関数)例:

function call_me()
{
    $file = fopen('setcookie.txt', 'a+');
    fwrite($file, 'Called at ' . __CLASS__);
    fclose();
}

したがって、setcookieが呼び出されると、関数がトリガーされcall_meます。これを行うための特定の機能または方法はありますか?私は知ってdebug_backtraceいますが、それは私が望む目的ではありません。

4

2 に答える 2

1

基本的に見る必要があるのはオブザーバーです。

オブザーバーパターン(別名、依存関係、パブリッシュ/サブスクライブ)は、サブジェクトと呼ばれるオブジェクトがオブザーバーと呼ばれる依存関係のリストを維持し、通常は次のいずれかを呼び出すことによって状態の変化を自動的に通知するソフトウェアデザインパターンです。それらのメソッド。これは主に、分散イベント処理システムを実装するために使用されます。オブザーバーは、おなじみのMVCアーキテクチャパターンの重要な部分でもあります。実際、オブザーバーパターンは、SmalltalkのMVCベースのユーザーインターフェイスフレームワークに最初に実装されました。1

ここで説明されていることを試してみませんか:

http://devzone.zend.com/1384/observer-pattern-in-php/

于 2012-04-13T17:45:21.107 に答える
1

debug_backtraceについては知っていますが、それは私が望む目的ではありません。

バックトラック関数を使用しないように主張しているようですが、関数が呼び出されたときにログに記録する場合は、バックトラックが役立つと思います。

アイデアは、if条件がこのコードを評価するときはいつでも、定数に格納された事前定義されたピースpfコードを持っているということです。

プロモーション中の場合、ifステートメントは何も評価できないため、コードの速度は影響を受けません。それがあなたのために働くならば、あなたはそれをあなたのニーズに合わせて修正して、さらに多くのレベルを追跡することができます。

私の主張を明確にするために、これは完全な例です。私が正しく理解しておらず、これがあなたが探しているものではない場合、お詫びします!

例を確認するには、次のファイルがあります:test.php

<?php

define ('__SITE_PATH',realpath(dirname(__FILE__)).'/');  
ini_set('log_errors', 1); 
ini_set('error_log',  __SITE_PATH.'my_error_log.log');   
include 'test1.php';
include 'test2.php';


define (__DEBUG_EVAL, ' 
    $dbt = debug_backtrace();
    error_log(
    "\n".
    "Parent function file: "         . $dbt[1]["file"]      . "\n" .
    "Parent function class: "        . $dbt[2]["class"]     . "\n" .        
    "Parent fiunction name: "        . $dbt[2]["function"]  . "\n" .    
    "Par. fiunc. called from line: " . $dbt[2]["line"]      . "\n" .

    "Child function file: "           . $dbt[0]["file"]     . "\n" .
    "Child function class: "          . $dbt[1]["class"]    . "\n" .        
    "Child fiunction name: "          . $dbt[1]["function"] . "\n" .    
    "Child fiunc. called from line: " . $dbt[1]["line"]     . "\n" .
    "\n"
    ); 
    ');  


test1::a(); 

   ?>

これはtest1.phpです

<?PHP

class test1
{
    public static function a()
    {
        test2::b();
    }
}

?>

最後はtest2.phpです

<?PHP



class test2
{
    public static function b()
    {
        if(defined('__DEBUG_EVAL')) eval(__DEBUG_EVAL);   
        echo 'Hello!';
    }   
}

?>

これが結果です:

[13-Apr-2012 14:37:18] 
Parent function file: C:\PHP-GTK\MyProjects\Electre\test1.php
Parent function class: test1
Parent fiunction name: a
Par. fiunc. called from line: 29
Child function file: C:\PHP-GTK\MyProjects\Electre\test2.php
Child function class: test2
Child fiunction name: b
Child fiunc. called from line: 7
于 2012-04-13T18:51:23.407 に答える