siemendev/forskel
Forskel实现了为多站symfony项目提供的完全解耦的前端提供者。
Requires
- php: ^7.1.3
- symfony/framework-bundle: ^4.0
- symfony/twig-bundle: ^4.0
- symfony/yaml: ^4.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^7
Conflicts
- symfony/symfony: <4.0
This package is auto-updated.
Last update: 2024-09-27 00:29:10 UTC
README
Forskel
Forskel是一个松散耦合的前端渲染库,适用于具有相同前端标记的多站symfony项目。
听起来不错,对吧?但这到底是什么意思?
当使用相同的前端为多个symfony项目时,降低冗余的一种方式是将前端架构与实际业务逻辑解耦到一个自己的bundle中。从这个方法出发,我开发了Forskel,以将模板从操作symfony项目中分离出来。
使用Forskel,您可以在项目中编写超级干净、面向对象的代码,而不是在项目中编写模板标记,同时您可以在一个地方维护所有这些模板的标记:基于Forskel的扩展Bundle。
试试看,让我带你来实现Forskel!
首先,有一件事很重要要理解:您不会在普通项目中实现Forskel。 Forskel旨在用作您自己的外部前端bundle的基本库/工具。
设置您的第一个Forskel bundle
让我们直接跳到从演示项目开始实现Forskel的基本示例。
- 根据Symfony文档,在项目根目录外设置可重用的Bundle。
- 在您的bundle中安装Forskel:
$ composer require siemendev/forskel - 通过在composer.json中配置本地仓库,在您的其中一个主要项目中安装您的可重用bundle。只要您在本地开发,您可能希望通过path仓库类型链接bundle。稍后,在生产环境中,您可能使用vcs仓库来安装您项目中的特定稳定版本的bundle。
- 注意:除非您仍然想使用它,否则从现在起将不再在项目仓库中使用twig模板引擎。所有模板都将在您新创建的bundle内部创建和维护。
就这样,我们已经准备好了!
实现您的第一个模型
- 创建您的模型文件,例如[包源根]/models/MyFancyPage.php
namespace vendor\FrontendBundle\Models; use siemendev\ForskelBundle\Models\AbstractModel; use siemendev\ForskelBundle\Models\ModelInterface; class MyFancyPage extends AbstractModel { /** @var string */ public $headline; /** @var ModelInterface[] */ public $contents; }
技巧:在这里使用私有属性,并使用适当类型敏感的getters和setters,可以强制您的属性具有正确的类型!
- 在[包源根]/Resources/views/my-fancy-page.html.twig中创建相应的模板
<html> <body> <p>This is my fancy page.</p> {% if model.headline is not empty %} <h1>{{ model.headline }}</h1> {% endif %} {% for content in model.contents %} {{ forskel_render(content) }} {% endfor %} </body> </html>
在bundle方面,我们已经准备好了,现在让我们转到您手动安装bundle的项目本身。
填充模型并渲染
在这个例子中,我们使用一个现有的控制器,即已安装我们之前创建的可重用bundle的任何项目的IndexController(见设置3)。
通常,您会在控制器末尾使用return $this->render();语句来渲染视图,让我们看看Forskel如何改变这一点
namespace vendor\ProjectBundle\Controller; use vendor\FrontendBundle\Models\MyFancyPage; use siemendev\ForskelBundle\Renderers\TwigRenderer; class IndexController extends AbstractController { /** * @Route("/", name="index") */ public function index(TwigRenderer $forskel) { $page = new MyFancyPage(); $page->headline = 'This page is so fancy!'; return $forskel->render($page)); } }
技巧:如果您不想在每个控制器中手动注入Renderer,请尝试扩展symfony的AbstractController以自动加载renderer。
大师技巧:在扩展的AbstractController中覆盖render()方法。这样,您就移除了内置的twig渲染,这迫使项目中的开发人员更多地使用Forskel进行前端渲染。
欢迎贡献!
如果您正在尝试使用 Forskel 并有一些反馈,请打开一个issue或在GitHub仓库中直接开始贡献,我非常感谢每一份帮助让 Forskel 更好!