URL ルートを読み取り、パスの値を解析するため、可能な限り最速の方法 (たとえば、MVC システムを実装するため) で手動または自動で解釈できます。
他のライブラリとは異なり、このライブラリには依存関係がなく、単一のクラスに含まれているため、WordPress、Laravel、Drupal、カスタム PHP プロジェクトなど、あらゆる PHP プロジェクトと互換性があります。
このライブラリは、CoC Convention over Configurationに基づいています。定型文は削減されますが、機能は固定されています。このライブラリではカスタム「ルート」の使用は許可されていませんが、実質的にすべてのケースをカバーしているため、柔軟性は犠牲になりますが、パフォーマンスと使いやすさは向上します。
次の URL http://somedomain.dom/Customer/Update/2 があるとします。このライブラリは、この URL を、プロセスまたはメソッドを直接呼び出すことができる変数に変換します。
ルート.php
$ route = new RouteOne ( ' http://www.somedomain.dom ' );
$ route -> addPath ( ' api/{controller}/{action}/{id} ' );
$ route -> addPath ( ' {controller}/{action}/{id}/{idparent} ' );
$ route -> fetchPath ();
$ this -> callObjectEx ( ' cocacolacontroller{controller}Controller ' );
コントローラーCustomerController.php クラス
namespace cocacola controller ;
class CustomerController {
public function updateAction ( $ id = null , $ idparent = null , $ event = null ) {
echo " We want to update the customer $ id " ;
}
}
次の操作を実行するとします。
ユーザーが次の Web サイト http://somedomain.com/Customer/Insert を呼び出し、顧客を挿入するフォームを表示したいと考えています。
use eftec RouteOne RouteOne ;
$ route = new RouteOne ( ' . ' , null , null ); // Create the RouteOne Class
$ route -> fetch (); // fetch all the input values (from the route, get, post and such).
$ route -> callObject ( ' somenamespace \ controller \ %sController ' ); // where it will call the class CustomerController*
または
use eftec RouteOne RouteOne ;
$ route = new RouteOne ( ' . ' , null , null ); // Create the RouteOne Class
$ route -> fetch (); // fetch all the input values (from the route, get, post and such).
$ route -> callObjectEx ( ' somenamespace \ controller \ {controller}Controller ' ); // where it will call the class CustomerController*
このコードは、Customerクラス内のメソッドInsertActionGet (GET)、 InsertActionPost (POST)、またはInsertAction (GET/POST) を呼び出します。
呼び出されるメソッドは次のように記述されます。
class Customer {
public function insertAction ( $ id = "" , $ idparent = "" , $ event = "" ) {
// here we do our operation.
}
}
顧客番号20 を更新したいとします。その後、次のページを呼び出すことができます。
http://somedomain.com/Customer/Update/20
ここで、20 は編集する顧客の「$id」です (文字列の数字である可能性があります)
ビジネスAPPLの顧客番号20 を更新したい場合はどうなるでしょうか
http://somedomain.com/Customer/Update/20/APPL
APPL がID 親である場合
ここで、何らかのボタンをクリックするか、何らかのアクションを実行するとします。これはフィールド_eventによってキャプチャでき、引数$eventによって読み取られます。この変数は GET または POST 経由で送信できます。
http://somedomain.com/Customer/Update/20/APPL?_event=click
注: addPath() と fetchPath() を使用するとモジュールは自動的に取得されるため、指定する必要はありません。ここで、システムがモジュール式で、複数の顧客 (内部顧客、外部顧客など) がいるとします。
$ route = new RouteOne ( ' . ' , null , true ); // true indicates it is modular.
または
$ route = new RouteOne ( ' . ' , null ,[ ' Internal ' ]); // or we determine the module automatically. In this case, every url that starts with Internal
それから
$ route -> fetch ();
$ route -> callObject ( ' somenamespace \ %2s% \ controller \ %1sController ' );
http://somedomain.com/Internal/Customer/Update/20/APPL?_event=click
次に、最初の分岐はモジュールの名前 ( Internal ) であり、クラスsomenamespaceInternalcontrollerCustomerController を呼び出します。
コンポーザーにはeftec/ RouteOneが必要です
Linux:
vendor/bin/ RouteOne cli -init (if the binary does not work, then chage the permission to execution)
Windows:
. v endor b in r outeonecli.bat -init
ファイル .htaccess とファイル Route.php が作成され、route.php はデフォルト設定になります。
const BASEURL = " http://localhost " ; // Base url edit this value.
const BASEWEBNS = " eftec \ controller " ; // Base namespace (web) edit this value
const BASEAPINS = " eftec \ api " ; // Base namespace (api) edit this value
後で、このファイルのコードを追加または編集できます。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
DirectoryIndex route.php
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ route.php?req=$1 [L,QSA]
</IfModule>
Web ホストが FollowSymlinks オプションを許可していない場合は、オプション +SymLinksIfOwnerMatch に置き換えてみてください。
重要な行は次のとおりです。
RewriteRule ^(.*)$route.php?req=$1 [L,QSA] # 呼び出すルーター。
server {
listen 80;
server_name localhost;
root /example.com/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ .php$ {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.(?!well-known).* {
deny all;
}
}
重要な行は次のとおりです。
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
server {
listen 80;
server_name localhost;
root c:/www;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.(?!well-known).* {
deny all;
}
}
重要な行は次のとおりです。
try_files $uri $uri/ /router.php?req=$document_uri&$query_string;
ここで、 router.php はルーターとして機能するファイルです。システムはルートを「req」から読み取るため、?req=$1 は重要です。
// router.php
$ route = new RouteOne (); // Create the RouteOne Class
$ route -> fetch (); // fetch all the input values (from the route, get, post and such).
$ route -> callObject ( ' somenamespace \ controller \ %sController ' ); // where it will call the class somenamespacecontrollerCustomerController
注記:
「req」とは異なる引数を使用したい場合は、次のコードを使用して変更できます。
$route->argumentName='新しい引数';
1.21 以降、事前定義されたパスの代わりにカスタム パスを使用できるようになりました。お勧めの方法です。他の方法はまだ存在します。
構文:
クリアパス()
定義されているすべてのパスをクリアします
構文:
addPath($path, $name = null,callable $middleWare=null)
fetchPath() を使用して評価できるパスを追加します。
例:
$ this -> addPath ( ' api/{controller}/{action}/{id:0} ' , ' apipath ' );
$ this -> addPath ( ' /api/{controller}/{action}/{id:0}/ ' , ' apipath ' ); // "/" at the beginner and end are trimmed.
$ this -> addPath ( ' {controller}/{action}/{id:0} ' , ' webpath ' );
$ this -> addPath ( ' {controller:root}/{action}/{id:0} ' , ' webpath ' ); // root path using default
$ this -> addPath ( ' somepath ' , ' namepath ' ,
function ( callable $ next , $ id = null , $ idparent = null , $ event = null ) {
echo " middleware n" ;
$ result = $ next ( $ id , $ idparent , $ event ); // calling the controller
echo " endmiddleware n" ;
return $ result ;
});
注記:
「{」より前のパスの最初の部分は、どのパスを使用するかを決定するために使用されます。
例「path/{controller}」と「path/{controller}/{id}」、システムはこれらが同じパスであるとみなします。
パラメータ文字列 $path パス、例: 「aaa/{controller}/{action:default}/{id}」
ここで、 default はオプションのデフォルト値です。
パラメータ文字列|null $name (オプション)、パスの名前
パラメータcallable|null $middleWare ミドルウェアに使用される呼び出し可能な関数。
関数の最初の引数は呼び出し可能なメソッドである必要があります
次の引数は、callObjectEx で定義された引数である必要があります。
(ID,ID親,イベント)
パスは静的な場所で開始できますが、パスの残りの部分は変数 ({} で囲み) で定義し、「/」で区切る必要があります。
変数名の後に「:」を記述して、パスのデフォルト値を設定することもできます: {name:defaultvalue}
名前は$this->currentPath を使用して取得できます。同じ名前の名前を追加すると、置き換えられます。
名前を設定しない場合は、自動数値が使用されます。
$this->fetchPath() を呼び出したときにも名前が返されます。
例:
$ this -> addPath ( ' {controller}/{id}/{idparent} ' );
$ this -> addPath ( ' myapi/otherfolder/{controller}/{id}/{idparent} ' );
$ this -> addPath ( ' {controller:defcontroller}/{action:defaction}/{id:1}/{idparent:2} ' );
// url: /dummy/10/20 =>(controller: dummy, id=10, idparent=20)
// url: /myapi/otherfolder/dummy/10/20 =>(controller: dummy, id=10, idparent=20)
さまざまなパスを定義できますが、一部の URL に一致するパスの最初の部分のみが使用されます。 「path/somepath/{id}」は機能しますが、「path/{id}/other」は機能しません
構文:
フェッチパス()
addPath によって以前に定義されたパスを取得し、パスの名前 (または番号) を返します。見つからない場合は false を返します
例:
$ route = new RouteOne ( ' http://www.example.dom ' );
$ route -> addPath ( ' {controller}/{id}/{idparent} ' , ' optionalname ' );
// if the url is : http://www.example.dom/customer/1/200 then it will return
echo $ route -> fetchPath (); // optionalname
echo $ route -> controller ; // customer
echo $ route -> id ; // 1
echo $ route -> idparent ; // 200
クエリ値(URL)を取得します。
注: このクエリには、値「req」、「_event」、および「_extra」は含まれません。
例:
// http://localhost/..../?id=hi
$ id = $ router -> getQuery ( " id " ); // hi
$ nf = $ router -> getQuery ( " something " , " not found " ); // not found
クエリ値を設定します
例:
$ route -> setQuery ( " id " , " hi " );
$ id = $ router -> getQuery ( " id " ); // hi
構文:
フェッチパス()
ルートから値をフェッチし、値が処理されます。
シンタックス
callObjectEx($classStructure, $throwOnError, $method, $methodGet, $methodPost,$arguments,$injectArguments)
オブジェクト (たとえば、Controller オブジェクト) の新しいインスタンスを作成し、メソッドを呼び出します。
注: これは this::callObject() の高度なバージョンです。
このメソッドは、{} を使用して、次の変数に基づいて値を置き換えます。
タグ | 説明 |
---|---|
{コントローラ} | コントローラーの名前 |
{アクション} | 現在のアクション |
{イベント} | 現在のイベント |
{タイプ} | 現在のパスのタイプ (ws、controller、front、api) |
{モジュール} | 現在のモジュール (モジュールがアクティブな場合) |
{id} | 現在のID |
{親ID} | 現在の親 |
{カテゴリ} | 現在のカテゴリー |
{サブカテゴリ} | 現在のサブカテゴリ |
{サブサブカテゴリ} | 現在のサブサブカテゴリ |
例:
// controller example http://somedomain/Customer/Insert/23
$ this -> callObjectEx ( ' cocacolacontroller{controller}Controller ' );
// it calls the method cocacolacontrollerCustomer::InsertAction(23,'','');
// front example: http://somedomain/product/coffee/nescafe/1
$ this -> callObjectEx ( ' cocacolacontroller{category}Controller ' // the class to call
, false // if error then it throw an error
, ' {subcategory} ' // the method to call (get, post or any other method)
, null // the method to call (method get)
, null // the method to call (method post)
,[ ' subsubcategory ' , ' id ' ] // the arguments to call the method
,[ ' arg1 ' , ' arg2 ' ]); // arguments that will be passed to the constructor of the instance
// it calls the method cocacolacontrollerproduct::coffee('nescafe','1');
現在のルートを使用してオブジェクト内のメソッドを呼び出します。
例:
ルーター:
$ databaseService = new SomeDatabaseService ();
$ route = new RouteOne ();
$ route -> callObjectEx ( ' cocacolacontroller{controller}Controller ' // the class to call
, false // if error then it throw an error
, ' {action}Action ' // the method to call (get, post or any other method)
, ' {action}Action{verb} ' // the method to call (method get)
, ' {action}Action{verb} ' // the method to call (method post)
,[ ' id ' , ' idparent ' , ' event ' ] // the arguments to call the method
,[ $ databaseService , $ route ]); // (optional)arguments that will be passed to the constructor of the instance
コントローラ:
namespace cocacola controller ;
class CustomerController {
protected $ databaseService ;
protected $ route ;
public function __construct ( $ databaseService , $ route ) {
// optional: injecting services
$ this -> databaseService = $ databaseService ;
$ this -> route = $ route ;
}
// any action GET or POST
public function GreenAction ( $ id = "" , $ idparent = "" , $ event = "" ) {
}
// GET only action (optional)
public function BlueActionGET ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
// POST only action (optional)
public function YellowActionPOST ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
// GET only action (optional)
public function RedActionGET ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
// any action GET or POST
public function RedAction ( $ id = "" , $ idparent = "" , $ event = "" ) {
// **my code goes here.**
}
}
結果:
URL | 呼び出されるメソッド |
---|---|
http://localhost/Customer/Green (GET) | グリーンアクション |
http://localhost/Customer/Green/20/30?_event=クリック(GET) | GreenAction($id=20, $idparent=30, $event='click') |
http://localhost/Customer/Green (POST) | グリーンアクション |
http://localhost/Customer/Blue (GET) | ブルーアクションGET |
http://localhost/Customer/Blue (POST) | エラー |
http://localhost/Customer/Yellow (GET) | エラー |
http://localhost/Customer/Yellow (POST) | 黄色アクションPOST |
http://localhost/Customer/Red (GET) | RedActionGET (RedActionより優先) |
http://localhost/Customer/Red (POST) | レッドアクション |
http://localhost/Customer/Orange | エラー |
コントローラーの現在の名前を使用してphpファイルを呼び出します(インクルードします)。
構文:
getHeader($key, $valueIfNotFound = null)
現在のヘッダー (存在する場合) を取得します。値が見つからない場合は、$valueIfNotFound を返します。 $key は常に大文字に変換されることに注意してください。
例:
$ token = $ this -> getHeader ( ' token ' , ' TOKEN NOT FOUND ' );
構文:
getBody($jsonDeserialize = false, $asAssociative = true)
リクエストの本文を取得します。
例:
$ body = $ this -> getBody (); // '{"id"=>1,"name"=>john}' (as string)
$ body = $ this -> getBody ( true ); // stdClass {id=>1,name=>john}
$ body = $ this -> getBody ( true , true ); // ["id"=>1,"name"=>john]
スペース、パラメータ、クエリを省略して、現在のベース URL を返します。
注: この関数は $_SERVER['SERVER_NAME'] に依存しており、エンドユーザーによって変更される可能性があります。
現在のサーバーを末尾のスラッシュなしで返します。
$ route -> getCurrentServer (); // http://somedomain
現在のサーバー名を設定します。 getCurrentUrl() および getCurrentServer() によって使用されます。
注: $this->setCurrentServer() が設定されていない場合は、$_SERVER['SERVER_NAME'] が使用され、ユーザーによって変更される可能性があります。
$ route -> setCurrentServer ( ' localhost ' );
$ route -> setCurrentServer ( ' 127.0.0.1 ' );
$ route -> setCurrentServer ( ' domain.dom ' );
クラス内の情報に基づいて (完全な) URL を取得します。
$ route -> getUrl (); // http://somedomain/controller/action/id
$ route -> getUrl ( ' id=20 ' ); // http://somedomain/controller/action/id?id=20
$ route -> getUrl ( ' id=20 ' , true ); // http://somedomain/controller/action/id?id=20&field=20&field2=40
カスタム値に基づいて URL を構築します
$ route -> url ( null , " Customer " , " Update " , 20 ); // Customer/Update/20
カスタム値に基づいて URL (フロント) を構築します
$ route -> url ( null , " Daily " , " Milk " , 20 ); // Daily/Milk/20
サブドメインが空であるか、www と異なる場合は、www.domain.com にリダイレクトされます。
注: localhost、TLD のないドメイン (netbios)、または IP ドメインでは機能しません。それはわざとです。
注: このコードをリダイレクトする必要がある場合は、コードの実行が停止されます。通常、コードの先頭で呼び出す必要があります
$ route -> alwaysWWW (); // if the domain is somedomain.dom/url, then it redirects to www.somedomain.dom/url
$ route -> alwaysWWW ( true ); // if the domain is http: somedomain.dom/url, then it redirects to https: www.somedomain.dom/url
ページが http としてロードされている場合は、https にリダイレクトされます。
注: localhost、TLD のないドメイン (netbios)、または IP ドメインでは機能しません。それはわざとです。
注: このコードをリダイレクトする必要がある場合は、コードの実行が停止されます。通常、コードの先頭で呼び出す必要があります
$ route -> alwaysHTTPS (); // http://somedomain.com ---> https://somedomain.com
$ route -> alwaysHTTPS (); // http://localhost ---> // http://localhost
$ route -> alwaysHTTPS (); // http://127.0.0.1 ---> // http://127.0.0.1
$ route -> alwaysHTTPS (); // http://mypc ---> // http://mypc
サブドメインが www (例: www.domain.dom) の場合、ネイキッド ドメイン (domain.dom) にリダイレクトされます。
注: localhost、TLD のないドメイン (netbios)、または IP ドメインでは機能しません。それはわざとです。
注: このコードをリダイレクトする必要がある場合は、コードの実行が停止されます。通常、コードの先頭で呼び出す必要があります
$ route -> alwaysNakedDomain (); // if the domain is www.somedomain.dom/url, then it redirects to somedomain.dom/url
$ route -> alwaysNakedDomain ( true ); // if the domain is http: www.somedomain.dom/url, then it redirects to https: somedomain.dom/url
分野 | パス | 説明 | 例 |
---|---|---|---|
$引数名 | Apache .Htaccess および nginx で使用される引数の名前 | $this-argumentName='req'; | |
$base | ベースURLです。 | $this->base=0; | |
$type | URLのタイプです(api、ws、controllerまたはfront) | echo $this->type; // API | |
$モジュール | {モジュール} | 現在のモジュールです | エコー $this->module; |
$コントローラー | {コントローラ} | それはコントローラーです。 | echo $this->controller; |
$アクション | {アクション} | それはアクションです。 | $this->action をエコー; |
$id | {id} | それは識別子です | echo $this->id; |
$イベント | {イベント} | それはイベントです(「ボタンをクリックするなど)」。 | echo$this->イベント; |
$idparent | {親ID} | 現在の親 ID (存在する場合) | echo $this->idparent; |
$extra | {余分な} | それはイベントです(「ボタンをクリックするなど)」 | echo $this->extra; |
$カテゴリ | {カテゴリ} | 現在のカテゴリ。 「フロント」タイプに便利です | echo $this->category; |
$サブカテゴリ | {サブカテゴリ} | 現在のサブカテゴリ。 「フロント」タイプに便利です | $this->サブカテゴリをエコー; |
$サブサブカテゴリ | {サブサブカテゴリ} | 現在のサブサブカテゴリ。 「フロント」タイプに便利です | echo $this->subsubcategory; |
$識別 | これは、API と WS ルートの識別に役立つ連想配列です。 | $this->identify=['api'=>'apiurl','ws'=>'webservices','controller'=>'']; | |
$isPostBack | ページが POST の場合は true、それ以外の場合は false。 | if ($this->isPostBack) { ... }; | |
$動詞 | {動詞} | 現在の動詞は、GET、POST、PUT、DELETE の可能性があります。 | if ($this->verb) { ... }; |
例:
$ this -> addPath ( ' portal/web/{controller}/{action:list} ' );
$ this -> fetchPath ();
var_dump ( $ this -action); // it shows the current action or the default value "list" if none.
分野 | 説明 | 例 |
---|---|---|
$allowed動詞 | 許可される動詞のリスト | $this->allowedVerbs=['GET', 'POST', 'PUT', 'DELETE']; |
$allowedFields | callObjectEx()で使用される許可されたフィールドのリスト | $this->allowedFields=['コントローラー', 'アクション', '動詞', 'イベント', 'タイプ', 'モジュール', 'id' , 'idparent','category', 'subcategory', 'subsubcategory']; |
setWhitelist() | ホワイトリストを含む連想配列をコントローラー、アクション、カテゴリー、サブカテゴリー、サブサブカテゴリー、およびモジュールに設定します。 設定されていない場合 (デフォルト値は null)、任意のエントリが許可されます。 現在、コントローラーとカテゴリでのみ機能します | $this->setWhitelist('コントローラー','購入','請求書','顧客'); $this->setWhitelist('controller',null) // 任意のコントローラーを許可します。 |
メソッドをホワイトリストに登録すると、次の 2 つの操作が可能になります。
例えば:
// Example, value not in the whitelist: someweb.dom/customer/list
$ this -> setWhiteList ( ' controller ' ,[ ' Product ' , ' Client ' ]);
$ this -> fetch ();
var_dump ( $ this -> controller ); // null or the default value
var_dump ( $ this -> notAllowed ); // true (whitelist error)
// Example, value in the whitelist but with the wrong case: someweb.dom/customer/list
$ this -> setWhiteList ( ' controller ' ,[ ' Customer ' ]);
$ this -> fetch ();
var_dump ( $ this -> controller ); // it shows "Customer" instead of "customer"
var_dump ( $ this -> notAllowed ); // false (not error with the validation of the whitelist)
// reset whitelist for controllers
$ this -> setWhiteList ( ' controller ' , null );
RouteOne構成を作成および初期化するための基本的な CLI が含まれています。バイナリRouteOne cli は、vendor/bin フォルダーにあります。
./vendor/bin/ RouteOne cli
ルーターを入力し、Enterを押します。
ルーターのメニューに次の画面が表示されます。
保留中は、操作の実行が保留中であるか、何か構成する必要があることを意味します。
完了すると、configure は「ok」としてマークされます。
次に、パスを設定しましょう