框架Github地址:github.com/Orlion/Minor
(如果覺得還不錯給個star)
- MVC分層結構(實際上是沒有Model層的,用戶可以自己任意創建)
- Ioc(體現在Minor中就是類似於symfony/laravel的服務容器)
- Event(類似於symfony/laravel中的事件機制,是一個觀察者模式的具體實現)
- Proxy(代理,是一個代理模式的具體實現,本人在創造Minor時是想實現類似Spring的AOP功能的,但是在寫的時候發現如果要實現AOP則配置文件勢必會變得冗雜,不利於開發所以就放棄了AOP,而提供了一個Proxy類)
- 符合PSR4
現在的PHP框架大多很臃腫,提供了各種功能,在本人看來這只是在重復造輪子(雖然寫框架也是在重復造輪子...),框架只需要提供給用戶一個架子和一些工具即可,不應該給用戶一大堆東西(一大堆重復造的輪子),不應該捆綁用戶而應該給用戶極大自由,這樣也會使用戶更容易上手。個人覺得java的Spring框架就是一個很不錯的框架,足夠簡單,足夠強大,小即是美!而Minor就是在這種思想下誕生的框架。沒有各種亂七八糟的分頁、ORM、模板引擎、日志、隊列等功能,就是一個很純粹的“架子”。
快! 性能高! 簡單! 容易上手! 結構清晰!
小即是美!
只需從github上(github.com/Orlion/Minor) git clone或者直接復制zip壓縮包然后解壓到項目中即可。
Minor框架通過設置 public/.htaccess
文件去除鏈接中的index.php
。 如果你你的服務器使用的是 Apache,請確保開啟 mod_rewrite
模塊。
如果是 Nginx 服務器,將下列指令放到網址的配置文件中:
location / { try_files $uri $uri/ /index.php?$query_string; }
下面是我的配置:
server{ listen 80; server_name www.minor.com; root html/minor/public; location / { index index.php; try_files $uri $uri/ /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; } }
這樣當你訪問http://localhost/public/時就可以看到安裝成功的畫面了。 (當然你也可以配置一下把public去掉)
以訪問網址http://www.servername.com/demo/test為例:
- 所有請求重定向到public/index.php文件
- 定義全局變量
define('APP_DIR', realpath(__DIR__.'/../app/') .DIRECTORY_SEPARATOR); define('PUBLIC_DIR', realpath(__DIR__) .DIRECTORY_SEPARATOR); define('VENDOR_DIR', realpath(__DIR__.'/../vendor/') .DIRECTORY_SEPARATOR); define('ROOT_DIR', realpath(__DIR__.'/../') .DIRECTORY_SEPARATOR);
- 根據配置文件來創建App對象:$app
$app = \Minor\Framework\App::getInstance( $config = ['app' => require APP_DIR . 'Config/app.php', 'test' => require APP_DIR . 'Config/test.php'], $providers = require APP_DIR . 'Config/providers.php', $routes = require APP_DIR . 'Config/routes.php', $events = require APP_DIR . 'Config/events.php' );
- App處理請求生成MinorResponse對象
$response = $app->handle( $request = \Minor\HttpKernel\MinorRequestBuilder::buildMinorRequest() );
- 向用戶返回響應
$response->send();
public function handle(MinorRequest $minorRequest) { $minorResponse = MinorResponse::getInstance(); $this->minorRequest = $minorRequest; list($controllerName, $actionName, $params) = $this->router->dispatcher($minorRequest->getUrl()); if (!($controllerName && $actionName && is_array($params))) { if (!Config::get(['app' => 'DEBUG']) && ($handler = Config::get(['app' => '404_HANDLER'])) && ($handler instanceof \Closure)) { $handler($minorRequest->getRequestUrl()); } else { throw new RouteException('404 Not Found'); } } else { $minorResponse = $this->invoke($controllerName, $actionName, $params); } return $minorResponse; }
- 先初始化一個默認的響應對象
$minorResponse = MinorResponse::getInstance();
- 調用Router的dispatcher($url)方法根據路由配置獲取url對應的控制器和方法以及參數
list($controllerName, $actionName, $params) = $this->router->dispatcher($minorRequest->getUrl());
- 執行控制器的制定方法,並返回響應對象
$minorResponse = $this->invoke($controllerName, $actionName, $params); return $minorResponse;
有時你需要在程序執行階段訪問配置的值。你可以使用 Config
類:
Config::get(['app' => 'TIMEZONE']);
這樣你就可以獲取app/Config/app.php配置文件中TIMEZONE的配置項值。(請注意,這里不一定是app.php,請觀察本文1.4.1中的步驟3中可以看到在構建$app這個對象時傳了一個參數:$config = ['app' => require APP_DIR . 'Config/app.php' ...)
在這里'app' 指向了app/Config/app.php文件,當然你也可以指向其他文件(eg: app_dev.php)這樣再當你執行Config::get(['app' => 'TIMEZONE'])時就會從app_dev.php文件中獲取TIMEZONE這個配置項的值了)。
你也可以指定一個默認值,如果配置選項不存在它將被返回:
Config::get(['app' => 'TIMEZONE'], 'UTC');
注意“['xxx' => 'xxx']”語法風格可以用於訪問不同文件里的值,你也可以在程序執行階段設置配置的值:
Config::set(['test' => 'key'], 'value');
一些常用的應用配置,你也可以添加自己的配置項。
'CHARSET' => 'UTF-8', // 設置charset 'TIMEZONE' => 'PRC', //設置時區 'SESSION_START' => true, // 設置是否自動開啟session,當開啟后就可以從MinorRequest對象中通過getMinorSession()方法獲取當前session對象 'DEBUG' => true, // 設置是否開啟DEBUG模式,如果開啟則程序中發生的錯誤就會全部顯示出來,如果設置為false或者不設置則當發生錯誤或異常時就會執行以下的全局錯誤處理函數和全局異常處理函數。
當DEBUG為false並且應用拋出異常時就會執行配置的這個匿名函數,你可以在這個函數里做任何操作,比如向管理員發送通知郵件或者記錄日志等等
'EXCEPTION_HANDLER' => function($e){ header('HTTP/1.1 500 Internal Server Error'); exit(require APP_DIR . 'View/exception.php'); },
當DEBUG為false並且應用發生語法錯誤時就會執行配置的這個匿名函數,你可以在這個函數里做任何操作,比如向管理員發送通知郵件或者記錄日志等等
'ERROR_HANDLER' => function($errno, $errstr, $errfile, $errline){ header('HTTP/1.1 500 Internal Server Error'); exit(require APP_DIR . 'View/error.php'); },
當DEBUG為false並且應用沒有匹配到響應的路由時就會執行這個匿名函數,你可以在這個函數里顯示一個404頁面。
'404_HANDLER' => function($url){ header('HTTP/1.1 404 Not Found'); header("status: 404 Not Found"); exit(require APP_DIR . 'View/404.php'); },
當通過$minorRequest->get('param_name'))獲取get參數或者通過$minorRequest->post('param_name')時,框架會自動調用這個函數對$_GET['param_name']或者$_POST['param_name']做處理后返回
'DEFAULT_FILTER' => function($param){ return htmlspecialchars($param); },
1.6 請忽視以上吹牛逼字段
恩!就是請忽視。別怪我沒提醒