PHPackages                             laminas/laminas-mvc-skeleton - 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. [Framework](/categories/framework)
4. /
5. laminas/laminas-mvc-skeleton

ActiveProject[Framework](/categories/framework)

laminas/laminas-mvc-skeleton
============================

Laminas MVC Skeleton Application

2.4.0(1y ago)18088.0k↑195.2%64[4 issues](https://github.com/laminas/laminas-mvc-skeleton/issues)[9 PRs](https://github.com/laminas/laminas-mvc-skeleton/pulls)BSD-3-ClausePHPPHP ~8.1.0 || ~8.2.0 || ~8.3.0CI passing

Since Sep 14Pushed 2mo ago28 watchersCompare

[ Source](https://github.com/laminas/laminas-mvc-skeleton)[ Packagist](https://packagist.org/packages/laminas/laminas-mvc-skeleton)[ Fund](https://funding.communitybridge.org/projects/laminas-project)[ RSS](/packages/laminas-laminas-mvc-skeleton/feed)WikiDiscussions 2.5.x Synced 1mo ago

READMEChangelog (10)Dependencies (10)Versions (28)Used By (0)

laminas-mvc-skeleton
====================

[](#laminas-mvc-skeleton)

> ## 🇷🇺 Русским гражданам
>
> [](#-русским-гражданам)
>
> Мы, участники Laminas, родились и живем в разных странах. У многих из нас есть друзья, родственники и коллеги как в России, так и в Украине. Некоторые из нас родились в России. Некоторые из нас живут в России. У некоторых бабушки и дедушки сражались с фашистами во Второй мировой войне. Здесь никто не поддерживает фашизм.
>
> У одного из нас есть украинская родственница, которая спаслась из дома вместе с сыном. Поезд задержался из-за бомбежки на дороге впереди. У нас есть друзья, которые прячутся в бомбоубежищах. Мы с тревогой ждем весточки от них после воздушных налетов, которые беспорядочно наносят удары и попадают по больницам, школам, детским садам и домам. Мы не берем это из каких-либо СМИ. Мы наблюдаем это напрямую.
>
> Вы доверяете нам достаточно, чтоб использовать наши программы, и мы просим вас довериться нам вновь. Мы нуждаемся в помощи. Выходите и протестуйте против этой бесполезной войны. Остановите кровопролитие. Скажите "Нет войне!"
>
> ## 🇺🇸 To Citizens of Russia
>
> [](#-to-citizens-of-russia)
>
> We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism.
>
> One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences.
>
> You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!"

Introduction
------------

[](#introduction)

This is a skeleton application using the Laminas MVC layer and module systems. This application is meant to be used as a starting place for those looking to get their feet wet with Laminas MVC.

Installation using Composer
---------------------------

[](#installation-using-composer)

The easiest way to create a new Laminas MVC project is to use [Composer](https://getcomposer.org/). If you don't have it already installed, then please install as per the [documentation](https://getcomposer.org/doc/00-intro.md).

To create your new Laminas MVC project:

```
$ composer create-project -sdev laminas/laminas-mvc-skeleton path/to/install
```

Once installed, you can test it out immediately using PHP's built-in web server:

```
$ cd path/to/install
$ php -S 0.0.0.0:8080 -t public
# OR use the composer alias:
$ composer serve
```

This will start the cli-server on port 8080, and bind it to all network interfaces. You can then visit the site at  which will bring up Laminas MVC Skeleton welcome page.

**Note:** The built-in CLI server is *for development only*.

Development mode
----------------

[](#development-mode)

The skeleton ships with [laminas-development-mode](https://github.com/laminas/laminas-development-mode)by default, and provides three aliases for consuming the script it ships with:

```
$ composer development-enable  # enable development mode
$ composer development-disable # disable development mode
$ composer development-status  # whether or not development mode is enabled
```

You may provide development-only modules and bootstrap-level configuration in `config/development.config.php.dist`, and development-only application configuration in `config/autoload/development.local.php.dist`. Enabling development mode will copy these files to versions removing the `.dist` suffix, while disabling development mode will remove those copies.

Development mode is automatically enabled as part of the skeleton installation process. After making changes to one of the above-mentioned `.dist` configuration files you will either need to disable then enable development mode for the changes to take effect, or manually make matching updates to the `.dist`-less copies of those files.

Running Unit Tests
------------------

[](#running-unit-tests)

To run the supplied skeleton unit tests, you need to do one of the following:

- During initial project creation, select to install the MVC testing support.
- After initial project creation, install [laminas-test](https://docs.laminas.dev/laminas-test/):

    ```
    $ composer require --dev laminas/laminas-test
    ```

Once testing support is present, you can run the tests using:

```
$ ./vendor/bin/phpunit
```

If you need to make local modifications for the PHPUnit test setup, copy `phpunit.xml.dist` to `phpunit.xml` and edit the new file; the latter has precedence over the former when running tests, and is ignored by version control. (If you want to make the modifications permanent, edit the `phpunit.xml.dist` file.)

Running Psalm Static Analysis
-----------------------------

[](#running-psalm-static-analysis)

To run the supplied skeleton static analysis, you need to do one of the following: It is recommended to install the test components from laminas (laminas/laminas-test), as this is used in the tests supplied.

```
$ composer require --dev vimeo/psalm psalm/plugin-phpunit laminas/laminas-test
```

Once psalm support is present, you can run the static analysis using:

```
$ composer static-analysis
```

Using docker-compose
--------------------

[](#using-docker-compose)

This skeleton provides a `docker-compose.yml` for use with [docker-compose](https://docs.docker.com/compose/); it uses the provided `Dockerfile` to build a docker image for the `laminas` container created with `docker-compose`.

Build and start the image and container using:

```
$ docker-compose up -d --build
```

At this point, you can visit  to see the site running.

You can also run commands such as `composer` in the container. The container environment is named "laminas" so you will pass that value to `docker-compose run`:

```
$ docker-compose run laminas composer install
```

Some composer packages optionally use additional PHP extensions. The Dockerfile contains several commented-out commands which enable some of the more popular php extensions. For example, to install `pdo-pgsql` support for `laminas/laminas-db` uncomment the lines:

```
# RUN apt-get install --yes libpq-dev \
#     && docker-php-ext-install pdo_pgsql
```

then re-run the `docker-compose up -d --build` line as above.

> You may also want to combine the various `apt-get` and `docker-php-ext-*`statements later to reduce the number of layers created by your image.

Web server setup
----------------

[](#web-server-setup)

### Apache setup

[](#apache-setup)

To setup apache, setup a virtual host to point to the public/ directory of the project and you should be ready to go! It should look something like below:

```

    ServerName laminasapp.localhost
    DocumentRoot /path/to/laminasapp/public

        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all

        Require all granted

```

### Nginx setup

[](#nginx-setup)

To setup nginx, open your `/path/to/nginx/nginx.conf` and add an [include directive](http://nginx.org/en/docs/ngx_core_module.html#include) below into `http` block if it does not already exist:

```
http {
    # ...
    include sites-enabled/*.conf;
}
```

Create a virtual host configuration file for your project under `/path/to/nginx/sites-enabled/laminasapp.localhost.conf`. It should look something like below:

```
server {
    listen       80;
    server_name  laminasapp.localhost;
    root         /path/to/laminasapp/public;

    location / {
        index index.php;
        try_files $uri $uri/ @php;
    }

    location @php {
        # Pass the PHP requests to FastCGI server (php-fpm) on 127.0.0.1:9000
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /path/to/laminasapp/public/index.php;
        include fastcgi_params;
    }
}
```

Restart the nginx, now you should be ready to go!

QA Tools
--------

[](#qa-tools)

The skeleton does not come with any QA tooling by default, but does ship with configuration for each of:

- [phpcs](https://github.com/squizlabs/php_codesniffer)
- [laminas-test](https://docs.laminas.dev/laminas-test/)
- [phpunit](https://phpunit.de)

Additionally, it comes with some basic tests for the shipped `Application\Controller\IndexController`.

If you want to add these QA tools, execute the following:

```
$ composer require --dev squizlabs/php_codesniffer laminas/laminas-test
```

We provide aliases for each of these tools in the Composer configuration:

```
# Run CS checks:
$ composer cs-check
# Fix CS errors:
$ composer cs-fix
# Run PHPUnit tests:
$ composer test
```

###  Health Score

60

—

FairBetter than 99% of packages

Maintenance65

Regular maintenance activity

Popularity50

Moderate usage in the ecosystem

Community30

Small or concentrated contributor base

Maturity80

Battle-tested with a long release history

 Bus Factor4

4 contributors hold 50%+ of commits

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 ~89 days

Recently: every ~145 days

Total

21

Last Release

280d ago

Major Versions

1.4.x-dev → 2.0.02023-03-09

PHP version history (4 changes)1.0.0PHP ^7.3

1.2.0PHP ^7.3 || ~8.0.0

2.0.0PHP ~8.0.0 || ~8.1.0 || ~8.2.0

2.3.0PHP ~8.1.0 || ~8.2.0 || ~8.3.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/25943?v=4)[Matthew Weier O'Phinney](/maintainers/weierophinney)[@weierophinney](https://github.com/weierophinney)

---

Top Contributors

[![Xerkus](https://avatars.githubusercontent.com/u/725842?v=4)](https://github.com/Xerkus "Xerkus (44 commits)")[![samsonasik](https://avatars.githubusercontent.com/u/459648?v=4)](https://github.com/samsonasik "samsonasik (25 commits)")[![michalbundyra](https://avatars.githubusercontent.com/u/7423207?v=4)](https://github.com/michalbundyra "michalbundyra (22 commits)")[![nusphere](https://avatars.githubusercontent.com/u/5822825?v=4)](https://github.com/nusphere "nusphere (12 commits)")[![laminas-bot](https://avatars.githubusercontent.com/u/68250880?v=4)](https://github.com/laminas-bot "laminas-bot (11 commits)")[![renovate[bot]](https://avatars.githubusercontent.com/in/2740?v=4)](https://github.com/renovate[bot] "renovate[bot] (10 commits)")[![froschdesign](https://avatars.githubusercontent.com/u/103362?v=4)](https://github.com/froschdesign "froschdesign (9 commits)")[![Ocramius](https://avatars.githubusercontent.com/u/154256?v=4)](https://github.com/Ocramius "Ocramius (7 commits)")[![gsteel](https://avatars.githubusercontent.com/u/2803720?v=4)](https://github.com/gsteel "gsteel (7 commits)")[![tyrsson](https://avatars.githubusercontent.com/u/1237487?v=4)](https://github.com/tyrsson "tyrsson (7 commits)")[![TomHAnderson](https://avatars.githubusercontent.com/u/493920?v=4)](https://github.com/TomHAnderson "TomHAnderson (7 commits)")[![jguittard](https://avatars.githubusercontent.com/u/5320213?v=4)](https://github.com/jguittard "jguittard (6 commits)")[![jarrettj](https://avatars.githubusercontent.com/u/777547?v=4)](https://github.com/jarrettj "jarrettj (5 commits)")[![ghostwriter](https://avatars.githubusercontent.com/u/9754361?v=4)](https://github.com/ghostwriter "ghostwriter (4 commits)")[![weierophinney](https://avatars.githubusercontent.com/u/25943?v=4)](https://github.com/weierophinney "weierophinney (4 commits)")[![rieschl](https://avatars.githubusercontent.com/u/3321556?v=4)](https://github.com/rieschl "rieschl (2 commits)")[![Koen1999](https://avatars.githubusercontent.com/u/32361020?v=4)](https://github.com/Koen1999 "Koen1999 (1 commits)")[![thalles](https://avatars.githubusercontent.com/u/2185023?v=4)](https://github.com/thalles "thalles (1 commits)")[![ittmann](https://avatars.githubusercontent.com/u/8256322?v=4)](https://github.com/ittmann "ittmann (1 commits)")[![imonteiro](https://avatars.githubusercontent.com/u/3138089?v=4)](https://github.com/imonteiro "imonteiro (1 commits)")

---

Tags

mvcskeleton-applicationframeworklaminasmvcSkeleton

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/laminas-laminas-mvc-skeleton/health.svg)

```
[![Health](https://phpackages.com/badges/laminas-laminas-mvc-skeleton/health.svg)](https://phpackages.com/packages/laminas-laminas-mvc-skeleton)
```

PHPackages © 2026

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