potherca/katwizy

此包已被废弃且不再维护。未建议替代包。

🌟 适用于轻量级项目的更干净的 Symfony 安装。 🏁🚗💨

v0.5.2 2017-09-20 07:39 UTC

This package is auto-updated.

Last update: 2024-06-08 21:48:56 UTC


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 目录,该文件执行以下操作

  1. 获取 Composer 自动加载器
  2. 声明一个控制器(包括路由)
  3. 运行引导程序

这样的文件可能看起来像这样

// 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。必须为 prodtestdev 捆绑包定义单独的部分。在 prod 部分中定义的所有捆绑包也将加载到 testdev 环境中。

通用配置

通用配置可以由单独的 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.ymlsecurity.ymlservices.yml是单独加载的,因此不需要从通用配置文件中包含它们。

对于config.ymlparameters.ymlroutes.ymlsecurity.ymlservices.yml文件,Katwizy将首先查找特定于环境的文件,然后再查找通用文件。例如,对于配置文件,Katwizy将首先查找config_prod.yml文件(或config_test.ymlconfig_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 - 添加了性能分析功能以及网络调试工具栏

❔为什么所有的地方都有表情符号和脚注?

我不喜欢我的文档枯燥无味且单调。仅此而已。