迷你php搭建,迷你框架的建立

摘要:<?php

/**

* 路由解析类

* 1.路由解析

* 2.请求分发

*/

namespace pig;

class Route

{

//路由信

protected $route =&nbs<?php

/**

* 路由解析类

* 1.路由解析

* 2.请求分发

*/

namespace pig;

class Route

{

//路由信

protected $route = [];

//pathinfo

//public $pathInfo = [];

protected $pathInfo = [];

//URL参数

//public $params = [];

protected $params = [];

//构造方法

public function __construct($route)

{

$this->route = $route;

}

//解析路由

public function parse($queryStr='')

{

/**

*   /admin/user/add/name/peter/age/30

*   $this->pathInfo=['module'=>'admin','controller'=>'user','action'=>'add']

*   参数数组:$this->params = ['name'=>'peter','age'=>30]

*/

//第一步:将查询字符串前后的/去掉,再按分隔符/拆分到数组中

$queryStr = trim(strtolower($queryStr),'/');

$queryArr = explode('/',$queryStr);//拆分成数组

//$queryArr = array_filter($queryArr);

//第二步:解析出$queryArr数组中的内容(模块,控制器,操作,参数)

switch(count($queryArr)) {

//没有参数,则使用默认模块/控制器/操作

case 0:

$this->pathInfo = $this->route;

break;

//只有一个参数:用户只提供模块,控制器和操作使用默认值

case 1:

$this->pathInfo['module'] = $queryArr[0];

break;

//二个参数:模块和控制器自定义的,操作是默认的

case 2:

$this->pathInfo['module'] = $queryArr[0];

$this->pathInfo['controller'] = $queryArr[1];

break;

//三个参数:模块/控制器/操作全部自定义:全部来自用户的实际请求

case 3:

$this->pathInfo['module'] = $queryArr[0];

$this->pathInfo['controller'] = $queryArr[1];

$this->pathInfo['action'] = $queryArr[2];

break;

//对参数进行处理

default:

$this->pathInfo['module'] = $queryArr[0];

$this->pathInfo['controller'] = $queryArr[1];

$this->pathInfo['action'] = $queryArr[2];

//从pathinfo数组的索引3开始,将剩余的元素全部作为参数进行处理

$arr = array_slice($queryArr,3);

//键值对必须成对出现,所以每次递增2

for($i=0;$i

//如果没有第二个参数,则放弃

if(isset($arr[$i+1])){

$this->params[$arr[$i]] = $arr[$i+1];

}

}

break;

}

//返回当前路由类的实例对象,主要是方便链式调用:

//$route->parse();$route->worm();$route->print()

return $this;

}

//请求分发

public function dispatch()

{

//生成的带有命名空间的控制器类名称:app\模块\controller\控制器类

//类名称应该与类文件的绝对路径一一对应,这样才可以实现自动映射,方便自动加载

//模块名称

$module = $this->pathInfo['module'];

$controller ='app\\'.$module.'\controller\\'.ucfirst($this->pathInfo['controller']);

//操作名

$action = $this->pathInfo['action'];

//判断该类中是否有这个方法存在

if(!method_exists($controller,$action)){

$action = $this->route['action'];

header('location: /');

}

//将用户的请求分发到指定的控制器和操作方法上

return call_user_func_array([new $controller,$action],$this->params);

}

//获取pathinfo

public function getPathInfo()

{

return $this->pathInfo;

}

//获取模块

public function getModule()

{

return $this->pathInfo['module'] ? : $this->route['module'];

}

//获取控制器名称

public function getController()

{

return 'app\\'.$this->getModule().'\controller\\'.ucfirst($this->pathInfo['controller']);

}

}

/*//测试路由

$queryStr = $_SERVER['QUERY_STRING'];

echo $queryStr;

echo '


';

echo '

';

print_r(explode('/',$queryStr));

$config = require 'config.php';

$route = new Route($config['route']);

$route->parse($queryStr);

/*print_r($route->pathInfo);

print_r($route->params);

//测试请求分发

require __DIR__.'/../app/admin/controller/Index.php';

echo $route->dispatch();*/<?php

/**

* 框架基础类

* 1.调试模式

* 2.自动加载

* 3.启动框架

*/

namespace pig;

class Base

{

//框架配置

protected $config = [];

//路由信息

protected $queryStr = '';

//构造方法

public function __construct($config,$queryStr='')

{

$this->config = $config;

$this->queryStr = $queryStr;

}

//设置调试模式

public function setDebug()

{

//debug == true

if($this->config['app']['debug']){

error_reporting(E_ALL);

ini_set('display_errors','On');

}else{

//error_reporting(E_ALL);

ini_set('display_errors','Off');

ini_set('log_errors','on');

}

}

//注册自动加载器:自动加载的是类

public function loader($class)

{

//new \app\admin\controller\Stu(),  app/admin/controller/Stu.pho

$path = ROOT_PATH.str_replace('\\','/',$class).'.php';

//如果没有找到类文件,就直接返回默认首页

if(!file_exists($path)){

header('Location: /');

}

require $path;

}

//启动框架

public function run()

{

//调试模式

$this->setDebug();

//自动加载

spl_autoload_register([$this,'loader']);

//请求分发

echo (new Route($this->config['route']))->parse($this->queryStr)->dispatch();

}

}<?php

/**

* 配置文件:适用于整个应用

* 采用PHP数组方式返回数据

*/

return [

//应用配置

'app' => [

//调试开关

'debug'=>true,

],

//路由配置

'route' => [

//默认模块

'module' => 'admin',

//默认控制器

'controller' => 'Index',

//默认操作

'action' => 'index',

],

//数据库配置

'db' => [

//数据库的类型

'database_type' => 'mysql',

//默认的数据库名称

'database_name' => 'frame',

//默认的主机名

'server' => '127.0.0.1',

//默认的用户名

'username' => 'root',

//用户密码

'password' =>'root',

//默认的客户端的字符集编码

'charset' => 'utf8',

//默认服务端口号

'port' => 3306,

]

];

框架的核心文件:框架的配置文件(以数组的形式完成整个应用的配置,路由,数据库等),路由类(路由解析和请求分发)和基础类(调试模式,自动加载和启动框架)文件,还有入口文件(定义常量,加载函数库,启动框架,使启动框架有统一的入口),还有创建框架的模型基类(实例化数据库框架),视图基类(实例化视图模型),控制器基类(实现模板引擎的配置,模板赋值(将参数保存在数组)和模板渲染(将数组键值对转换为变量的名值对,然后加载模板文件)。至此,一个小型的框架就完成,然后就可以建立自己的项目啦。学完这章,对框架的整体建立和运行过程有一个基本的认识,懂得其中的原理,为学习其他框架提供了基础。至此,php基础也学完了,学到了很多东西,感谢老师的辛苦讲解和付出,为我以后的php道路打下了扎实的基础。有老师陪伴,学习的时间真的很开心,很充实。

批改老师:灭绝师太批改时间:2019-03-21 09:08:24

老师总结:希望你们通过自己的努力,都成为行业佼佼者,前路还长,继续加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MiniServer是一款绿色、精简、迷你的WANMP(Windows+Apache+Nginx+MySQL+PHP)服务端程序,使用本工具可以非常方便的搭建网站服务器。 重要说明: 由于MiniServer包含组件比较复杂,所以每次更新都会或多或少对其组件进行修改,直接用新版本覆盖老版本则会产生许多不必要的问题。 更新时请注意备份数据库目录(MySQL\data)和网站文件目录(www\htdocs)到其他文件夹 删除原MiniServer文件夹,再将新版本解压,将上述两个目录复制回相应路径即可。 2013年6月6日 v2.0 1.新增:PHP更换为5.3.22和5.4.12,并更换原APACHE2HANDLER运行方式为CGI-FCGI 2.新增:全面支持Zend Guard加密 3.新增:添加一个快速便捷的文件分享服务器(基于第三方软件) 4.改进:调整虚拟目录和虚拟主机的设置功能(不再支持中文路径) 5.改进:程序细节优化,如程序未开启时,默认选中Apache等 6.改进:增加部分PHP模块,如SQLite3支持等 7.改进:调整默认主页文字说明、增加Zend Guard 5.01~6.0加密的三个测试文件 使用帮助 1.数据库管理地址为 //127.0.0.1/phpmyadmin 默认用户名 root 密码为 miniserver,菜单中有MySQL root用户密码重置功能 2.一般情况下,我个人不推荐新手更改组件配置文件或对组件进行升级操作,否则可能会导致MiniServer无法正常开启 3.网站根目录为 www/htdocs 文件夹,可以通过MiniServer菜单快速进入,也可以使用Apache的虚拟目录功能单独设置目录(Nginx暂时不支持虚拟目录) 4.菜单中有修改端口的功能,修改前请确保其他软件没有占用所修改的端口,如果遇到MiniServer中某组件无法正常启动,请使用菜单中的调试模式检查错误信息,或者检查端口占用情况 5.请勿在在含有中文路径或目录下使用MiniServer,否则会造成组件无法启动等问题 6.MiniServer支持IPv6,查看本机IPv6地址可以用 ipconfig 命令或者直接登陆 ipv6-test.com 7.内置一款探针程序,可以让您更好的浏览本机服务器信息。//127.0.0.1/tz.php
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值