PHPackages                             suconghou/tinymvc - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. suconghou/tinymvc

ActiveProject[Framework](/categories/framework)

suconghou/tinymvc
=================

a lightweight php mvc framework

8141PHP

Since Nov 7Pushed 6mo ago3 watchersCompare

[ Source](https://github.com/suconghou/mvc)[ Packagist](https://packagist.org/packages/suconghou/tinymvc)[ RSS](/packages/suconghou-tinymvc/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

简单易用的 MVC 开发框架
==============

[](#简单易用的-mvc-开发框架)

---

框架特色
----

[](#框架特色)

> - 核心代码不足1000行,仅两个文件便可工作,极速加载
> - 单文件入口,不依赖`PathInfo`,入口文件即是配置文件,超级简洁
> - 文件夹随意移动,轻松多项目共享,入口文件随意命名,CLI模式轻松使用
> - `MYSQL/SQLITE`任意切换,注入过滤/ORM,文件缓存/HTTP缓存/数据库缓存,轻松安全
> - 异常捕获,`DEBUG`日志,自定义错误页,自定义异常路由一应俱全
> - 普通路由,正则路由,回调处理,百变URI随心所欲,插件模式,即插即用
> - 文件加载自动完成,延迟按需加载、无需`Include`简单高效

---

安装配置
----

[](#安装配置)

- `index.php`入口文件即配置文件,`core.php`框架核心,外加一个处理请求的控制器文件
- `PHP8.0`及以上
- 使用PDO连接数据库,支持`MySQL`和`Sqlite`,需开启`PDO_MYSQL`
- 定义配置文件的程序路径(一般不需改变)和其他参数,例如SMTP,数据库,即可完美使用
- 需要URL REWRITE支持,否则链接中要添加`index.php`
- rewrite 即为一般的index.php rewrite写法

对于`nginx`

```
try_files $uri $uri/ /index.php$is_args$args;
```

加入`location / {}`里面

对于`apache`

```
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

```

Web程序可将目录结构调整为

```
├── app
│  ├── controller
│  │  └── home.php
│  ├── model
│  │  └── util.php
│  └── system
│     └── core.php
├── README.md
├── var
│  ├── html
│  └── log
└── www
   └── index.php

```

---

开始使用
----

[](#开始使用)

---

入口文件`index.php`即为配置文件,主要配置控制器模型等地址

配置项`lib_path`为一个数组,配置控制器,模型,类库的自动查找地址

`view_path`为模板查找文件夹

`var_path`为缓存目录和日志目录

文件夹 controller model system 其实并无区别

系统并不是按照文件夹结构来区分 controller 和 model 而是按照类本身的特性

包含`__invoke`魔术方法的类将被视为控制器

在控制器抛出异常时,此方法将被调用用于处理异常.

`event`字段配置闭包函数可用于扩展`app`

- 所有加载过的控制器,都会记住是否已加载过,不会重复加载,也不会重复实例化
- 加载过的类库和模型全局可用
- 所有的同名文件类都可以直接通过类名调用其静态方法,或new实例化

对于低于8.1版本，需要实现`array_is_list`函数

```
if (!function_exists('array_is_list'))
{
    function array_is_list(array $a)
    {
        return $a === [] || (array_keys($a) === range(0, count($a) - 1));
    }
}
```

对于低于8.0版本，需要实现`str_contains`函数

```
if (!function_exists('str_contains'))
{
	function str_contains(string $haystack, string $needle)
	{
		return empty($needle) || strpos($haystack, $needle) !== false;
	}
}
```

DEBUG
-----

[](#debug)

配置文件`debug`字段用于控制日志记录,其值可为`0/1` 或者 `false/true`

框架判断其布尔值,非`debug`模式仅记录`ERROR`级别日志，忽略`INFO`,`WARN`

无论是否debug,只要日志目录可写，都会记录相应的错误。

---

---

路由
--

[](#路由)

框架同时包含正则路由和普通路由.

普通路由按照目录结构路由,

正则路由按照URI匹配.

***使用 route::get() 添加正则路由***

正则路由优先级高于普通路由.

正则路由有多种写法

字符串函数

```
route::get('/print','print_r');
```

闭包

```
route::get('/dump',function(...$a){
	var_dump($a);
});
```

实例化控制器

控制器类将被自动实例化,然后执行

```
route::get('/hello',['home','hello'])
route::get('/hello',['home','hello','world'])
```

静态化控制器

控制器类方法将被静态调用

```
route::post('/static','home::echo');
```

捕获参数

```
route::get('/userinfo/(\d+)',['home','userinfo'])
```

带命名空间的静态调用,可调度到子文件夹,自己再次分发路由,`admin`为`namespace`,`form`类无实例化，直接调用

```
route::get('/hi/index','admin\form::index')
```

带命名空间的动态调用,可调度到子文件夹,`form`类校验，并实例化

```
route::get('/hello/hi',['admin\form','hi'])
```

二级，三级，文件夹同理 除了通过路由配置调度到子文件夹，还可以自己手动调度

例如`api.php`，访问`/api/user/`下的路由被调度到`api`文件夹，`user`同名文件类，后续路径参数继续派发

```
