承接 roadiz/skeleton 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

roadiz/skeleton

Composer 安装命令:

composer create-project roadiz/skeleton

包简介

README 文档

README

Headless API project skeleton built on Roadiz v2+

Run test status

Install

COMPOSER_MEMORY_LIMIT=-1 composer create-project roadiz/skeleton my-website

Customize configuration by copying .env to .env.local:

cp .env .env.local

Make sure to tell docker-compose to use .env.local if you are changing variables used for containers initialization (MySQL / Solr / SMTP credentials). Roadiz app will read .env then will override vars with your .env.local. That's why .env file is committed in Git repository, and it MUST not contain any secret.

If Composer complains about memory limit issue, just prefix with COMPOSER_MEMORY_LIMIT=-1.

Edit your .env.local and docker-compose.yml files according to your local environment.

# Copy override file to customize your local environment
cp compose.override.yml.dist compose.override.yml
# Do not forget to add your COMPOSER_DEPLOY_TOKEN and COMPOSER_DEPLOY_TOKEN_USER
# in compose.override.yml to configure your container to fetch private repositories.
docker compose build
docker compose up -d --force-recreate

Then wait for your services to initialize, especially your database could take several seconds to initialize (filesystem, database and user creation).

When you're ready you can check that Symfony console responds through your Docker service:

docker compose exec app bin/console

Using Docker for development

If you want to ensure that your local environment is as close as possible to your production environment, you should use Docker. This skeleton comes with development and production Dockerfile configurations. So you will avoid troubles with installing PHP extensions, Solr, Varnish, Redis, MySQL, etc. You can also use composer inside your app container to install your dependencies.

# This command will run once APP container to install your dependencies without starting other services
docker compose run --rm --no-deps --entrypoint= app composer install -o

To access your app services, you will have to expose ports locally in your compose.override.yml file. Copy compose.override.yml.dist to compose.override.yml file to override your compose.yml file and expose your app container ports for local development:

# Expose all services default ports for local development
services:
    db:
        ports:
            - ${PUBLIC_DB_PORT}:3306/tcp
    nginx:
        ports:
            - ${PUBLIC_NGINX_PORT}:80/tcp
    mailer:
        ports:
            - ${PUBLIC_MAILER_PORT}:8025/tcp
    varnish:
        ports:
            - ${PUBLIC_VARNISH_PORT}:80/tcp
    redis:
        ports:
            - ${PUBLIC_REDIS_PORT}:6379/tcp
    pma:
        ports:
            - ${PUBLIC_PMA_PORT}:80/tcp
    # If you depend on private Gitlab repositories, you must use a deploy token and username
    #app:
    #    build:
    #        args:
    #            UID: ${UID}
    #            COMPOSER_DEPLOY_TOKEN: xxxxxxxxxxxxx
    #            COMPOSER_DEPLOY_TOKEN_USER: "gitlab+deploy-token-1"

Generate Symfony secrets

When you run composer create-project first time, following command should have been executed automatically:

docker compose exec app bin/console secrets:generate-keys

Then generate secrets values for your configuration variables such as APP_SECRET or JWT_PASSPHRASE:

docker compose exec app bin/console secrets:set JWT_PASSPHRASE --random
docker compose exec app bin/console secrets:set APP_SECRET --random

Make sure your remove any of these variables from your .env and .env.local files, it would override your secrets (empty values for example), and lose all benefits from encrypting your secrets.

Generate JWT private and public keys

Use built-in command to generate your key pair (following command should have been executed automatically at composer create-project):

docker compose exec app bin/console lexik:jwt:generate-keypair

Install database

Use make install command to install your database schema and fixtures.

Or manually:

# Create Roadiz database schema
docker compose exec app bin/console doctrine:migrations:migrate
# Migrate any existing data types
docker compose exec app bin/console app:install
# Install base Roadiz fixtures, roles and settings
docker compose exec app bin/console install
# Clear cache
docker compose exec app bin/console cache:clear

Before accessing the application, you need to create an admin user. Use the following command to create a user account:

# Create your admin account with the specified username and email
export EMAIL="username@roadiz.io"
docker compose exec app bin/console users:create -m $EMAIL -b -s $EMAIL
# By default, a random password will be generated for the new user.
# If you want to set a custom password, you can add the -p option followed by your desired password

Manage Node-types

Node-types can be managed through back-office interface or by editing JSON files in src/Resources/node-types directory. If you edit JSON files manually you need to synchronize your database with these files and generate Doctrine Migrations if this leads to database schema changes.

Migrate node-types

When you direct update the node-types JSON files, you need to add them into src/Resources/config.yml and run the following command to update the database:

make migrate

This command will update PHP entities and create a Doctrine migration file if necessary.

Apply node-type migration

When you pull the project and just want to sync your local node-types, you need to apply the migration:

make update

This will only load node-types that are not already in the database. But it won't create any migration. This is the same script that is executed when you run make install and in your docker image entrypoint.

Features

  • Configured to be used in headless mode with API Platform
  • Configured with lexik/jwt-authentication-bundle
  • All-Docker development and production environments
  • Supervisor daemon for execution symfony/messenger consumers
  • Solr and Varnish services right out-the-box
  • Gitlab CI ready
  • Use phpcs and phpstan to ensure code-smell and static analysis
  • Packed with 4 node-types: Menu, MenuLink in order to create automatic menus in your /api/common_content response and Page and AliasBlock as a basic page and alias management system.

Common content endpoint

/api/common_content endpoint is meant to expose common data about your website. You can fetch this endpoint once in your website frontend, instead of embedding the same data in each web response. menus entry will automatically hold any root-level Menu tree-walker.

{
    "@context": "/api/contexts/CommonContent",
    "@id": "/api/common_content?id=unique",
    "@type": "CommonContent",
    "home": {
        "@id": "/api/pages/1",
        "@type": "Page",
        "title": "home",
        "publishedAt": "2021-09-09T02:23:00+02:00",
        "node": {
            "@id": "/api/nodes/1",
            "@type": "Node",
            "nodeName": "home",
            "visible": true,
            "tags": []
        },
        "translation": {
            "@id": "/api/translations/1",
            "@type": "Translation",
            "name": "English",
            "defaultTranslation": true,
            "available": true,
            "locale": "en"
        },
        "slug": "home",
        "url": "/"
    },
    "head": {
        "@type": "NodesSourcesHead",
        "googleAnalytics": null,
        "googleTagManager": null,
        "matomoUrl": null,
        "matomoSiteId": null,
        "siteName": "Roadiz dev website",
        "metaTitle": "Roadiz dev website",
        "metaDescription": "Roadiz dev website",
        "policyUrl": null,
        "mainColor": null,
        "facebookUrl": null,
        "instagramUrl": null,
        "twitterUrl": null,
        "youtubeUrl": null,
        "linkedinUrl": null,
        "homePageUrl": "/",
        "shareImage": null
    },
    "menus": {
        "mainMenuWalker": {
            "@type": "MenuNodeSourceWalker",
            "children": [],
            "item": { ... },
            "childrenCount": 0,
            "level": 0,
            "maxLevel": 3
        }
    }
}

Versioning

Make sure your .env file does not contain any sensitive data as it must be added to your repository: git add --force .env in order to be overridden by .env.local file. Sensitive and local data must be filled in .env.local which is git-ignored.

Conventional commits

This project uses conventional commits to automate the release process and changelog generation with git-cliff. A cliff.toml configuration file is already provided in this skeleton.

Generate a CHANGELOG file

git cliff -o CHANGELOG.md

Before releasing

  • With a known tag
    git cliff -o CHANGELOG.md --tag 1.0.0
  • Without knowing tag, let git cliff find the right version
    git cliff -o CHANGELOG.md --bump

Credits

This skeleton uses https://github.com/vishnubob/wait-for-it script to wait for MySQL readiness before launching app entrypoint.

roadiz/skeleton 适用场景与选型建议

roadiz/skeleton 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 282 次下载、GitHub Stars 达 19, 最近一次更新时间为 2022 年 01 月 06 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 roadiz/skeleton 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 roadiz/skeleton 我们能提供哪些服务?
定制开发 / 二次开发

基于 roadiz/skeleton 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 282
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 20
  • 点击次数: 2
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 19
  • Watchers: 3
  • Forks: 2
  • 开发语言: PHP

其他信息

  • 授权协议: mit
  • 更新时间: 2022-01-06