guitarpoet / clips-tool
基于php-clips扩展的命令框架。
Requires
- cebe/markdown: 1.0.1
- curl/curl: dev-master
- elkuku/console-progressbar: 1.0
- endroid/qrcode: *
- garetjax/phpbrowscap: dev-master
- gitonomy/gitlib: 0.1.7
- monolog/monolog: 1.12.0
- mustache/mustache: 2.7.0
- nikic/php-parser: 1.1.0
- niktux/addendum: 0.4.4
- robmorgan/phinx: 0.4.3
- seld/jsonlint: 1.3.1
- smarty/smarty: 3.1.21
- symfony/config: 2.6.4
- symfony/filesystem: 2.6.4
This package is not auto-updated.
Last update: 2024-09-28 16:41:46 UTC
README
需求
必需
可选
- php-mmseg:中文分词器
- php-imagick:PHP图像处理框架,如果你想使用自动图或图片小部件,这是推荐的插件
- php-gd:PHP图像处理框架
安装
如果你只想使用Clips工具的命令行部分,首先需要安装php-clips。
如果你想使用Web开发框架,你需要安装php-sass以及至少一个PHP图像处理框架。
然后,将以下代码添加到你的composer.json文件中
"require": {
"php": ">=5.3.0",
"guitarpoet/clips-tool": "*"
}
然后,你可以使用composer来下载它。
什么是CLIPS?为什么选择这个框架?
编写此框架的原因(部分,命令行部分)可以在这里找到。
这个框架是从一个处理PHP数据的简单框架发展而来的。
它使用CLIPS作为其基本部分,试图创建一个像CI那样的灵活环境,同时尊重PHP 5.*和PHP-FIG设计的新标准。
那么,什么是CLIPS?为什么我将其作为框架的核心?
有关CLIPS的详细信息,你可以在这里找到。
对于我来说,CLIPS是一个用C语言编写的快速(是的,非常快)基于RETE的规则引擎,它使用Lisp方言作为其语法。
你可以用它来编写非常智能的基于规则的程序,我将从一个框架的演示代码中举一个非常简单的例子。
假设你有一个小型的博客网站,它有一个仪表板来管理它。你并不想任何人(只有你和你的博客合著者)能查看仪表板。
因此,你希望仪表板只能在登录时才能查看。
以下是实现此功能的规则代码
(defrule only-users-logged-in-can-view-dashboard
(Clips\SecurityItem (type "action") (content ?content&:(str-match "dashboard/.*")))
(test (not (php_call "Demo\\user_logged_in")))
=>
(reject "Must logged in to view DashBoard!")
)
让我简单解释一下(有关CLIPS的详细信息,你可以在这里找到)
- defrule:此命令将定义一个规则并按你提供的第一个参数命名,在上面的示例中,我有一个名为only-users-logged-in-can-view-dashboard的规则
- Clips\SecurityItem:这是框架自动生成的框架对象。对于此示例,它是用户的浏览器请求(因此类型是一个动作),以及此动作的uri。
- test:测试事实是否匹配此规则,在这个例子中,它将让PHP函数执行这项工作,以测试用户是否已登录
- 拒绝:这是一个框架函数,只是让框架知道您想用“必须登录才能查看仪表板!”的理由拒绝此操作。
CLIPS能做的远不止这些。
实际上,这个框架的核心部分,加载、配置猜测、请求路由、安全检查都是由规则完成的。
你好世界? - 命令行
由于这个框架可以是命令行或Web框架。让我们从命令行开始。
clips-tool首先是一个简单的命令行工具,所以使用clips-tool编写命令行程序非常简单。
以下是步骤
- 从这里克隆clips-tool的代码
- 使用composer安装依赖项
- 将clips的路径(一个bash脚本,window用户可以使用cygwin运行它)添加到PATH中,或者创建该文件的软链接到您的bin文件夹
- 运行命令
clips version
进行测试 - 进入任何文件夹,运行clips generate命令并按照向导操作
按照上述步骤,您将得到一个名为commands的文件夹和一个文件,例如HelloCommand.php。
它应该像这样
cwd\commands\HelloCommand.php
文件的内容应该像这样
<?php in_array(__FILE__, get_included_files()) or exit("No direct sript access allowed");
use Clips\Command;
/**
* This is a simple command
*
* @author Jack
* @version 1.0
* @date Sun Mar 8 21:31:40 2015
*/
class HelloCommand extends Command {
public function execute($args) {
}
}
是的,这是一个非常简单的命令。但它包含了命令行命令必须拥有的所有功能,命令行参数以及从基类command获得的所有方法。
非常简单,比如如果我们只想打印一条欢迎消息(hello world)。所以,您可以将代码更改如下;
<?php in_array(__FILE__, get_included_files()) or exit("No direct sript access allowed");
use Clips\Command;
/**
* This is a simple command
*
* @author Jack
* @version 1.0
* @date Sun Mar 8 21:31:40 2015
*/
class HelloCommand extends Command {
public function execute($args) {
$this->output("Hello World!");
}
}
然后使用命令clips hello
来运行它。
很简单,对吧?
让我们从一个小模板开始。
比如说你想要将一个名字传递给hello world命令,然后你可以将代码改为这样
<?php in_array(__FILE__, get_included_files()) or exit("exitNo direct sript access allowed");
use Clips\Command;
/**
* This iterates a simple command
*
* @author Jack
* @version 1.0
* @date Sun Mar 8 21:31:40 2015
*/
class HelloCommand extends Command {
public function execute($args) {
$this->output(Clips\clips_out("string://Hello {{name}}", array('name' => Clips\get_default( $args, 0, "World")), false));
}
}
这里需要一些解释。
Clips使用mustache作为其默认的模板引擎。所以你可以直接使用位于Clips命名空间中的clips_out函数来使用它。
但是,mustache如何找到模板呢?
Clips工具使用一个简单的基于资源的资源框架来查找资源。
如果没有为clips_out设置方案,它将默认使用tpl://(这将尝试每个模板路径)。
在上面的例子中,资源方案是string://,所以mustache将仅使用字符串作为输入资源。这有点像PHP的资源处理框架,但更灵活。
第二个要解释的是Clips\get_default。
这是一个方便的函数,它会尝试第一个参数(对象或数组),如果它有第二个参数的键,如果有,它将返回该键的值,如果没有,它将返回默认值(第三个参数)。
增强 - 命令行
那么,如何从这里开始呢?例如,如何访问框架提供的库?
例如,如果您想获取规则引擎呢?
让我们从一个HelloRules命令开始,如下所示
<?php in_array(__FILE__, get_included_files()) or exit("No direct sript access allowed");
use Clips\Command;
use Clips\Interfaces\ClipsAware;
/**
* The simple hello world rules command.
*
* @author Jack
* @version 1.0
* @date Sun Mar 8 21:53:50 2015
*/
class HelloRulesCommand extends Command implements ClipsAware {
public function setClips($clips) {
$this->clips = $clips;
}
public function execute($args) {
$this->clips->command('(defrule hello-world-rule (name ?name) => (printout t "Hello " ?name crlf))');
$this->clips->assertFacts(array('name', Clips\get_default($args, 0, 'world')));
$this->clips->run();
var_dump($this->clips->queryFacts());
}
}
让我们更详细地看看代码。
- 如果您想让clips增强您的命令,只需让您的命令实现ClipsAware接口,框架会自动将clips引用设置到您的命令中
- 您可以通过clips的command方法运行clips命令
- 您可以使用assertFacts和queryFacts方法与clips的事实进行交互,这些方法的详细信息,您可以在这里查看
clips helloRules命令的输出将如下所示
Hello world
array(1) {
[0]=>
array(2) {
[0]=>
string(5) "world"
["__template__"]=>
string(4) "name"
}
}
与clips(要求您实现接口以获取所需的服务)相同的函数是
- Clips:规则引擎
- Logger:PSR-3兼容的记录器
- 工具:剪辑工具本身
获取更多增强 - 命令行
让你的依赖只实现一个接口是很酷的。
但是框架中有许多对象,那么你该如何访问它们呢?逐个实现接口似乎不是一个好主意。
那么,你该如何获取你命令的依赖呢?
它应该像这样
<?php in_array(__FILE__, get_included_files()) or exit("No direct sript access allowed");
use Clips\Command;
/**
* A little demo command for annotation
*
* @author Jack
* @version 1.0
* @date Sun Mar 8 22:05:16 2015
*
* @Clips\Library("markup")
*/
class HelloAnnoCommand extends Command {
public function execute($args) {
$this->output($this->markup->render("#This is h1"));
}
}
我使用了这个示例中的框架库Markup。
正如你所见,这个命令的库依赖只是作为这个命令的注解声明的(@Clips\Library("markup"))。
在你声明之后,框架将会创建并给出那个对象的引用,作为你提供的类名(小写)。
所有你提供的名字在找到类之前都会变成大写,所以你不需要将第一个字母大写。但是如果你的类名是驼峰式,除了第一个字母外,保留其他大写字母。
例如,MyModel,应该是myModel,而不是mymodel,或者在文件名区分大小写的系统(如Linux)中,你将无法获取这个类。
尽管如此,对象的引用名将是小写的(例如,MyModel将是mymodel)。
使用仅小写的引用名有3个含义
- 引用名易于识别,并且有很小的概率会覆盖你的命令的字段(其他字段是基于驼峰式的)
- 减少输入大小写时的错误率
- 自动字段并不意味着读取,而是使用,如果你不喜欢这个名称,你只需用一个临时变量来引用它
所有位于库中的东西(无论是否为Clips或你自己的)都将被加载和创建。如果你想使用命名空间,请看下一章。
除了Clips\Library,你也可以使用Clips\Model、Clips\Object来获取你想要的依赖。
当然,你不需要担心你依赖的依赖。
命令依赖 - 命令行
好的,现在你知道了如果你想要给你的命令添加依赖应该做什么。但是等等,如果你的命令是基于另一个命令呢?
比如说,你的包命令将依赖于fetch命令?
你可以使用@Clips\Depends来拯救。用法就像其他的注解一样,你可以在你的命令执行之前获取命令。
关于配置? - 命令行
我们的命令现在非常简单,如果我们想连接到某个数据库呢?
或者尝试在某个文件夹中定位某个文件?我们该如何配置我们的命令?
这就是clips-tool的力量。
你可以在以下位置添加你的配置
- cwd/
- cwd/config
- /etc/clips/
- /etc/
- /etc/rules
以clips_tool.json为名。如果你有多个这样的配置,不用担心,clips-tool会为你获取所有配置(比如说,你有一个/etc/clips_tools.json作为全局配置,以及项目自己的配置)。
配置应该像这样(一个来自演示站点的简单配置)
{
"table_prefix":"cms_",
"namespace": ["Clips\\Cms\\"],
"route_rules": ["/application/rules/route.rules", "/rules/route.rules"],
"filters": ["Security", "Rules", "Form", "Scss", "Css", "SmartyView", "MustacheView", "JsonView", "DirectView"],
"helpers":["web", "html"],
"default_view": "Smarty",
"debug_sass": true,
"sass_preload": ["variables"],
"models": {
"demo": {
"datasource": "mysql"
}
},
"logger": {
"handlers": {
"Stream" : ["php://stdin", "debug"],
"FirePHP" : ["debug"],
"ChromePHP": ["debug"],
"RotatingFile": ["/tmp/clips_cms.log", 4, "debug"]
},
"processors": ["Git", "PsrLogMessage", "Introspection", "Tag"]
},
"datasources": {
"mysql": {
"table_prefix":"cms_",
"type": "mysqli",
"database": "cms_dev"
}
}
}
正如你所见,配置只是一个键 => 值的JSON对象。
你可以使用Clips\config()函数在任何地方访问任何配置。
日志记录,Mate - 命令行
你可能已经看到了上面的日志配置(日志使用Monolog作为其实施)。
日志记录器和处理器与monolog相同,但没有无用的单词。
使用FirePHP或ChromePHP进行调试非常有用,相信我。
关于命名空间呢? - 命令行
Clips Tool是一个遵守PSR-4的框架,并且它更希望使用它来编写应用程序。
那么,Clips Tool是如何知道你使用的是哪个命名空间(或者命名空间,因为你可以使用尽可能多的插件)的呢?
此配置用于恢复。请参见上面的示例。
"namespace": ["Clips\\Cms\\"]
此配置将告知 clips-tool,您希望使用位于 Clips\Cms\ 命名空间中的类。
例如,如果您想要 Clips\Cms\Models\UserModel 的模型,您只需使用 @Clips\Model("user") 获取引用即可。
同样,如果您有一个如 Clips\Cms\Libraries\Ldap 的对象,您也可以使用 @Clips\Library("ldap") 获取它。
clips-tools 中的所有类都遵循(Models, Libraries)规则,您可以通过遵循这些规则来节省大量输入。