avris/picco

Golfy PHP 框架

v2.0.0 2018-02-17 21:24 UTC

This package is auto-updated.

Last update: 2024-09-11 04:48:19 UTC


README

Golfy PHP 框架

代码高尔夫 是一种休闲计算机编程竞赛,参赛者努力实现某个算法的最短源代码。 [来源]

Picco 是一个微小的 PHP 网络框架,只占用 ~2,3 kB 的空间,不依赖其他库,同时提供很多功能,可扩展且易于使用。

功能

  • 依赖注入
  • 事件调度器:系统事件 requestresponseerror
  • 带有参数识别的 REST-ful 双向 路由
  • 基本的 错误处理
  • 视图.phtml 文件中
  • CLI 任务

要求

  • 代码应尽可能简短,但:
  • 外部看起来不应该像“高尔夫”,即需要“良好”的命名空间、类名和公共方法名
  • 在可读性和简洁性之间取得妥协:应使用新行来分隔代码的显著块,但不需要缩进
  • Picco 是一个无依赖的 Composer 包
  • 也不允许有警告

安装

只需 安装 Composer 并运行

composer create-project avris/picco-project my_new_project

然后复制粘贴 parameters.php.distparameters.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 设置了系统服务(routercontrollersviewdispatcher)后,它将运行 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');

监听器将按定义的顺序触发。系统事件(requestresponseerror)的默认监听器在用户定义的监听器之后触发。如果链中的任何监听器返回任何内容,则不再执行链。

错误处理

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

版权