2017-11-10 5 views
2

まず、私が何をしようとしているのかを説明します。私はPHPのルータでどのように動作しているのか、そしてオブジェクトでインスタンス化しています私はそこに問題がないルートを作ることができます。phpファイルローダーオブジェクトから変数を保持するものがありません

今私はもう少し複雑な何かをしようとしている、私は事前にファイル名を知らないだろうという名前のフォルダのルートからインクルードされたファイルからのルートをロードできるようにしたいです。それでも問題はない、かなりシンプル。私のインクルージョンを行う

は、私がなぜオブジェクトの内側に含まれたまま、思った、私は再帰的にフォルダからファイルをロードするために専用されるfileLoaderオブジェクトà作成する必要があります。私はそれをして、新しい物体を作った。私のローダーオブジェクト、設定すべきである$ルータの変数を呼び出すとき

さて、ではないと私はので、未定義の変数のルートを作成することはできません。説明のための少しのコード。

これはルータ・オブジェクトを呼び出す関数である:

public function loadFolder(string $path, string $directory){ 
     $theDirectory = $path. "/" .$directory; 
     $files = scandir($theDirectory); 

     foreach($files as $file){ 
      if(is_file($theDirectory. "/" .$file)) 
       include_once($theDirectory. "/" .$file); 
      else{ 
       if($file != "." && $file != "..") 
        $this->loadFolder($path, $directory. "/" .$file); 
      } 
     } 
    } 

ルート例インクルードファイルから:

$router->get("/", function(){echo "Welcome on the home page!";}); 
これはfileLoaderから関数である

private function projectRooting(){ 

     $router = new Router\Router($this->baseUri); 

     $fileLoader = new FileLoader(); 
     $fileLoader -> loadFolder($this->fullDirName, "/routes"); 

     // include_once($this->fullDirName."/routes/web.php"); 

     $router->run(); 
    } 

コメントアウトされたコードでは動作しませんが、$ fileLoaderの部分にコメントを付けて、in clude_once、すべてが再び動く。

は私が別のオブジェクトから呼び出されたときに作品が含まれるように、何かを逃したことがありますか?

お返事場合は、事前に感謝し、私の下手な英語のため申し訳ありません。

+0

だから、 'ます$ router->ラン();'あなたのための未定義ようですか?何かエラーが出ますか? – deFreitas

+0

Nop、$ router-> run()は問題なく動作します。何も動作しないのは、loadFolderインクルードによって呼び出される別のファイルにある$ route-> getメソッドです。 –

答えて

0

スコープの問題があると思いますが、$route変数はインクルードファイル内ではアクセスできません。グローバル変数のスコープを使用してみてください。

private function projectRooting(){ 
    global $router; 
    $router = new Router\Router($this->baseUri); 
    ... 

次に、あなたのインクルードされたファイルはそれを

global $router; 
$router->get("/", function(){echo "Welcome on the home page!";}); 

を入れて内側にそれはおそらく作品は、今、なぜ単に作品をのinclude_once必要がありますか?

あなたはこの関数の中include_onceそれを呼び出すときに問題が、loadFolder機能ですが$router変数への参照を持っていない、それはあなたがprojectRooting関数内のすべてのloadFolderコンテンツを貼り付ける場合、それはおそらく働くことを意味します。

これを解決する別の方法は、引数で$routerloadFolder関数に渡すことです。

+0

ありがとう、私は今晩テストします。私は$ router変数をloadFolderに渡すことを考えましたが、どこにでもファイルをロードできるようにしたいと思っています。私はグローバルで試してみて、それ以外のものを試してみると思います。 –

+0

私はそれをグローバルでテストしたところ、動作します。 –

関連する問題