邪魔にならないようにしようとする適応可能なマイクロPHPフレームワーク。
非常に多くの作業が進行中です、あなた自身の責任で使用してください...
死の確実性。成功のほんの可能性。何を待っていますか?
composer require danc0/gimliduck-php
composer create-project danc0/gimli-skeletonを使用して、スケルトンプロジェクトを作成します
composer require --dev danc0/gimliduck-devtools
index.phpファイルにリクエストをポイントするために、このようなものに見える.htaccessファイルを作成します
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Gimliduckアプリケーションの作成は簡単です:
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use Gimli Application ;
use Gimli Router Route ;
Application:: create ( __DIR__ , $ _SERVER );
Route:: get ( ' / ' , function (){
echo " Hello World " ;
});
Application:: start ();それは本当にあなたが始めるために必要なすべてです。テンプレートエンジン、構成ファイルなどのように追加することはできますが、そうする必要はありません。
<?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use Gimli Application ;
use App Core Config ;
use App Core Cache ;
define ( ' APP_ROOT ' , __DIR__ );
$ App = Application:: create ( APP_ROOT , $ _SERVER );
// set up your config and add it to the Application
$ config_file = parse_ini_file ( APP_ROOT . ' /App/Core/config.ini ' , true );
$ App -> Config = $ App -> Injector -> resolveFresh (Config::class, [ ' config ' => $ config_file ]);
// Register a cache class with the Injector
$ App -> Injector -> register (Cache::class, Cache:: getCache ( $ App -> Config -> admin_cache ));
// Run Application
$ App -> run (); Applicationクラスは、作成されたときに基本的なイベントハンドラーとセッションクラスも登録します。さらに、構成がenable_latteが含まれている場合、テンプレートディレクトリとしてtemplate_base_dirの構成値を使用して、ラテテンプレートエンジンがアプリケーションインスタンスに追加されます。
デフォルトでは、GimliはApp/Routesディレクトリ内のファイルを必要とします。 Configファイルでautoload_routes falseに設定することで、これを無効にできます。 Configファイルにroute_directoryの値を設定することにより、ディレクトリを変更できます。また、次の方法で追加のルートファイルをロードすることもできます。
// Load routes from a file(s)
$ App -> loadRouteFiles ([
' App/routes/web.php ' ,
]);ルートコールバックでできることがいくつかあります...文字列、呼び出し可能、または配列を渡します。
Route::get( ' / ' , function (){
echo " Hello World "
});
// Single action controller, must use __invoke method
Route:: get ( ' / ' , Home_Controller::class);
// cli routes are single action Job classes
Route:: cli ( ' build-cache ' , Cache_Job::class);
Route:: get ( ' / ' , Home_Controller::class . ' @homePage ' );
Route:: get ( ' / ' , [Home_Controller::class, ' homePage ' ]);それらの仕事のいずれか、それはあなたがそれをする方法です。
追加の防御が必要な場合は、ミドルウェアを追加できます
Route:: get ( ' / ' , [Home_Controller::class, ' homePage ' ])-> addMiddleware (Logged_In_Middleware::class);これはGimliMiddlewareMiddleware_Response GimliMiddlewareMiddleware_Interfaceを実装するクラスである必要がありますprocessミドルウェアは、インジェクターなどのアプリケーションインスタンスにアクセスして、設定することにしました。
また、グループを追加したり、ロードする必要のあるデフォルトのルートファイルを定義したり、ルートファイルをロードしてルートを整理したりすることもできます。
ルートには、次のパターンを満たす可変引数も含めることができます。
protected array $ patterns = [
' :all ' => " ([^/]+) " ,
' :alpha ' => " ([A-Za-z_-]+) " ,
' :alphanumeric ' => " ([w-]+) " ,
' :integer ' => " ([0-9_-]+) " ,
' :numeric ' => " ([0-9_-.]+) " ,
' :id ' => " ([0-9_-]+) " ,
' :slug ' => " ([A-Za-z0-9_-]+) " ,
];ルート定義の#シンボルを使用して、変数名を追加する必要があります。
Route:: get ( ' /user/:integer#id ' , [User_Controller::class, ' getUser ' ]);この変数名はルーターに渡され、コントローラーメソッドの依存関係として設定されます。定義された変数名をコントローラーメソッドの引数として使用する必要があります。値は、使用可能なタイプのsettypeタイプ、可能なタイプに基づいてタイプキャストされます。
integer or int
float or double
string
array
object
boolean or bool
コントローラーの例:
public function getUser ( Response $ Response , int $ id ): Response {
// do something with $id
}コントローラーはGimliHttpResponseオブジェクトを返す必要があります。フォーマットされたResponseオブジェクトを返すヘルパーメソッドがあり、条件付きロジックを制限するのに役立ちます。
response基本的な応答redirectリダイレクト応答redirect_on_success応答が成功した場合はリダイレクトしますredirect_on_failure応答が成功しない場合はリダイレクトしますjson_response JSON応答ジョブファイルには、以下の引数、 subcommand 、 options 、およびflagsも与えられます。 options引数は、名前と値を含む配列の配列です。 flags引数は、指定されたフラグを持つ配列です。 subcommand引数は、サブコマンドが与えられた場合、単なる文字列です。
ビルトインインジェクターを使用して、依存関係をバインドまたは登録できます。インジェクターからの依存関係を解決することもできます。必要なものはすべてインジェクターに追加し、 Applicationインスタンスを介してアプリケーション全体にアクセスできます。
組み込まれたインジェクターは、クラスを自動化し、必要に応じて依存関係を解決します。クラスを返す前にセットアップを行う必要がある場合、または既に作成されたオブジェクトを登録する必要がある場合は、クラスを閉鎖にバインドすることもできます。以下の例は、ルータークラスから解決される単一のアクションコントローラーを示しています。 __constructメソッドパラメーターは、インジェクターから解決されます。
<?php
declare (strict_types= 1 );
namespace App Controllers ;
use App Logic Dashboard_Logic ;
use Gimli Http Response ;
use Gimli Application ;
use Gimli View Latte_Engine ;
class Dashboard_Landing_Controller {
/**
* Constructor
*
* @param Application $Application
*/
public function __construct (
public Application $ Application ,
protected Dashboard_Logic $ Dashboard_Logic ,
protected Latte_Engine $ View
){
//
}
/**
* Single action controller call
*
* @return Response
*/
public function __invoke ( Response $ Response ): Response {
$ template_data = $ this -> Dashboard_Logic -> getTemplateData ();
return $ Response -> setResponse ( $ this -> View -> render ( ' dashboard/dashboard.latte ' , $ template_data ));
}
}メソッドパラメーターは、ルートがメソッドを発送するときにインジェクターによって解決されます。
インジェクターヘルパーメソッドもあり、いくつかのインラインコードを削減します。通常、クラスをインラインで挿入したい場合は$this->Application->Injector->resolve(Some_Class::class)またはApplication::get()->Injector->resolve(Some_Class::class)で実行できます。メソッドのresolveとresolve_fresh 、そのインラインコードをカットするために利用できます。
基本的なPDOラッパーDatabaseと、データベースクエリの管理に使用できるPdo_Managerクラスがあります。 Pdo_ManagerクラスはPDOの返品とインスタンスを使用して、クエリを直接実行するために使用できます。 Databaseクラスは、 Pdo_Managerクラスをめぐるラッパーであり、いくつかの基本的なクエリメソッドを提供します。また、非常に基本的なModelベースクラスとDatabase用の追加のヘルパーメソッドもあります。他の場所では、これらの方法が依存関係の注入を処理し、注入されたDatabaseクラスのメソッドを呼び出します。ヘルパーは次のとおりです。
fetch_columnfetch_rowfetch_allrow_existsデータベースのシードに使用できる基本的なシーダークラスがあります。これは、モデルクラスに配置された属性に依存して、データの作成方法をSeederに指示します。
<?php
declare (strict_types= 1 );
namespace Gimli Database ;
use Gimli Database Model ;
use Gimli Database Seed ;
class User_Model extends Model {
/**
* @var string $table_name
*/
protected string $ table_name = ' users ' ;
/**
* ID
*
* @var int $id
*/
public $ id ;
/**
* Unique_Id
*
* @var string $unique_id
*/
#[Seed(type: ' unique_id ' , args: [ ' length ' => 12 ])]
public $ unique_id ;
/**
* Username
*
* @var string $username
*/
#[Seed(type: ' username ' )]
public $ username ;
/**
* Email
*
* @var string $email
*/
#[Seed(type: ' email ' )]
public $ email ;
/**
* Password
*
* @var string $password
*/
#[Seed(type: ' password ' )]
public $ password ;
/**
* Is_Active
*
* @var int $is_active
*/
#[Seed(type: ' tiny_int ' )]
public $ is_active ;
/**
* First Name
*
* @var string $first_name
*/
#[Seed(type: ' first_name ' )]
public $ first_name ;
/**
* Last Name
*
* @var string $last_name
*/
#[Seed(type: ' last_name ' )]
public $ last_name ;
/**
* Status
*
* @var int $status
*/
#[Seed(type: ' one_of ' , args: [ 0 , 1 ])]
public $ status ;
/**
* Created_At
*
* @var string $created_at
*/
#[Seed(type: ' date ' , args: [ ' format ' => ' Y-m-d H:i:s ' , ' min ' => ' 2021-01-01 ' , ' max ' => ' 2021-04-01 00:00:00 ' ])]
public $ created_at ;
/**
* Updated_At
*
* @var string $updated_at
*/
#[Seed(type: ' date ' , args: [ ' format ' => ' Y-m-d H:i:s ' , ' min ' => ' 2021-04-01 00:02:00 ' ])]
public $ updated_at ;
/**
* bio
*
* @var string $about
*/
#[Seed(type: ' paragraph ' , args: [ ' count ' => 1 ])]
public $ about ;
}次に、次のコードでデータベースをシードできます。
Seeder:: make (User_Model::class)
-> seed ( 123 )
-> count ( 1 )
-> create ();作成する代わりに、 getSeededDataを呼び出してデータベースに挿入されるデータを取得できます。これは、モデルを保存せずにテストまたは手動でロードするのに役立ちます。また、初期モデルのデータが与えられるコールバックメソッドを渡すこともできます。これは、関連データをシードするのに役立ちます。コールバックは、 Seederインスタンスの配列を返す必要があります。
Seeder:: make (User_Model::class)
-> seed ( 123 )
-> count ( 1 )
-> callback ( function ( $ data ) {
return [
Seeder:: make (User_Hobby_Model::class)-> with ([ ' user_id ' => $ data [ ' id ' ]]),
Seeder:: make (User_Group_Model::class)-> with ([ ' user_id ' => $ data [ ' id ' ]]),
]
})
-> create ();通過したシードは、シーダーが実行されるたびにデータが同じままであることを保証し、その結果、再現可能なデータセットになります。 Seederクラスには、ランダムシード値を返すgetRandomSeedメソッドがあります。これは、再現可能である必要のないランダムデータを作成したり、コピーして使用できるランダムシードを生成するのに役立ちます。
いくつかの構成ヘルパーもあります:
get_config構成配列全体を取得しますget_config_value構成配列から特定の値を取得するconfig_has config配列にキーが存在するかどうかを確認する