1

コントローラーが開始された場所を知りたいです (つまり、ファイルが含まれている場所と、そのクラスがロードされ、そのメソッドが呼び出されていることを意味します)。コアにマイナーな修正を加えたいので知りたいです。

実際に必要なのは、新しいコントローラーの呼び出しをシミュレートすることです。HMVC のようなテクノロジは必要ありませんが、代わりにもっと単純なものに取り組んでいますが、後で要求されたコントローラと対話できる呼び出しコントローラをシミュレートする必要があります。

すでにコアのローダー クラスを拡張して、ローダー クラスを介して新しいコントローラーを呼び出せるようにしましたが、コントローラーが開始された場所が見つかりません。

4

1 に答える 1

1

317 行目system/core/CodeIgniter.phpから 360 行目 (CodeIgniter 2.1.0) にあります。

/*
 * ------------------------------------------------------
 *  Call the requested method
 * ------------------------------------------------------
 */
    // Is there a "remap" function? If so, we call it instead
    if (method_exists($CI, '_remap'))
    {
        $CI->_remap($method, array_slice($URI->rsegments, 2));
    }
    else
    {
        // is_callable() returns TRUE on some versions of PHP 5 for private and protected
        // methods, so we'll use this workaround for consistent behavior
        if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
        {
            // Check and see if we are using a 404 override and use it.
            if ( ! empty($RTR->routes['404_override']))
            {
                $x = explode('/', $RTR->routes['404_override']);
                $class = $x[0];
                $method = (isset($x[1]) ? $x[1] : 'index');
                if ( ! class_exists($class))
                {
                    if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))
                    {
                        show_404("{$class}/{$method}");
                    }

                    include_once(APPPATH.'controllers/'.$class.'.php');
                    unset($CI);
                    $CI = new $class();
                }
            }
            else
            {
                show_404("{$class}/{$method}");
            }
        }

        // Call the requested method.
        // Any URI segments present (besides the class/function) will be passed to the method for convenience
        call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
    }

しかし、あなたがやろうとしていることはまだ意味がありません。

于 2012-04-26T08:26:59.963 に答える