PHPackages                             zegnat/website-starter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. zegnat/website-starter

ActiveProject

zegnat/website-starter
======================

My minimum viable setup for starting a PHP project.

6.0.0(6y ago)3211[1 PRs](https://github.com/Zegnat/php-website-starter/pulls)0BSDPHP

Since Jan 7Pushed 2y ago1 watchersCompare

[ Source](https://github.com/Zegnat/php-website-starter)[ Packagist](https://packagist.org/packages/zegnat/website-starter)[ RSS](/packages/zegnat-website-starter/feed)WikiDiscussions develop Synced today

READMEChangelog (3)Dependencies (8)Versions (9)Used By (0)

PHP Website Starter
===================

[](#php-website-starter)

The PHP Website Starter is my minimum viable setup for starting a PHP project.

What my minimum setup is changes all the time, and this repository will change with it. The idea is that, whenever I start a new website project, I can get a checkout of the current state of this repository without having to think about where I will start.

This is heavily inspired by [the Fermi Framework](https://github.com/journeygroup/fermi) and even uses similar dependencies. But I have a slightly different way of wanting to handle my configurations and base dependencies.

Usage
-----

[](#usage)

Via Composer

```
$ composer create-project zegnat/website-starter
```

Current Practices
-----------------

[](#current-practices)

1. Using [Auryn](https://github.com/rdlowrey/auryn) to get actual dependency injections. Never pass around a container.
2. Using [PSR-7 HTTP message objects](http://www.php-fig.org/psr/psr-7/) with [PSR-17 factories](https://www.php-fig.org/psr/psr-17/)for all request and response handling.
3. Using [nyholm/psr7-server](https://github.com/Nyholm/psr7-server) to create the initial [PSR-7](http://www.php-fig.org/psr/psr-7/) request.
4. Using [Middleland](https://github.com/oscarotero/middleland) to run through all configured [PSR-15 Middlewares](https://www.php-fig.org/psr/psr-15/).
5. Using [FastRoute](https://github.com/nikic/FastRoute) to parse requested URIs and find the matching [PSR-15 RequestHandlers](https://www.php-fig.org/psr/psr-15/).
6. Using a [Zend Emitter](https://docs.zendframework.com/zend-httphandlerrunner/emitters/) to output a final response to the web server.
7. Using [PHP CS Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to check all code against a somewhat opinionated set of style rules based on the [Symfony Coding Standards](https://symfony.com/doc/current/contributing/code/standards.html).
8. Using [PHPUnit](https://phpunit.de/) to test all classes used in the project and generate coverage reports using [`phpdbg`](https://www.php.net/manual/en/book.phpdbg.php).

PSR-7 &amp; PSR-17 Providers
----------------------------

[](#psr-7--psr-17-providers)

By default this project loads [Diactoros](https://zendframework.github.io/zend-diactoros/) for its [PSR-7](http://www.php-fig.org/psr/psr-7/) objects and matching [PSR-17](https://www.php-fig.org/psr/psr-17/) factories.

The providers can easily be swapped for a different set of implementations. Simply remove the dependency from composer and add a new one. Example:

```
$ composer remove zendframework/zend-diactoros
$ composer require nyholm/psr7
```

Then change [the injector configuration](config/injector.php) to tell [Auryn](https://github.com/rdlowrey/auryn) which factories it should use. In the case of [nyholm/psr7](https://github.com/Nyholm/psr7) all of them can be defined as `Nyholm\Psr7\Factory\Psr17Factory::class`.

License
-------

[](#license)

The BSD Zero Clause License (0BSD). Please see the LICENSE file for more information.

###  Health Score

30

—

LowBetter than 67% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity68

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~114 days

Recently: every ~141 days

Total

6

Last Release

2422d ago

Major Versions

1.0.0 → 2.0.02018-01-14

2.0.0 → 3.0.02018-02-04

3.0.0 → 4.0.02018-02-05

4.0.0 → 5.0.02018-10-24

5.0.0 → 6.0.02019-08-04

### Community

Maintainers

![](https://www.gravatar.com/avatar/d3bb51da70a2669f3099430721c36fb45ab255b0486c2b3da3c9cff77db62d95?d=identicon)[Zegnat](/maintainers/Zegnat)

---

Top Contributors

[![Zegnat](https://avatars.githubusercontent.com/u/490579?v=4)](https://github.com/Zegnat "Zegnat (47 commits)")

---

Tags

middlewarephppsr-15psr-2psr-7

###  Code Quality

TestsPHPUnit

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/zegnat-website-starter/health.svg)

```
[![Health](https://phpackages.com/badges/zegnat-website-starter/health.svg)](https://phpackages.com/packages/zegnat-website-starter)
```

###  Alternatives

[bricev/jobqueue

JobQueue is a PHP component that queues `tasks` defining `jobs` which can be executed by asynchronous and/or distributed `workers`

362.4k](/packages/bricev-jobqueue)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
