potherca / katwizy
🌟 适用于轻量级项目的更干净的 Symfony 安装。 🏁🚗💨
Requires
- composer/composer: ^1.2
- sensio/generator-bundle: ^3.0
- symfony/framework-standard-edition: ^3.0
- vlucas/phpdotenv: ^2.4
Requires (Dev)
- phpunit/phpunit: ^5.6
README
🔔 简介
🌟 帮助您的项目完成干净的收尾。 🏁🚗💨
🎯 项目目标
Katwizy 有以下目标
- 项目代码应该是项目仓库中 唯一 的代码
- 所有 供应商代码都应该位于
vendor
目录中1 - 所有需要在项目目录中的文件都应该被 生成 并
.gitignore
化 - 项目的 composer 文件应该干净,并且尽可能地不包含框架条目
- Katwizy 应该只在项目与 Symfony 之间形成一个薄层。
- 功能应该是可配置的
- 配置不应该在代码中完成
1 这包括 所有 Symfony 代码。
🏗 安装
通过 composer 安装 Katwizy 包
composer require potherca/katwizy
这将同时安装 Symfony 框架2。
2 以及标准 Symfony 安装中包含的所有捆绑包。
🌟 使用方法
Katwizy 隐藏了所有标准的 Symfony 文件,因此您的项目只需要实现它需要的部分。
最小示例
要开始所需的绝对最小内容是一个包含 index.php
文件的 web
目录,该文件执行以下操作
- 获取 Composer 自动加载器
- 声明一个控制器(包括路由)
- 运行引导程序
这样的文件可能看起来像这样
// web/index.php
<?php
$loader = require dirname(__DIR__).'/vendor/autoload.php';
class Website extends Symfony\Bundle\FrameworkBundle\Controller\Controller
{
/**
* @Sensio\Bundle\FrameworkExtraBundle\Configuration\Route("/")
* @Sensio\Bundle\FrameworkExtraBundle\Configuration\Route("/{name}")
*/
final public function homepage($name = 'world')
{
return new Symfony\Component\HttpFoundation\Response(
sprintf('<p>Hello %s!</p>', $name)
);
}
}
Potherca\Katwizy\Bootstrap::run(
$loader,
Symfony\Component\HttpFoundation\Request::createFromGlobals()
);
/*EOF*/
有关此示例的单独存储库在此
下一步
接下来可以做的事情有很多
- 在单独的文件中声明控制器。所有位于
src
目录中的文件也将被扫描以查找路由注解 - 在单独的配置文件中声明路由,而不是使用注解。
配置
可以通过向 config
目录添加某些文件来配置各种内容
捆绑包
可以通过 bundles.yml
文件将捆绑包添加到 AppKernel 中。不需要(或不可能)编辑 AppKernel。必须为 prod
、test
和 dev
捆绑包定义单独的部分。在 prod
部分中定义的所有捆绑包也将加载到 test
和 dev
环境中。
通用配置
通用配置可以由单独的 config.yml
文件管理。
参数
要在其他配置文件中使用参数可以存储在 parameters.yml
文件中。此文件将在其他配置文件之前加载。
模拟环境变量
除了参数文件外,还可以使用所谓的 .env
文件。
这是通过将名为 .env
的文件添加到项目根目录中完成的。在 .env
文件中的条目将用于从 getenv()
/$_ENV
/$_SERVER
中加载。
对于需要在 Symfony 配置中加载的 .env
文件中的变量,它们需要以 SYMFONY__
为前缀,如 在 Symfony 烹饪书中所述。
在配置名称中包含一个点号".",请在变量名称中使用两个下划线"__"。(双下划线将被点号替换,因为在环境变量名称中点号不是一个有效字符)。变量也可以通过将现有的环境变量包裹在${…}
中来嵌套。
例如:
BASE_DIR="/var/webroot/project-root"
CACHE_DIR="${BASE_DIR}/cache"
TMP_DIR="${BASE_DIR}/tmp"
路由
路由可以通过routes.yml
文件进行配置。
安全性
安全配置可以通过security.yml
文件进行。Symfony标准版已经默认加载了安全配置。
服务
服务可以通过services.yml
文件进行配置。
Composer 脚本命令
在composer.json
文件的scripts
部分变得很大是很常见的情况。一个简单的解决方案是创建一个脚本,它包含所有应该被调用的条目。
Katwizy提供了一个抽象基类AbstractScriptEventHandler
,使得从Composer脚本中添加命令变得非常简单。
扩展类需要做的只是实现getCommands
函数,并将命令类添加到项目composer.json
文件中的script
部分。
扩展AbstractScriptEventHandler
一个实现可能看起来像这样
<?php
use Composer\Script\ScriptEvents;
use Composer\Script\Event;
use Potherca\Katwizy\Command\ImmutableCommand;
use Potherca\Katwizy\Command\ScriptEventHandler;
class ScriptEventHandler extends ScriptEventHandler
{
/**
* Return commands to be run after composer install/update.
*
* To only call certain scripts on specific events, get the event name (with
* `$event->getName()`) and check it against the available events in
* Composer\Script\ScriptEvents. The most commonly used events are:
*
* - ScriptEvents::POST_INSTALL_CMD
* - ScriptEvents::POST_UPDATE_CMD
*
* Command provided by the Symfony `console` command should be marked as
* `COMMAND_TYPE_SYMFONY`. These will be handled the same as COMMAND_TYPE_SHELL
*
* @param Event $event
*
* @return ImmutableCommand[]
*
* @throws \InvalidArgumentException
*/
final public function getCommands(Event $event)
{
$commands = [];
if (in_array($event->getName(), [ScriptEvents::POST_UPDATE_CMD, ScriptEvents::POST_INSTALL_CMD])) {
$commands[] = new ImmutableCommand(
ImmutableCommand::COMMAND_TYPE_SYMFONY,
'assets:install'
);
}
if ($event->getName() === ScriptEvents::POST_UPDATE_CMD) {
$commands[] = new ImmutableCommand(
ImmutableCommand::COMMAND_TYPE_PHP,
'Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache'
);
}
return $commands;
}
}
/*EOF*/
将脚本添加到composer.json
在创建命令类之后,可以像这样将其添加到composer文件中
{
"require": {
"…": "…"
}
"scripts": {
"symfony-scripts": ["\\ScriptEventHandler::handleEvent"],
"post-install-cmd": ["@symfony-scripts"],
"post-update-cmd": ["@symfony-scripts"]
}
}
关于配置的更多详细信息
由于routes.yml
、security.yml
和services.yml
是单独加载的,因此不需要从通用配置文件中包含它们。
对于config.yml
、parameters.yml
、routes.yml
、security.yml
和services.yml
文件,Katwizy将首先查找特定于环境的文件,然后再查找通用文件。例如,对于配置文件,Katwizy将首先查找config_prod.yml
文件(或config_test.yml
或config_dev.yml
,具体取决于环境)。如果没有找到,将查找config.yml
文件。
这允许创建一个通用配置,该配置可以从特定于环境的文件中包含。任何没有特定配置文件的环境都将默认使用通用配置文件。
可用的命令
- Symfony的
console
命令可以从供应商的bin
目录访问。默认情况下是vendor/bin/
(但可以通过composer.json
进行配置) flotsam
命令(也在供应商bin
目录中)可以运行,以将Symphony标准版中的其他功能链接到项目目录(并将它们添加到.gitignore
文件)。
调试
默认情况下,Symfony包含两个用于网络访问的独立文件:app.php
用于生产,app_dev.php
用于开发。访问前者时,调试模式被禁用,访问后者时,调试模式被启用。除了引起各种不便之外,这还会导致开发者在生产环境中调试问题时的麻烦。
尽管存在一个名为SYMFONY_DEBUG
的环境变量,但这个变量只被Symfony的配置文件所尊重,而不是app(_dev).php
文件。
在Katwizy中,环境变量SYMFONY_DEBUG
确实被index.php
所尊重。3
除此之外,可以通过设置名为DEBUG_TOKEN
的环境变量并从请求的GET或POSTdebug-token
变量、Cookie的debug-token
值或DEBUG-TOKEN
头中引用它来触发调试模式。
为了方便使用,当通过GET、POST或Header设置调试令牌时,它将自动设置为Cookie值。
3它还由console
命令所尊重。
🤖 它是如何工作的
Katwizy 实现了一个自定义内核,它改变了 Symfony 查找内容的位置。
有关如何实现此功能的更多信息,请参阅 Symfony 手册中关于 微内核特性、覆盖 Symfony 目录结构 和 Symfony 内核配置 的页面。
📝 其他信息
©️ 许可证
此项目的源代码在 GPL-3.0+ 许可证(GNU 通用公共许可证第 3.0 版或更高版本)下提供——由 Potherca 创建
💡 来源/动机
Symfony 手册提供了多种开始新项目的方法。
它们(或多或少)都导致一个脚本,该脚本将大量文件放入您选择的目录中。
然后手册告诉您只需将所有这些混乱提交到 git。对于小型项目和概念验证,这基本上是在您的干净新代码库中污染了大量的供应商代码。
其中大部分文件永远不会被编辑,导致您的存储库中充满了以“初始提交”为消息的文件,永远如此。
最后,创建的 composer.json
文件充满了冗长的条目,如果使用其他方法,这些条目可以更短。
一定有更好的方法。
Katwizy 试图提供这种“更好的方法”。
4 更准确地说:18个文件夹中的38个文件。 5 如同 composer 元包,一个文件用于添加 composer-scripts,一个 Symfony composer 插件,一个从 extra
部分链接的配置文件。
🤔 关于名称
Katwizy 提供轻量级运输。该名称是两个轻量级汽车模型的合成词。福特 Ka 和雷诺 Twizy。
它 不是 波兰语中“猫签证”的翻译。那只是一个愉快的巧合。
💮 关于标志
❓ 常见问题解答
❔您的项目中的 Symfony 代码有什么问题?
Symfony 的结构方式(如今大多数框架都是这样)使得目录实际上并不能显示应用程序所涉及的领域。Ruby Midwest 2011 会议上的一个由Uncle Bob做的演讲详细解释了这个问题。
❔为什么不简单地使用 Silex?
拥有“轻量级 Symfony”的最常见的解决方案是使用 Silex。然而,这有一个问题……Silex 不是 Symfony。这意味着还需要学习另一个框架,Bundles 将 不会 工作6,问题从面向框架的目录结构转变为另一个框架的目录结构。所以……谢谢。
6 不,不是所有捆绑包的功能都通过其他方式在 Silex 中可用。
❔安装了哪些包/捆绑包?
以下是 Katwizy 安装的捆绑包和包
包
- vlucas/phpdotenv - 自动从
.env
加载环境变量到getenv()
/$_ENV
/$_SERVER
。
捆绑包
- DoctrineBundle - 添加对 Doctrine ORM 的支持
- FrameworkBundle - 核心Symfony框架捆绑包
- MonologBundle - 添加对 Monolog 日志库的支持
- SecurityBundle - 通过集成 Symfony 的安全组件添加安全功能
- SensioFrameworkExtraBundle - 添加包括模板和路由注解功能在内的多个增强功能
- SwiftmailerBundle - 添加对 Swiftmailer(一个用于发送电子邮件的库)的支持
- TwigBundle - 添加对 Twig 模板引擎的支持
仅在 dev
/test
环境中
- DebugBundle - 添加了Debug和VarDumper组件集成
- SensioDistributionBundle - 添加了配置和操作Symfony分发的功能
- SensioGeneratorBundle - 添加了代码生成功能
- WebProfilerBundle - 添加了性能分析功能以及网络调试工具栏
❔为什么所有的地方都有表情符号和脚注?
我不喜欢我的文档枯燥无味且单调。仅此而已。