1.1 Minor是什么
框架Github地址:github.com/Orlion/Minor
(如果觉得还不错给个star)
1.2 Minor有什么
1.2.1 Minor主要提供了
- MVC分层结构(实际上是没有Model层的,用户可以自己任意创建)
- Ioc(体现在Minor中就是类似于symfony/laravel的服务容器)
- Event(类似于symfony/laravel中的事件机制,是一个观察者模式的具体实现)
- Proxy(代理,是一个代理模式的具体实现,本人在创造Minor时是想实现类似Spring的AOP功能的,但是在写的时候发现如果要实现AOP则配置文件势必会变得冗杂,不利于开发所以就放弃了AOP,而提供了一个Proxy类)
- 符合PSR4
1.2.2 Minor为什么只提供了这么点东西?
现在的PHP框架大多很臃肿,提供了各种功能,在本人看来这只是在重复造*(虽然写框架也是在重复造*...),框架只需要提供给用户一个架子和一些工具即可,不应该给用户一大堆东西(一大堆重复造的*),不应该捆绑用户而应该给用户极大*,这样也会使用户更容易上手。个人觉得java的Spring框架就是一个很不错的框架,足够简单,足够强大,小即是美!而Minor就是在这种思想下诞生的框架。没有各种乱七八糟的分页、ORM、模板引擎、日志、队列等功能,就是一个很纯粹的“架子”。
1.2.3 优点
快! 性能高! 简单! 容易上手! 结构清晰!
小即是美!
1.3 安装
只需从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 ;
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:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
这样当你访问http://localhost/public/时就可以看到安装成功的画面了。 (当然你也可以配置一下把public去掉)
1.4 Minor是如何运转的
1.4.1 整体流程
以访问网址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();
1.4.2 App是如何处理请求的
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;
1.5 配置
1.5.1 读取与设置配置
有时你需要在程序执行阶段访问配置的值。你可以使用 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');
1.5.2 配置项
1.5.2.1 应用配置
一些常用的应用配置,你也可以添加自己的配置项。
'CHARSET' => 'UTF-8', // 设置charset 'TIMEZONE' => 'PRC', //设置时区 'SESSION_START' => true, // 设置是否自动开启session,当开启后就可以从MinorRequest对象中通过getMinorSession()方法获取当前session对象 'DEBUG' => true, // 设置是否开启DEBUG模式,如果开启则程序中发生的错误就会全部显示出来,如果设置为false或者不设置则当发生错误或异常时就会执行以下的全局错误处理函数和全局异常处理函数。
1.5.2.2 全局异常处理
当DEBUG为false并且应用抛出异常时就会执行配置的这个匿名函数,你可以在这个函数里做任何操作,比如向管理员发送通知邮件或者记录日志等等
'EXCEPTION_HANDLER' => function($e){
header('HTTP/1.1 500 Internal Server Error');
exit(require APP_DIR . 'View/exception.php');
},
1.5.2.3 全局错误处理
当DEBUG为false并且应用发生语法错误时就会执行配置的这个匿名函数,你可以在这个函数里做任何操作,比如向管理员发送通知邮件或者记录日志等等
'ERROR_HANDLER' => function($errno, $errstr, $errfile, $errline){
header('HTTP/1.1 500 Internal Server Error');
exit(require APP_DIR . 'View/error.php');
},
1.5.2.4 404处理
当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');
},
1.5.2.5 变量过滤器
当通过$minorRequest->get('param_name'))获取get参数或者通过$minorRequest->post('param_name')时,框架会自动调用这个函数对$_GET['param_name']或者$_POST['param_name']做处理后返回
'DEFAULT_FILTER' => function($param){
return htmlspecialchars($param);
},
1.6 请忽视以上吹牛逼字段
恩!就是请忽视。别怪我没提醒