2016-01-31 10 views
8

以前はCodeIgniterフレームワークで書かれたアプリケーションを書き直していますが、私の顧客は独立したアプリケーションと純粋なPHPコードを必要としていました。とにかく私に言わないでください私はすでに私のクライアントが間違っていることを知っているので、ホイールを再発明しないでください。私たちは問題に遭遇する。
私は任意の場所から任意のファイルを呼び出すことができる単純なルートクラスを探しています。このシンプルでパワフルなクラス、this is the repositoryが見つかりました。
私は自分のプロジェクトでそれを実装しました。route.phpファイルをインデックスの場所にコピーして、.htaccessというファイルをドキュメントの説明どおりに変更します。ルートクラスが正常に動作しない

/ PUBLIC_HTML 
/application 
     /controllers 
       /backend.php 
       /user.php 
     /helpers 
     /models 
     /views 
       /backend 
        /backend.php 
        /calendar.php 
       /user 
        /users.php 
        /panel.php 
/assets 
     /files used by frontend... 
/system 
     /configuration 
     /constant 
/.htaccess 
/index.php 
/route.php 

applicationiは、データベースとの接続を確立するための構成ファイルが含まれているindex.phpから開始されます。その代わり、すべての、これは私のプロジェクトの構造があります。同じconfigurationファイルにはroute.phpをインポートしました。今私のindex.phpページはこのように、非常に簡単です:

// Check if the session is set 

if(isset($_SESSION['user_info']['id_roles'])) 
{ 
    switch($_SESSION['user_info']['id_roles']) 
    { 
     case 1:   //Admin 
      $route->add('/application/controllers/backend', 'index'); 
      $route->submit(); 
      break; 
     case 2:   //Provider 
      $route->add('/application/controllers/backend'); 
      $route->submit(); 
      break; 
     case 3:   //Customer 
      $route->add('/application/controllers/appointments'); 
      $route->submit(); 
      break; 
    } 
} 
else 
{ 
    // Session isn't set, so I redirect user to login page 

    header('Location: application/views/user/login.php'); 
    exit; // stop 
} 

のでsessionが設定されていない場合、私は、ログインページを表示し、私は反対、正しい場所にユーザーの種類をリダイレクト設定されている場合。 loginページでは、セッション変数の値を単純に評価します。応答が成功すると、ユーザーは再度インデックスページにリダイレクトされます。
問題は今、例えば管理者が(そうcase 1)、routeクラスは$uri、ビット例えば付加価値化しない記録されたとき、ということである。

public function submit() 
{ 
    $uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/'; 
    $uri = trim($uri, $this->_trim); 

    $replacementValues = array(); 

    // Iterate on the list of URI 

    foreach($this->_listUri as $listKey => $listUri) 
    { 
     // Looking for a match.. 

     if(preg_match("#^$listUri$#", $uri)) 
     { 
      // Replace the values 

      $realUri = explode('/', $uri); 
      $fakeUri = explode('/', $listUri); 

      // Get value with .+ with real URI value 

      foreach($fakeUri as $key => $value) 
      { 
       if ($value == '.+') 
       { 
        $replacementValues[] = $realUri[$key]; 
       } 
      } 

      // Pass array arguments.. 

      call_user_func_array($this->_listCall[$listKey], $replacementValues); 
     } 
    } 
} 

check the full class here

変数はサーバーの現在のuriで有効にする必要がありますが、var_dumpを試しましたが、空の値を取得しました。一致条件が呼び出されず、正しいファイルが表示されません。私はなぜ、私はちょうどそれが動作していない理由を理解したい、私はおそらく間違っている何かを知っている、誰かが私が理解するのを助けることができますか?
管理者リダイレクトの例を完了したら、routeからロードするbackend.phpに含まれているものだけを表示したいとします。

<?php 

    session_start(); 

    class Backend 
    { 
    // Construct of class 

    public function __construct() 
    { 

    } 

    // Display the main backend page 

    public function index($appointment_hash = '') 
    { 
     $_SESSION['user_info']['hash'] = $appointment_hash; 
     $_SESSION['user_info']['dest_url'] = SystemConfiguration::$base_url . "backend"; 
     // some content.. 
    } 

    ... 

だから、あなたが見ることができますどのように、私は単に私が操作を実行するために呼び出すコントローラのURL、および->submit()を追加するための->add()を呼び出すときbackendコントローラのindex関数を呼び出したいです。
私は間違っていますか?

はUPDATE - ルータ要求タスク

最初に私は自分のアプリケーションのスタックを更新しました。

1.インポートコントローラ

インポートcontrollersと呼ばれる私のフォルダに含まれているすべてのコントローラ: 私はこの時点で、それはオープンソースのルータは、私は、このタスクを実装することができた上で、あなたの専門家の助言を頼むのがベストだと思います。インポートしたら、単にルータのインスタンスを呼び出し、ロードされたコントローラの特定の機能を呼び出します。例:

それは backendと呼ばれるコントローラの機能を表す index();
$router->backend->index(); 

。 これはアプリケーション全体で実行する必要があります。私はこのURLを挿入する場合にも、私は、我々は特に、URL経由でも機能を起動できることを確認します:

localhost/application/controllers/backend/index 

私は単にURLを参照する同じ機能を呼び出すことができます。

2.要求アヤックス 配達私のルーターは、私はこのコードを使用する場合は特に、JavaScriptからのAjaxリクエストを実行できるようにする必要があります。

$('#login-form').submit(function(event) 
    { 

     var postUrl = GlobalVariables.baseUrl + 'user/ajax_check_login'; 
     var postData = 
     { 
      'username': $('#username').val(), 
      'password': $('#password').val() 
     }; 

     $('.alert').addClass('hidden'); 

     $.post(postUrl, postData, function(response) 
     { 

私はユーザー関数ajax_check_loginを呼びたいです。 コントローラに含まれていますuser、想像GlobalVariables.baseUrl、どういうわけか...明らかに異なるベースアプリケーションのURLはどう思いますか? コントローラの関数がjson形式を返すことに注意してください。

3.ロードビュー

私のアプリケーションであっ.phpに保存されているビューは、ですが、htmlファイル、ビューの例(以前のCodeIgniterで書かれた)あなたはhereを見つけるPULを含みます。 ビューを呼び出して新しいユーザーのHTMLマークアップを表示したいと考えています。ビューは、「ロードされ」ているので、ビューで何を参照するか$thisの理解を容易にする

header, body, footer 

:私はまた、私はに体を分割回数で、たとえば、同じ瞬間にも、複数のビューを呼び出す必要がありますコントローラーメソッドでは、ビューは引き続きそのメソッドと同じスコープで実行されます。つまり、$thisは、ロードされたクラスによって異なるコンテキストを持つことができます。例えば

:この例ではコントローラにロードされた任意のビューファイルで

class Controller1 extends CI_Controller {} 

は、$thisはローダのような(ならびにCI_Controllerパブリック及び保護プロパティ/メソッドにアクセスすることができるController1クラスに特異的に指しまたは入力クラス、CI_Controllerのロードおよび入力プロパティに割り当てられている)がそのクラスを拡張してであるためです。

コントローラはまだまだ古いPHPクラスです。私はこれを行うにした場合:

class Controller1 extends CI_Controller { 
    $this->foobar = 'Hello'; 
} 
class Controller2 extends CI_Controller { 
    $this->foobar = 'World'; 
} 

我々はこれらのコントローラのいずれかのいずれかの方法で同じビューファイルを読み込む場合は...、そのビューファイルに$this->foobarを使用すると、異なる値を返します。 これは今のところ重要ではない、私はできるだけ明確にしたい。 私はバントを開始し、すべての担当者を失うが、私は本当にこれを助けて学びたい。

+1

私は幸せではなかったので、あなたのような何か、あなたのルートを作る必要があります私たちのセッションの最終結果と一緒に。私は、コントローラ上のメソッドを直接呼び出すルーターについて見てみることにしました。私はカップルを見つけました:[ルーティングでは、クロージャやコントローラをロードできるパスに基づいて独自のURLパスを作成できます](http://simplemvcframework.com/documentation/v2/routes)。また、[PHPルータクラス - コントローラのメソッドを呼び出す](https://github.com/dannyvankooten/PHP-Router)私はあなたがそれらが役に立つと思うでしょうか? –

+0

@ Gavrielルータのクラスを明確にするために必要ないくつかの点があります。StackOverflowの他のメンバーを助けるために一緒に議論できることを願っています。私は今チャット中です。 – Dillinger

+0

フレームワークが「純粋なPHPコード」でないときはいつですか? – Luke

答えて

3

Routerと一緒に提供されているindex.phpを例にする必要があります。あなたは、ルートを設定する方法について説明します:

  • あなたは常に2つの引数を持っている必要があります。1. URI、2.機能
  • は例に係る機能は、関数名'index'ないことがありますが、機能体function(){...}。たぶん参照もうまくいくでしょう。
  • (それができるのに、それを行うための通常の方法ではありません)
  • ルーティングIMHOがセッションに依存しないでなければなりません
  • 代わりの$router->backend->index();、私は、ファイルの末尾にコードの共通ブロックを持つことになりますので、あなたドン&を何度も貼り付ける必要があります。

私はあなたの方法でバックエンドを表示し、その後、どのように一般的にすることができます。

<?php 
session_start(); 
include 'route.php'; 
$phpClass = false; 
$view = false; 
$func = false; 
$route = new Route(); 
if(isset($_SESSION['user_info']) && isset($_SESSION['user_info']['id_roles'])) { 
    $route->add('/application/controllers/backend', function(){ 
    echo 'You are now at backend page, and the role is '; 
    switch($_SESSION['user_info']['id_roles']) { 
     case 1: echo 'Admin'; break; 
     case 2: echo 'Provider'; break; 
     case 3: echo 'Customer'; break; 
    } 
    include 'backend.php'; 
    $backend = new Backend(); 
    $backend->index(/* I don't know what 'hash' could be */); 
    }); 

    // more general case: 
    $route->add('/application/controllers/appointments', function(){ 
    // we only set the global $phpClass variable, and the rest is common, see below 
    global $phpClass, $func; 
    $phpClass = 'Appointements'; 
    $func = 'index'; // default is index, if it wasn't given on the url 
    }); 
    $route->add('/application/controllers/appointments/add', function(){ 
    // we only set the global $phpClass variable, and the rest is common, see below 
    global $phpClass, $func; 
    $phpClass = 'Appointements'; 
    $func = 'add'; 
    }); 
    $route->add('/application/controllers/appointments/delete', function(){ 
    // we only set the global $phpClass variable, and the rest is common, see below 
    global $phpClass, $func; 
    $phpClass = 'Appointements'; 
    $func = 'delete'; 
    }); 
    $route->add('/application/controllers/foo', function(){ 
    global $phpClass; 
    $phpClass = 'Foo'; 
    }); 
    $route->add('/application/controllers/bar', function(){ 
    global $phpClass; 
    $phpClass = 'Bar'; 
    }); 

    $route->add('/application/views/bar', function(){ 
    global $phpClass, $view; 
    $phpClass = 'View'; 
    $func = 'show'; 
    $view = 'bar.php'; 
    }); 

    $route->submit(); 
} else { 
    // Session isn't set, so I redirect user to login page 
    header('Location: /application/views/user/login.php'); 
    exit; // stop 
} 

if ($phpClass === false || $func === false) { 
    die("You have to have both controller and function un the url"); 
} 

// if we got here it means we're in the common case 

// include the necessary controller. If you want you can 
// include all of them at the top of the php and remove this line 
include 'application/controllers/' . strtolower($phpClass) . '.php'; 

$controller = new $phpClass(); 

// this is instead of `$router->backend->index();`: 
$controller->$func(/*$hash*/); 
// I don't know what '$hash' could be, maybe javascript could send it via ajax 

?> 

コントローラ/ view.php:コントローラー/ user.phpでJSONレスポンスの

class View { 
    public function show() { 
     global $view; 
     include 'application/views/' . $view; 
    } 

    // here you'll need to have all the things that any of 
    // your views access as $this->bar : 
    $config = new stdClass(...); 
    $array = array(); 
    function get_lang() {global $lang; return $lang;} 
    //... 
} 

例:

class User { 
    public function logged_in() { 
     $username = isset($_SESSION) && isset($_SESSION['username']) ? $_SESSION['username'] : false; 
     $response = array(
      'success' => $username !== false ? 'OK' : 'ERROR', 
      'username' => $username 
     ); 
     echo json_encode($response); 
    } 
} 
関連する問題