avris / picco
Requires
- php: ^7.0
README
Golfy PHP 框架
代码高尔夫 是一种休闲计算机编程竞赛,参赛者努力实现某个算法的最短源代码。 [来源]
Picco 是一个微小的 PHP 网络框架,只占用 ~2,3 kB 的空间,不依赖其他库,同时提供很多功能,可扩展且易于使用。
功能
- 依赖注入
- 事件调度器:系统事件
request
、response
和error
- 带有参数识别的 REST-ful 双向 路由
- 基本的 错误处理
- 视图 在
.phtml
文件中 - CLI 任务
要求
- 代码应尽可能简短,但:
- 外部看起来不应该像“高尔夫”,即需要“良好”的命名空间、类名和公共方法名
- 在可读性和简洁性之间取得妥协:应使用新行来分隔代码的显著块,但不需要缩进
- Picco 是一个无依赖的 Composer 包
- 也不允许有警告
安装
只需 安装 Composer 并运行
composer create-project avris/picco-project my_new_project
然后复制粘贴 parameters.php.dist
到 parameters.php
并用您的数据库访问数据填充。
要创建数据库模式并填充一些示例数据,请运行
bin/picco fixtures
此外,配置运行时文件的目录
chmod -R 777 run
您可以使用 PHP 内置服务器运行它
php -S localhost:8000 -t web/
您应该能够通过 https://:8000
访问项目。
使用方法
毕竟,一个例子胜过千言万语,Picco 附带一个 入门项目,它演示了您可以使用 Picco 做什么以及如何扩展它(使用 RedBeanPHP ORM、缓存、日志、翻译...)。查看其代码!
路由
类 App\Routing
应有一个公共静态 get
方法,该方法返回一个路由数组。其键是路由名称(与控制器名称和视图名称相同)和对应的正则表达式值。
'home' => '/',
'itemList' => '/item/list',
'itemShow' => '/item/(\d+)/show',
假设以下路由集:URL /
将运行 home
控制器,/item/list
-- itemList
控制器,以及类似 /item/1/show
、/item/7/show
、/item/666/show
等等的任何内容 -- itemShow
控制器。其他任何内容都将抛出 404 异常。
要生成路由,从 DI 容器获取路由器并使用 get
方法,例如
$c->router->get('itemShow', [$item->id])
控制器
控制器是 App\Controllers
类的公共方法。它们的第一个参数始终是 DI 容器,其余参数是路由的连续匹配项。它们应返回一个数组,该数组包含传递给视图的变量。例如
public function itemShow(Container $c, $id)
{
$item = $c->db->load('item', $id);
if (!$item->id) { throw new \Exception("Item $id not found", 404); }
return ['item' => $item];
}
视图
视图是 /views
目录中的 .phtml
文件,其名称与路由/控制器名称对应。它们可以访问路由器($r
)和控制器返回的值(在 views/itemShow.phtml
的情况下,只是 $item
)。您还可以使用 $this->render($name, $vars)
渲染部分
<?= $this->render('partial/head', get_defined_vars()); ?>
<h2><?= $item->name ?></h2>
<a href="<?= $r->get('itemDelete', [$item->id])?>" class="btn btn-danger"><?=$t['delete']?></a>
<?= $this->render('partial/foot', get_defined_vars()); ?>
常量
Picco 定义了 5 个常量
- D -- 项目的根目录,例如用于加载配置文件、设置文件系统缓存等。
- F -- URL的基础(例如
picco/web/index.php
),如果您不想使用路由器,则用于生成其他页面的链接。 - B -- URL的基础,但不包括前端控制器(例如
picco/web/
),用于包含资产,例如<img src=<?=B?>logo.png
。 - R -- 当前路由
- E -- 当前环境:在开发/调试模式(默认)下为
true
,在生产模式(如果环境变量APP_DEBUG
设置为0
)下为false
。
依赖注入容器
在 Picco 设置了系统服务(router
、controllers
、view
、dispatcher
)后,它将运行 App\Services::get(Container $c)
方法。在那里您可以定义您自己的服务和参数
$c->foo = 'bar';
$c->sizeChecker = new SizeChecker();
$c->parameters = require D.'parameters.php';
$c->db = function($c) {
define('REDBEAN_MODEL_PREFIX','\\App\\Model\\');
$p = $c->parameters['db'];
$db = new \R;
$db->setup($p['dsn'], $p['user'], $p['pass']);
if (!E) { $db->freeze(); }
return $db;
};
如果您设置的是一个可调用对象,它将作为参数与容器一起解析(在检索时是急切的)。
要检索一个服务/参数,只需获取它,例如:$c->db->findAll(...)
。
事件分发器
定义事件监听器
$c->dispatcher->event_name = function(Container $c, $moreParameters) {
// do something...
};
触发它
$c->dispatcher->event_name($c, 'and', 'other', 'params');
监听器将按定义的顺序触发。系统事件(request
、response
和 error
)的默认监听器在用户定义的监听器之后触发。如果链中的任何监听器返回任何内容,则不再执行链。
错误处理
Picco 以以下方式处理错误和异常:如果 E=true
(调试模式),异常将被重新抛出;否则,将执行 error
控制器(将容器和该异常作为参数),以便您可以显示 404/500/任何错误页面。
您可以通过监听 error
事件来覆盖默认行为。
CLI 任务
类似于控制器,还有一个 App\Tasks
类,其公共方法是 CLI 任务。
例如,如果您运行 vendor/bin/picco test foo bar
,它将执行 App\Tasks::test('foo', 'bar')
。
贡献
Picco 的源代码在 Gitlab 上可用,如果您能以任何方式使其更短或更好,请随时创建 pull request。
注意:未使用测试框架,要运行测试套件,请转到库目录并运行 ./test
;
版权
- 作者:Andrzej Prusinowski (Avris.it)
- 许可证: MIT