一個適應性的微型PHP框架,試圖遠離您的方式。
正在進行的工作非常多,以您自己的風險使用...
死亡的確定性。成功的機會很小。我們還在等什麼?
composer require danc0/gimliduck-php
創建一個帶有以下骨骼項目: composer create-project danc0/gimli-skeleton
將DevTools與composer require --dev danc0/gimliduck-devtools添加
創建一個.htaccess文件,看起來像這樣可以將請求指向您的index.php文件
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目錄中的任何文件。您可以通過在配置文件中的autoload_routes設置為false來禁用此功能。您可以通過在配置文件中設置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_Interface的類,該 Middleware_interface需要一種返回GimliMiddlewareMiddleware_Response 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如果響應成功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 Array中是否存在密鑰