e7o/moments

dev-master 2020-11-02 08:13 UTC

This package is auto-updated.

Last update: 2024-09-29 05:08:43 UTC


README

Moments 是一个构建 Web 应用的小型、年轻框架。重点在于减少魔法(没有第二个代码解析器来解析伪注释),简单性(如果你不需要,则无需复杂的配置)和少即是多的方法:内容不会过于紧密地绑定到框架的具体细节。

想要贡献吗?

如果你有兴趣,欢迎加入!最简单的方法是

  • 进行分支操作并提交 pull request
  • 创建包含你功能的包
  • 博客介绍这个框架 :)

请检查编码风格(接近 PSR-2,不使用空格代替制表符)。请确保您的编辑器配置为仅触摸您实际触摸的行(不要进行“杀死所有空格并重新格式化整个文件”的操作)。请提交干净的提交(每个提交一个功能)!

基本用法

术语

只有一个重要的/不常见的术语很重要:moment。一个 moment 基本上等同于页面请求本身并处理“一切”。它也是一个容器,您可以从其中获取服务。

快速入门

只需运行

composer require e7o/moments
vendor/bin/init-moments

这将修改/创建您的 composer.json,创建一些脚本,放置一些通用模板,以便您开始并添加路由。做你的小作业(比如为 vendor/ 创建一个 .gitignore)然后继续。不要忘记检查创建的配置文件,因为可能会有一些你不需要或不想要的示例条目,因为它们会消耗一点 CPU 时间(比如 HTML 格式化器)。

目前您可能需要添加一个包含此内容的 composer.json,在您看到有关最小稳定性的错误之前

{
	"minimum-stability": "dev"
}

设置 PHP 开发服务器

在项目目录中执行

php -S localhost:8000

现在它可以在 https://:8000/public/ 上运行。如果您正在开发一个 Web 服务并且客户端无法连接,请检查 nestatat 是否仅绑定到 IPv6,这可能是某些情况下的一个问题(如 MacOS)。

如果您真的想将此服务器用于生产或团队环境中的调试目的,请检查环境变量 PHP_CLI_SERVER_WORKERS

在 nginx 中设置

这是您可以采取的方法

location ~ /your-project/assets/(?<loc>.+) {
		try_files $uri /your-project/public/assets/$loc;
}
location /your-project {
		try_files $uri /your-project/public/index.php;
}

这是一个用于开发目的的示例配置,对于生产,您当然应该使用 location /

如果您遇到错误,请检查是否已配置此

fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;

还有一些其他的,但通常有一个预定义的配置,您或您的操作系统包管理器已经放置在那里。

顺便说一下,如果这些变量可用并填写,则其他服务器也可能正常工作。

在 Apache 中设置

通过 a2enmod rewrite 启用 mod_rewrite。您可以将此放入 .htaccess 中(请记住,在此情况下“允许覆盖 None”是不可行的)或放入配置文件中。

RewriteEngine On
RewriteRule ^/your-project/assets/(.*)$ /your-project/public/assets/$1 [L]
RewriteRule ^/your-project/(.*)$ /your-project/public/index.php

与 nginx 相同:对于生产,请删除 your-project/

功能 - 一些文档

可能还没有完成或不是最好的解释。此外,别忘了在调用类/方法之前检查 docblock 注释,它们也包含有用的信息。总有一天这些内容会收集在一个地方,但在此之前...

数据目录

对于仅用于存储数据的文件和目录,您可以在 config/files.json 中指定自动创建和 chmodding。

[
	{
		"type": "directory",
		"name": "data",
		"chmod": "0766"
	},
	{
		"type": "file",
		"name": "logfile.txt",
		"chmod": "0123",
		"chown": "www-data"
	},
	{
		"type": "file",
		"name": "data.sqlite",
		"copy": "bin/database-template.sqlite"
	}
],

它不会覆盖或删除现有文件/目录。然而,它会更改访问权限,因此您可以将一些内容提交到您的存储库,同时确保它是可写的。但是,您可能需要以 root 用户身份进行 chown 操作。

路由

请参阅\e7o\Moments\Request\Routers\SimpleRouter的docblock以及config/default.json中的示例。

模板

Moments使用了Morosity。

一些重要变量

  • {{ $.meta }} - 所有您不希望关心的重要资源以及元标签的包含。
  • {{ $.assets }} - 您个人资产(从public目录)放置的路径。
  • {{ $.route }} - 当前路由的信息。特别是{{ $.route.requesturi }}对于表单操作等很有趣。

要在模板中构建路由,您可以使用route函数

{{ route('settings') }}

登录/认证

Moments具有内置的认证支持,您只需要填充一个连接到您的用户数据库或其他数据库的连接器即可。您可以将凭据放在ActiveDirectory或简单的文本文件中。

顺便说一句,没有人阻止您忽略此功能,并在每个控制器操作之上进行自己的检查,如果这是一个合法用例的话。

重要:您不能组合不同的方法(您可以某种方式做到这一点,但这既没有用也不受官方支持)。

isAllowed()方法

如果您从MomentsController扩展(或者更好,从扩展MomentsControllerYourProjectController),您只需重写此方法以实现基本检查功能(getRoute()和getRequest()目前可用)

public function isAllowed()
{
	return true;
}

根据返回值,将可能有不同的操作。

  • true将仅允许请求。
  • 一个Response将像在其他控制器操作中一样输出响应。
  • 一个字符串响应将采用此路由。这可能是您的登录表单,该表单设置一个您在方法中检查的cookie。
  • 其他任何返回值--false是推荐的--将产生一个错误。

认证器类

创建一个名为authenticator的服务。这具有在所有控制器中可用的优势。

"authenticator": {
	"class": "\\ACME\\YourProject\\Core\\Authenticator",
	"args": ["@moment"]
}

您可以扩展MomentsAuthenticator

use \e7o\Moments\Request\Authentication\Authenticator as MomentsAuthenticator;

请参阅示例实现SimpleConfigAuthenticatorSimpleDatabaseAuthenticator。您也可以从它们扩展--或者如果默认设置适合您的需求,只需将其中一个放入服务配置中(检查它们提供的安全性,它不是最高的标准)。

如果不需要getCurrentUser()(因为您没有区分),您可以忽略它。只需覆盖您需要的一切。

由于您具有包含在路由中指定数据的$route参数,您可以轻松地向路由添加自己的自定义参数(如必需的“用户组”、检查IP地址或根据当前时间允许访问)。

您可以在控制器中通过调用$this->getAuthenticator()安全地获取认证器。

构建一个包

包必须使用PSR-4自动加载,但是,嘿,您应该始终为新项目使用它!在理论上,您可以在每个存储库中有一个以上的包,但这不被推荐,这样用户就可以有选择性地使用它。

您的包必须有一个包含一些有效JSON的moments-bundle.json。在理论上,此文件可以是空的,除了{}

您可以指定一些内容,例如

  • scripts中,列出一些应该在进行集成之前执行的任务的纯PHP脚本。在这里,您可以下载最新的JS库版本等。由于脚本是通过composer运行的,因此应该可以写入目录。
  • assets中,您可以指定要符号链接到公共目录的资产文件夹。from是包中的路径,to是资产目录中的路径
  • routes中,一些额外的端点...
  • include-scriptsinclude-styles 指示了哪些脚本应该自动包含在模板中(如果模板使用了 $.meta)。别忘了添加正确的资产目录名称,因为我们在这里不使用魔法。
  • servicesroutes 的工作方式与其他配置文件相同。
{
	"assets": [
		{
			"from": "assets",
			"to": "fancy-bundle"
		}
	],
	"include-scripts": [
		"fancy-bundle/fancylib-latest.js"
	],
	"include-styles": [
		"fancy-bundle/fancylib-latest.css"
	]
}

prepare-moments 脚本将在 composer install 之后运行,因此它将在此点整合到目标项目中。

需要示例吗?只需添加 e7o/moments-material-bundle。这将为您的项目带来一些与材料设计相关的字体。

事件

主要用例与包相关。由于Moments本身也是一个包,您可以通过在配置中指定它们来使用一些预定义的示例事件。

"events": {
	"output:html": [
		"\\e7o\\Moments\\Events\\OutputEvents::formatHtml"
	]
}

(此 formatHTML 使用 libxml 格式化,这是一种相当混乱的方式,因此不建议在生产中使用。)

函数必须是静态的,但可以实例化对象。

否则,您可以在包配置中指定它们,如下所示

"events": {
	"output:html": [
		"\\ACME\\FancyBundle\\Events::randomEvent",
	]
}

可用事件(Moment 本身将在任何情况下作为第一个参数传递,但未列在以下参数列表中)

  • 认证
    • authentication:failed($user)authentication:succeeded($user) 将在相应事件发生时触发(至少在认证器的方 法没有被重写(或者至少用 parent:: 调用)的情况下)
  • 输出
    • output:html (string $html):string - 对您渲染的模板进行后处理(仅在返回 Response 对象的地方工作,因为 Moments 不知 道它产生什么)。
  • 控制器
    • controller:finished($controller, $returned) - 控制器被调用后,在输出之前。允许您调用 addMetaTag 等。

如果您在包或配置中指定了您自己的事件,您也可以通过 $moment->callEvents($name, ...$args) 调用它。

其他功能

以下组件有 docblock 注释说明其功能。在某个时候,当我们有真正的文档时,它将在这里提供,现在请直接检查文件。

  • \e7o\Moments\Output\Forms\Generator
  • \e7o\Moments\Database\Connection
  • \e7o\Moments\Output\Images\Thumbnailer
  • \e7o\Moments\Request\Routers\SimpleRouter