使用 Symfony Flex 构建图片库博客:设置

本文是一个零到英雄项目的一部分——一个多图像库博客——用于性能基准测试和优化。 (在此处查看存储库。)在这部分中,我们将设置我们的项目,以便我们可以在接下来的几篇文章中对其进行微调,并使其快速完善。

有时你必须创建一个新的项目存储库,运行它 git init 在本地命令并启动一个新的很棒的项目。 我不得不承认我喜欢开始新事物的感觉; 这就像去冒险!

老子说:

千里之行,始于足下

我们可以将项目设置视为我们千里(用户!)旅程的第一步。 我们不确定我们到底会在哪里结束,但这会很有趣!

我们还应该牢记教授的建议。 唐纳德·克努特:

过早的优化是编程中万恶之源(或者至少是万恶之源)。

我们开发稳定、健壮、高性能的 Web 应用程序的旅程将从简单但功能强大的应用程序开始——即所谓的最小可行产品 (MVP)。 我们将使用随机内容填充数据库,进行一些基准测试并逐步提高性能。 本系列的每篇文章都将是我们旅途中的一个关卡!

本文将涵盖为我们的 Symfony Flex 项目设置项目和组织文件的基础知识。 我还将向您展示一些提示、技巧和帮助脚本,我正在使用它们来加快开发速度。

我们在建造什么?

在开始任何项目之前,您应该对最终目的地有一个清晰的认识。 你要去哪里? 谁将使用您的应用程序以及如何使用? 您正在构建的主要功能是什么? 一旦掌握了这些知识,您就可以准备好环境、第三方库,并投入到开发下一件大事中。

在本系列文章中,我们将构建一个简单的图片库博客,用户可以在其中注册或登录、上传图片,并创建带有以 Markdown 格式编写的描述的简单公共图片库。

我们将使用新的 Symfony Flex 和 Homestead(确保您已经阅读了它们的教程,因为我们不打算在这里介绍它们)。 我们选择 Flex 是因为 Symfony 4 即将发布(如果它还没有发布,那么在您阅读本文时),因为它比旧版本轻得多,并且非常适合逐步优化,它也是最流行的企业 PHP 框架发展过程中的自然步骤。

本文中引用的所有代码都可以在 GitHub 存储库中找到。

我们将使用 Twig 模板引擎、Symfony 表单和以 UUID 作为主键的 Doctrine ORM。

实体和路由将使用注解; 我们将有简单的基于电子邮件/密码的身份验证,我们将准备数据夹具来填充数据库。

开始使用该应用程序

要试用我们准备的示例,请执行以下操作:

    设置一个名为“blog”的空数据库。 从 GitHub 克隆项目存储库。 跑步 composer install. 如果您现在在浏览器中打开该应用程序,您应该会看到有关缺少数据库表的异常。 很好,因为到目前为止我们还没有创建任何表。 更新 .env 使用有效的数据库连接字符串(即更新凭据)在项目根目录中创建文件。 运行数据库初始化脚本 ./bin/refreshDb.sh 等到它生成一些漂亮的图片库。 在浏览器中打开应用程序并享受!

执行后 bin/refreshDb.sh 您应该能够看到我们网站的主页:

您可以使用凭据登录应用程序 [email protected] 和密码 123456. 有关生成的用户的更多详细信息,请参阅 LoadUserData fixture 类。

从头开始

在本节中,我们将描述如何从头开始建立一个新项目。 请随时查看示例应用程序代码库并查看详细信息。

基于创建新项目后 symfony/skeleton 通过执行命令

composer create-project "symfony/skeleton:^3.3" multi-user-gallery-blog

……我们可以首先将最小稳定性设置为“dev”,因为一些尖端的包:

composer config minimum-stability dev

…然后需要额外的包(其中一些是通过别名引用的,Flex 带来的新特性):

composer req annotations security orm template asset validator ramsey/uuid-doctrine

仅在开发环境中使用的依赖项是必需的 --dev 旗帜:

 composer req --dev fzaninotto/faker doctrine/Doctrine-Fixtures-Bundle

Flex 在幕后为我们做了一些严肃的工作,大多数库(或包)已经注册并配置了足够好的默认值! 检查 config 目录。 您可以在 composer.json 文件中检查此项目中使用的所有依赖项。

路由是通过注解定义的,所以下面会自动加入 config/routes.yaml:

controllers:
  resource: ../src/Controller/
  type: annotation

数据库、脚本和固定装置

配置 DATABASE_URL 环境变量(例如,通过编辑 .env 文件)来建立一个有效的数据库连接。 如果您使用我们自己的 Homestead Improved(推荐),您已经设置了一个名为 homestead 与用户/通行证 homestead / secret. 可以通过执行以下操作从现有实体生成数据库模式:

./bin/console doctrine:schema:create

如果这没有运行,请尝试通过调用 PHP 二进制文件来执行控制台,如下所示:

php bin/console doctrine:schema:create

如果此步骤在上面的“应用程序入门”部分中执行得很好,您应该能够在数据库中看到新创建的表(用于图库、图像和用户实体)。

如果要删除数据库模式,可以运行:

./bin/console doctrine:schema:drop --full-database --force

假装它直到你成功!

我无法想象今天在没有数据固定装置(即,用于播种数据库的脚本)的情况下开发应用程序。 通过几个简单的脚本,您可以用真实的内容填充您的数据库,这在快速开发和测试应用程序时很有用,但它也是一个健康的 CI 管道的要求。

我发现 Doctrine Fixtures Bundle 是处理数据固定装置的优秀工具,因为它支持有序固定装置(即,您可以控制执行顺序)、在脚本之间共享对象(通过引用)以及访问服务容器。

默认的 Symfony 服务配置不允许公共访问服务,因为最佳实践是注入所有依赖项。 我们需要在固定装置中提供一些服务,所以我将在其中提供所有服务 AppServices 通过将以下内容添加到公开可用 config/services.yaml:

AppService:
  resource: '../src/Service/*'
  public: true

我还使用 Faker 来获取随机但真实的数据(姓名、句子、文本、图像、地址……)。

查看使用随机图像为画廊播种的脚本,了解这种组合有多酷。

通常,我将用于删除现有数据库模式、创建新数据库模式、加载数据固定装置和其他重复性任务的命令组合到一个 shell 脚本中——例如, bin/refreshDb.sh — 这样我就可以轻松地重新生成架构并加载虚拟数据:

# Drop schema
./bin/console doctrine:schema:drop --full-database --force

# Create schema
./bin/console doctrine:schema:create

# Load fixtures
./bin/console doctrine:fixtures:load -n --fixtures src/DataFixtures/ORM

# Install assets
./bin/console assets:install --symlink

# Clear cache
./bin/console cache:clear

确保在生产环境中限制此脚本的执行,否则您会在某一时刻获得一些严肃的乐趣。

有人可能会争辩说,随机生成的数据无法重现不同的边缘情况,因此您的 CI 有时会失败或通过,具体取决于数据生成。 这是真的,你应该确保所有边缘情况都被你的固定装置覆盖。

每次发现导致错误的边缘情况时,请确保将其添加到数据固定装置中。 这将帮助您构建更健壮的系统并防止将来出现类似错误。

控制器、模板和服务

控制器类位于 srcController 目录并且不扩展现有的 Controller 课程由 FrameworkBundle. 所有的依赖都是通过构造函数注入的,使得代码的耦合度更低,更容易测试。 我不喜欢简单事物的“魔法”!

在新的 Symfony 目录结构中,模板位于 templates. 我创建了一个主模板 base.html.twig 定义基本的 HTML 结构并引用外部资源。

其他模板正在扩展它并覆盖它的块(例如,样式表、正文、标题、内容、JavaScript 和其他块)。

本地资产通过使用 asset Twig 函数,因为它将在以后为我们提供更好的控制(例如更改主机和附加查询字符串以进行版本控制)。 其他模板组织在子目录中 src/templates 目录。

默认情况下,服务会在 Symfony 的服务配置中自动注册和配置。 这样,您不需要手动配置带有过滤器的 Twig 扩展以支持 Markdown 并为位于下的图像实体生成 URL src/Twig.

源代码管理/版本控制

希望您已经了解 Git 基础知识并了解如何 .gitignore 作品。

Symfony Flex 管理默认项目 .gitignore 通过将已知的包文件和文件夹添加到忽略列表。 例如,Flex 会将以下文件添加到忽略列表中 symfony/framework-bundle:

.env
/public/bundles/
/var/
/vendor/

我们要将上传的文件存储在 var/uploads,所以我们需要先创建它。 我们可以添加一个命令来创建所有需要的目录,而不是在每个项目设置中手动执行 post-install-cmd 我们的活动 composer.json 脚本部分并让 Composer 为我们运行它(例如, "mkdir -p var/uploads"). 在此处阅读有关作曲家脚本和自动脚本的更多信息。

我们应该添加我们想要忽略的所有其他目录和文件 .gitignore 但在 Flex 管理的注释和明确标记的部分之外。

其他提示和故障排除

    检查你的 Homestead.yaml 环境变量文件。 如果你已经有一个 APP_ENV 变量,Symfony 不会尝试从 .env 文件。 你最好的选择是注释掉 APP_ENV 部分在 Homestead.yaml 只是为了安全。 由于权限的原因,Vagrant 机器中的缓存清除可能会失败。 你可以简单地运行 sudo rm -rf var/cache/* 手动清除缓存,或者如果失败,从 VM 外部清除缓存,在主机上的共享文件夹中。

结论

在本文中,我们成功地建立了一个包含实体、控制器、模板和帮助脚本的项目。 数据库中填充了虚拟内容,用户可以注册并创建自己的画廊。

在下一篇文章中,我们将演示如何使用更庞大的数据集填充数据库以在更真实的环境中测试应用程序的性能,如何设置简单的测试套件以及基于 Docker 的简单 CI。

阅读更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注