以前は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);
}
}
}
変数はサーバーの現在の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
を使用すると、異なる値を返します。 これは今のところ重要ではない、私はできるだけ明確にしたい。 私はバントを開始し、すべての担当者を失うが、私は本当にこれを助けて学びたい。
私は幸せではなかったので、あなたのような何か、あなたのルートを作る必要があります私たちのセッションの最終結果と一緒に。私は、コントローラ上のメソッドを直接呼び出すルーターについて見てみることにしました。私はカップルを見つけました:[ルーティングでは、クロージャやコントローラをロードできるパスに基づいて独自のURLパスを作成できます](http://simplemvcframework.com/documentation/v2/routes)。また、[PHPルータクラス - コントローラのメソッドを呼び出す](https://github.com/dannyvankooten/PHP-Router)私はあなたがそれらが役に立つと思うでしょうか? –
@ Gavrielルータのクラスを明確にするために必要ないくつかの点があります。StackOverflowの他のメンバーを助けるために一緒に議論できることを願っています。私は今チャット中です。 – Dillinger
フレームワークが「純粋なPHPコード」でないときはいつですか? – Luke