-3

作業中のPHP MVCでは、CONTROLLERフォルダーにファイルコントローラーがありますが、フォルダー内にコントローラーを呼び出す必要があるフォルダーがあります。

以下のこれらのより良い方法と適切なコード実装はありますか?

私はこの方法で作業していますが、コントローラーを呼び出す最良の方法はわかりませんか?

/*

STRUCTURE OF DIR FILES: controllers:
a/b/c/file.php
a/b/c <-- IS DIRECTORY
a/b/c <-- IS FILE

*/
$uri_result = false;
$controller_called = false;

/* called controllers */
$uri_segments[0] = 'a';
$uri_segments[1] = 'b';
$uri_segments[2] = 'c';
#$uri_segments[3] = 'file.php';
/* end called controllers */

$counted = count($uri_segments);

$filled = array();
$i = 0;
do {

    if ($i < $counted)
    {
        $z[] = $uri_segments[$i];
        $ez = implode('/', $z);
    }

    if (file_exists($ez))
    {
        $uri_result = $ez;
        $controller_called = $z[$i];    
    }
++$i;
} while ($i < $counted);

var_dump($uri_result,$controller_called);

/* RESULTS:

If called $uri_segments[0] to uri_segments[3]
string(14) "a/b/c/file.php" string(8) "file.php" 

If called $uri_segments[0] to uri_segments[2]
string(5) "a/b/c" string(1) "c" 

*/
4

1 に答える 1

-1

基本的なアプローチは問題ないように見えますが、変数名とスコープの改善、より適切なループの使用など、整理したい点がいくつかあります。

また、私が見る限り、URL パスの最も長いセクションを見つけてコントローラーとして機能させたいので、短く始めて長くするのではなく、長く始めて短くしたいでしょう。

/**
 * Find the most specific controller file to serve a particular URL path
 *
 * @param string $url_path Relative path passed through from URL handler
 * @return string $controller_file Relative path to controller file
 */
function find_controller_file($url_path)
{
    $url_parts = explode('/', $url_path);

    // Start with the full path, and remove sections until we find a controller file
    while ( count($url_parts) > 0 )
    {
        // Concatenate remaining parts of path; this will get shorter on each loop
        $test_path = implode('/', $url_parts) . '.php';

        if ( file_exists($test_path) )
        {
            // We've found a controller! Look no further!
            return $test_path;
        }
        else
        {
            // No controller there. Let's remove the last path part and try again
            array_pop($url_parts);
        }
    }

    // If we reach here, we never found a controller. This is probably an error.
    throw new Controller_Not_Found_Exception();
}

編集(承認後)以下のハクラのコメントによると、含まれるファイルにはおそらく常に拡張子「.php」が付いているため、サンプルにはこれが反映されています。

于 2012-08-12T15:56:19.607 に答える