boke0 / boke0ick_mecha
使用微框架制作的舒适CMS。
Requires
- boke0/clavicle: ^1.6
- boke0/rose: ^1.2
- boke0/scapula: ^1.6
- boke0/skull: ^2.1
- cosmicvelocity/media-types: >=1.0
- erusev/parsedown-extra: ^0.7.1
- mnapoli/front-yaml: ^1.6
- twig/twig: ^3.0
Requires (Dev)
- mockery/mockery: ^1.3
- phpunit/phpunit: ^8.5
README
这是一个以现代API实现为目标的PHP CMS。可以使用用于Twig的HTML(与Python的Jinja具有相同语法的模板引擎)来创建主题,并可以使用Markdown来编写文章。
通过设置配置文件,可以以作者的方式对每个页面的主题和路由进行详细设置。
安装方法
使用Composer
# hogeディレクトリにプロジェクトを作成します
composer create-project boke0/boke0ick_mecha hoge
使用Git和Composer
git clone https://github.com/boke0/boke0ick_mecha.git
cd boke0ick_mecha
composer install
目录结构
.
├── Dockerfile
├── README.md
├── composer.json
├── composer.lock
├── contents ...記事のMarkdownや設定ファイルを置く場所
├── default.conf
├── docker-compose.yml
├── plugins ...プラグインをインストールする場所
├── public ...公開ディレクトリ
├── src ...本体ソースコード
├── static ...テーマに依存しない素材などを置く場所
├── themes ...テーマをインストールする場所
└── vendor
网站的设置结构
URL设计在contents/struct.json中描述。
[ { "theme":"default", "routes":[ { "path":"/", "type":"index" }, { "path":"/about", "type":"about" } ] }, { "theme":"hoge", "routes":[ { "path":"/article/:id", "type":"article" }, { "path":"/news/:id", "rule":"/n/files/:id" "type":"article" } ] } ]
在上述设置中,路由如下所示
对于示例,基本上使用与URL相同的规则来引用文章文件。如果需要应用异常规则,请指定rule指令。
如果contents中的引用目标是目录,则加载该目录的__index.md。
文章的发表
请用Markdown来描述文章。
此时,可以编写YAML格式的FrontMatter,并设置元信息,因为Hugo等也支持。
--- title: タイトルhogehoge date: 2020/1/24 --- こんちは
主题的安装
将目录复制到themes/目录。
插件安装
将插件目录复制到plugins/目录。此时,请确保__construct.php放置在plugins/<插件名>/__construct.php的路径上。
主题制作
可以在themes/目录内创建目录,并在其中放置twig的HTML模板文件来创建主题。
主题发布
如果想要公开主题的源代码,建议使用Git来管理主题目录。这样,用户就可以通过clone themes/目录下的存储库来开始使用。
如果想要在主题中使用自定义素材,可以在主题目录内放置素材,并指定以下URI。
/asset?theme=<テーマ名>&filename=<ディレクトリ内のパス>
插件开发
可以通过在plugins/目录内创建目录并在其中放置PHP文件来创建插件。
在插件目录内,至少需要放置__construct.php。该文件由Boke0\Mechanism\Plugins从主体调用,并据此设置插件的行为。
以下以默认安装的SamplePlugin为例进行说明。
<?php namespace Boke0\Mechanism\Plugins\SamplePlugin; use \Boke0\Mechanism\Api\Plugin; $plugin=new Plugin(); $plugin->endpoint(SampleEndpoint::class); $plugin->templateExtension(SampleTemplateExtension::class); return $plugin;
插件的名空间应遵循Psr-4,为Boke0\Mechanism\Plugins<插件名>。
在此程序中创建一个继承自Boke0\Mechanism\Api\Plugin的类的对象,设置扩展功能并返回对象。
API使用
介绍由Boke0\Mechanism提供的API。初版中,
- 创建自定义端点
- 扩展模板引擎
两个功能被安装。
创建端点
可以设置在任意URL上执行特定类方法。
<?php namespace Boke0\Mechanism\Plugins\SamplePlugin; use \Boke0\Mechanism\Api\Endpoint; /** * @path /sampleendpoint */ class SampleEndpoint extends Endpoint{ public function handle($req,$args){ $res=$this->createResponse(); $body=$res->getBody(); $body->write("Hello world!"); return $res->withBody($body); } }
创建端点时,请定义继承自Boke0\Mechanism\Api\Endpoint的类。
如下所示,在文档注释中设置路径。可以设置路径,也可以设置请求时的方法。
/**
* @path /sampleendpoint/insert
* @method POST
*/
类需要实现PSR-15中定义的RequestHandler接口。Endpoint类中定义了生成PSR-7兼容响应对象的Endpoint::createResponse($status_code,$reason);方法,因此可以调用它来返回响应。
还可以使用Endpoint::twig($filename,$placeholder,$status_code,$reason)方法来直接获取使用Twig绘制的模板响应。这里使用的Twig引用插件目录的tpl/目录。此外,可以通过调用csrf_field()函数来利用Boke0\Mechanism主体中应用的CSRF防护措施。
如果插件端点需要使用自定义素材,请在/assets目录内放置素材,并指定以下URI。
/asset?plugin=<プラグイン名>&filename=<assetsディレクトリ以下のパス>
<?php namespace Boke0\Mechanism\Plugins\SamplePlugin; use \Boke0\Mechanism\Api\Endpoint; /** * @path /sampleendpoint */ class SampleEndpoint extends Endpoint{ public function handle($req,$args){ return $this->twig("sample.tpl.html"); } }
模板引用插件目录内的tpl/目录的文件。
扩展模板引擎
对于Boke0\Mechanism中渲染时使用的Twig,可以设置扩展功能(TwigExtension)。如果使用支持的方法,这里也可以应用。以下是一个模板引擎扩展的示例。
{{ sample() }}
执行
sample function this is
将显示为
<?php namespace Boke0\Mechanism\Plugins\SamplePlugin; use \Boke0\Mechanism\Api\TemplateExtension; class SampleTemplateExtension extends TemplateExtension{ public function getFunctions(){ return [ new \Twig\TwigFunction("sample",function(){ echo "sample function this is"; }) ]; } }
使用Twig扩展时,请定义继承自Boke0\Mechanism\Api\TemplateExtension的类的类。
插件发布
如果想要公开主题的源代码,建议使用Git来管理,就像主题一样。