1.1 Minor是什么

  框架Github地址:github.com/Orlion/Minor

  (如果觉得还不错给个star)

  

1.2 Minor有什么

  1.2.1 Minor主要提供了

  1. MVC分层结构(实际上是没有Model层的,用户可以自己任意创建)
  2. Ioc(体现在Minor中就是类似于symfony/laravel的服务容器)
  3. Event(类似于symfony/laravel中的事件机制,是一个观察者模式的具体实现)
  4. Proxy(代理,是一个代理模式的具体实现,本人在创造Minor时是想实现类似Spring的AOP功能的,但是在写的时候发现如果要实现AOP则配置文件势必会变得冗杂,不利于开发所以就放弃了AOP,而提供了一个Proxy类)
  5. 符合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为例:

  1. 所有请求重定向到public/index.php文件
  2. 定义全局变量
    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);
  3. 根据配置文件来创建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'
    );
  4. App处理请求生成MinorResponse对象
    $response = $app->handle(
    $request = \Minor\HttpKernel\MinorRequestBuilder::buildMinorRequest()
    );
  5. 向用户返回响应
    $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;
}
  1. 先初始化一个默认的响应对象

    $minorResponse = MinorResponse::getInstance();
  2. 调用Router的dispatcher($url)方法根据路由配置获取url对应的控制器和方法以及参数
    list($controllerName, $actionName, $params) = $this->router->dispatcher($minorRequest->getUrl());
  3. 执行控制器的制定方法,并返回响应对象
    $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 请忽视以上吹牛逼字段

  恩!就是请忽视。别怪我没提醒

  

Minor【 PHP框架】1.简介的更多相关文章

  1. DWZ富客户端框架+DWZ简介及其使用+DWZ讨论组

    DWZ富客户端框架+DWZ简介及其使用+DWZ讨论组 地址: DWZ富客户端框架:http://jui.org/#_blank DWZ简介及其使用:http://blog.sina.com.cn/s/ ...

  2. 从零开始写一个武侠冒险游戏-0-开发框架Codea简介

    从零开始写一个武侠冒险游戏-0-开发框架Codea简介 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.03 增加对 XCode 项目文件的说明. 概述 本游戏全 ...

  3. Twitter的RPC框架Finagle简介

    Twitter的RPC框架Finagle简介 http://www.infoq.com/cn/news/2014/05/twitter-finagle-intro

  4. android hook 框架 libinject2 简介、编译、运行

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  5. 自制简单的.Net ORM框架 (一) 简介

    在自己研究ORM之前,也使用过几个成熟的ORM方案,例如:EntityFramework,PetaPoco,Dapper 等,用是很好用,但是对自己来说总是不那么方便,EF比较笨重,Dapper要自定 ...

  6. 河北省重大技术需求征集系统原型(MVC框架业务流程简介)

    这段时间了解了一些MVC框架. 一.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式.它的模式是JSP + se ...

  7. Xposed 框架 hook 简介 原理 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. 国内优秀MVC开源框架jfinal简介

    JFinal简介 JFinal 项目开发始于2011年初,作者詹波(James Zhan)曾任搜格信息技术有限公司Java架构师,北京信息管理科学研究所CTO,现任微格网际(北京)科技有限公司联合创始 ...

  9. 前端测试框架jest 简介

    转自: https://www.cnblogs.com/Wolfmanlq/p/8012847.html 作者:Ken Wang 出处:http://www.cnblogs.com/Wolfmanlq ...

  10. Spring.NET依赖注入框架学习--简介

    Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...

随机推荐

  1. accept_mutex与性能的关系 (nginx)

    注:运行环境CentOS 6+   背景      在对启动了20个worker的nginx进行压力测试的时候发现:如果把配置文件中event配置块中的accept_mutex开关打开(1.11.3版 ...

  2. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  3. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  4. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  5. 前端学HTTP之日志记录

    前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...

  6. ASP.NET Core project.json imports 是什么意思?

    示例代码: "frameworks": { "netcoreapp1.0.0": { "imports" : "portable- ...

  7. Spring resource bundle多语言,单引号format异常

    Spring resource bundle多语言,单引号format异常 前言 十一假期被通知出现大bug,然后发现是多语言翻译问题.法语中有很多单引号,单引号在format的时候出现无法匹配问题. ...

  8. CentOS 7 安装出现 /dev/root does not exits 导致无法安装的问题

    本人在官网下的是这个 CentOS-7-x86_64-DVD-1611.iso ,然后用UltraISO 9.6制作的U盘启动盘,不过在安装的时候出现了这个错误, 然后也是搜了好久,试了一下,下面这个 ...

  9. 怎样在Dos里切换盘符

    一:在Dos里切换盘符 a:在电脑左下角右击显示图片;(我用的是win10系统,其他系统类似) b:点击运行,输入cmd; c:点击确定: d:输入盘符:(如f:) 或F: 只写字母,不写分号是不行的 ...

  10. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...