guitarpoet/clips-tool

基于php-clips扩展的命令框架。

安装: 240

依赖项: 1

建议者: 0

安全性: 0

星级: 2

关注者: 3

分支: 0

开放性问题: 8

语言:JavaScript

0.9.0 2015-04-20 04:42 UTC

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的详细信息,你可以在这里找到)

  1. defrule:此命令将定义一个规则并按你提供的第一个参数命名,在上面的示例中,我有一个名为only-users-logged-in-can-view-dashboard的规则
  2. Clips\SecurityItem:这是框架自动生成的框架对象。对于此示例,它是用户的浏览器请求(因此类型是一个动作),以及此动作的uri。
  3. test:测试事实是否匹配此规则,在这个例子中,它将让PHP函数执行这项工作,以测试用户是否已登录
  4. 拒绝:这是一个框架函数,只是让框架知道您想用“必须登录才能查看仪表板!”的理由拒绝此操作。

CLIPS能做的远不止这些。

实际上,这个框架的核心部分,加载、配置猜测、请求路由、安全检查都是由规则完成的。

你好世界? - 命令行

由于这个框架可以是命令行或Web框架。让我们从命令行开始。

clips-tool首先是一个简单的命令行工具,所以使用clips-tool编写命令行程序非常简单。

以下是步骤

  1. 这里克隆clips-tool的代码
  2. 使用composer安装依赖项
  3. 将clips的路径(一个bash脚本,window用户可以使用cygwin运行它)添加到PATH中,或者创建该文件的软链接到您的bin文件夹
  4. 运行命令clips version进行测试
  5. 进入任何文件夹,运行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());
	}
}

让我们更详细地看看代码。

  1. 如果您想让clips增强您的命令,只需让您的命令实现ClipsAware接口,框架会自动将clips引用设置到您的命令中
  2. 您可以通过clips的command方法运行clips命令
  3. 您可以使用assertFacts和queryFacts方法与clips的事实进行交互,这些方法的详细信息,您可以在这里查看

clips helloRules命令的输出将如下所示

Hello world
array(1) {
  [0]=>
  array(2) {
	[0]=>
	string(5) "world"
	["__template__"]=>
	string(4) "name"
  }
}

与clips(要求您实现接口以获取所需的服务)相同的函数是

  1. Clips:规则引擎
  2. Logger:PSR-3兼容的记录器
  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个含义

  1. 引用名易于识别,并且有很小的概率会覆盖你的命令的字段(其他字段是基于驼峰式的)
  2. 减少输入大小写时的错误率
  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)规则,您可以通过遵循这些规则来节省大量输入。