chipotle / slimx
为 Slim 提供轻量级模板和 PDO 数据访问
Requires
- php: >=5.3.0
- slim/slim: 2.*
This package is not auto-updated.
Last update: 2021-08-16 13:46:26 UTC
README
注意:SlimX 已不再开发或支持,并且可能无法与当前版本的 Slim 一起使用。 尽管如此,您可以根据 MIT 许可证,尝试将其适应自己的用途。
这是一个为 Slim 框架 的非常小的扩展集,Slim 框架是一个类似于 Sinatra 的 "微型框架",用于 PHP。
几年前,我开始创建自己的 PHP 微型框架,Flagpole;它变得可用,但从未真正取得太多进展,当明显有其他更好的类似项目时,我就将其搁置了。
然而,在 Slim 中开始一个项目,却让我发现了两个我怀念 Flagpole 的方面:一个轻量级数据库访问包装器和一个 "原生 PHP" 模板系统,至少支持早期 Rails 应用程序的布局概念。似乎很多使用 Slim 的人都在使用 Twig 进行模板设计;我认为 Twig 是一个出色的模板系统,但有时您不需要那么高级别的抽象,或者您与只知道纯 PHP 的同事一起工作。而且,您可能不需要 ORM,但您仍然希望拥有一些数据库访问的便利包装器。
安装
通过 Composer 安装 SlimX 是最好的方法。在您的 composer.json 文件中
{
"require": {
"slim/slim": "2.*",
"chipotle/slimx": "dev-master"
}
}
如果您正在手动安装,SlimX 遵循 PSR-0 标准。
\Slimx\View
此类扩展了 \Slim\View,增加了两个额外概念:布局 和 基础标签。
用法
只需用 Slimx 设置为自定义视图提供者来实例化 Slim 应用程序对象。API 与 Slim 的原生视图相同。
$app = new \Slim\Slim([
'view' => new \Slimx\View();
]);
布局
这是一个简单的模板继承版本。模板的布局只是一个放置内容的 "框架",恰当地放在 $content 变量中。布局可能看起来像这样
<!DOCTYPE html>
<html lang="en">
<head>
<title>Site<?php if (isset($_title)) echo " | $_title" ?></title>
<link rel="stylesheet" href="<?= $_base ?>/css/style.css">
</head>
<body>
<div class="container">
<?= $content ?>
</div>
</body>
</html>
您可以通过将布局文件作为参数传递给构造函数来为网站指定默认布局文件
new \Slimx\View('_mylayout.php');
如果没有参数,文件将使用默认名称 _layout.php。您还可以将 false 作为布局参数传递,将不设置任何默认布局。
布局存储在您配置的模板目录中(默认为 templates)。布局将访问模板中的所有变量。
单个视图可以通过将其数据数组中的特殊键 _layout 设置为新模板的名称来覆盖应用程序级别的布局
$app->render('page.php', [
'_layout' => 'other_layout.php'
]);
与应用程序级别的布局一样,如果将视图的 _layout 键设置为 false,则没有布局。
基础变量
您可能已经注意到了模板中的 $_base。这总是自动设置为 Slim 环境的 SCRIPT_NAME。为什么?因为当我第一次尝试设置一个像这样的 URL 时
$app->get('/item/create', function() { ... });
...我的CSS文件停止工作,因为它们都是相对于由路径段隐含的虚拟目录的,即/item/css/。如果您知道您的应用程序始终将在同一基本位置部署,无论是开发还是生产,那么您不需要这个,但您可能并不总是知道这一点。
\Slim\DB
这期望您在Slim应用程序配置空间($app->config())中设置一到四个键,其中之一是始终必需的。
dsn:有效的PDO风格的DSN,即mysql:host=localhost;dbname=mydb。您可以使用“@”键作为数据库名称的占位符,这在需要访问多个数据库时很有用。(我的第一个Slim应用程序实际上需要这样做!)db_user:如果需要,数据库用户名。db_password:如果需要,数据库密码。pdo_fetch_style:一个PDO常量,用于指定获取方式,如果您不喜欢Slimx默认的PDO::FETCH_OBJ选择。
构造函数
可选的第一个参数是用于实例化PDO对象的数据库名称,如果您使用上面描述的“@”占位符技巧。如果您只使用一个数据库,则不需要它。
$db = new \Slimx\DB();
DB::getPdo()
返回PDO对象本身,如果您需要它。
DB::query($query, $params)
执行SQL查询,带有一个可选的参数或数组。
$db->query('UPDATE mytable SET foo = ? WHERE id = 1', 'banana');
如果您只需传递一个参数,则不需要是数组;多个参数则需要是数组。使用关联数组进行命名参数(array(':foo' => 'banana', ':bar' => 'apricot'))。
这将返回一个PDOStatement对象。
DB::exec($query, $params)
这实际上与DB::query相同,但它返回受影响行数的计数。在许多情况下,这将更有用的反馈。
DB::read($query, $params)
执行上述给定的查询,但直接返回单行。如果查询返回多行,则只返回第一行。(如果您需要多行,请使用下面的readSet或自己实现。)
$res = $db->read('SELECT * FROM mytable WHERE id = ?', 2);
- 对于单列结果,您将得到单个返回值。
- 对于多列结果,您将得到一个对象(或如果您已更改获取方式,则为您请求的任何内容)。
DB::readSet($query, $params)
执行上述给定的查询,但直接返回结果值。
$res = $db->readset('SELECT id, name, other_id FROM mytable');
- 对于单列结果,您将得到一个数组。
- 对于多列结果,您将得到一个对象数组(或如果您已更改获取方式,则为您请求的任何内容)。
DB::readHash($query, $params)
为只返回两列的查询设计的readSet的特例:这将返回一个关联数组,其中第一列是键,第二列是值。
$res = $db->readHash('SELECT id, name FROM mytable');
返回(例如)
array(1001 => 'banana', 1002 => 'apricot', 1003 => 'carambola')
如果查询返回多于或少于两列,这将抛出一个LengthException。
DB::insert($table, $data)
将 $data 中的数据插入到指定的表中。其中 $data 应该是一个关联数组或具有类似功能的对象,例如 PDO 返回的对象。
$data = array('id'=>1, 'name'=>'banana', 'other_id'=>42);
$db->insert('mytable', $data);
DB:update($table, $data, $key)
上述操作的等效,但用于更新现有记录。其中 $key 应该是用于更新的主键列名。请注意,这仅支持单列键,如果需要多个键,请使用 query 来实现。主键的默认名称是 id。$data 数组/对象必须包含一个主键字段,否则程序将抛出 InvalidArgumentException 异常。
$data = array('id'=>1, 'name'=>'banana', 'other_id'=>42);
$db->update('mytable', $data);
DB:save($table, $data, $key)
将上述两个操作结合在一起,实现一种类似聪明的操作:如果主键在数据库中存在,则执行更新操作,否则执行插入操作。
DB:get($table, where, $key)
这是一个便利函数,可以返回单个表中一行或多行中的所有列。它可以以两种形式调用
$db->get('mytable', 2);
$db->get('mytable', 'id >= 100 AND id <= 200');
在第一种形式中,它将从 mytable 中检索 id 列为 2 的记录,并以对象(或您设置的 PDO 获取样式)返回。在第二种形式中,它将检索与 WHERE 子句匹配的 mytable 中的所有记录,并以对象数组(或任何其他内容)返回。
在这两种情况下,您可以指定一个可选的第三个参数。在第一种情况下,第三个参数是查找时使用的列名,如果不想使用 id,则指定它;在第二种情况下,第三个参数是一个参数数组,类似于各种读取函数。
$db->get('mytable', 2, 'id');
$db->get('mytable', 'id >= ? AND id <= ?', array($x, $y));
请注意,函数通过测试第二个参数是否为字符串来区分这两种形式。因此,如果您有一个主键为字符串的表,则不能使用此函数的第一个形式。
此 get 和 save 函数旨在一起工作,以实现最简 CRUD 功能。
$post = $db->get('post', $id);
$post->title = 'New Title';
$post->body = 'Lorem Ipsum';
$post->user_id = $user->id;
$db->update('post', $post);
如果您需要实际的 ORM,则几乎肯定更适合使用现有的强大 ORM,如 Doctrine。
PHPUnit 测试
这些测试(相当)完整,但尚未为 View 类实现。