PHPackages                             hexmakina/kadro - 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. hexmakina/kadro

ActivePackage[Framework](/categories/framework)

hexmakina/kadro
===============

PHP MVC framework

0.0.13(4y ago)084[24 issues](https://github.com/HexMakina/kadro/issues)1mitPHPPHP &gt;=7.1

Since Aug 18Pushed 10mo ago1 watchersCompare

[ Source](https://github.com/HexMakina/kadro)[ Packagist](https://packagist.org/packages/hexmakina/kadro)[ RSS](/packages/hexmakina-kadro/feed)WikiDiscussions main Synced today

READMEChangelog (10)Dependencies (15)Versions (15)Used By (1)

[![Scrutinizer Code Quality](https://camo.githubusercontent.com/c18f9751b8974db4201d637608cb4c684860009d0378982ea84ca8e3b1f1464a/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4865784d616b696e612f6b6164726f2f6261646765732f7175616c6974792d73636f72652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/HexMakina/kadro/?branch=main)[![PHP 7.4 Required](https://camo.githubusercontent.com/f63521cc590300927c6f861886420f8b50b6dc4ebe47f4f7d2712e2a9b3b1dc6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d372e342d627269676874677265656e)](https://camo.githubusercontent.com/f63521cc590300927c6f861886420f8b50b6dc4ebe47f4f7d2712e2a9b3b1dc6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d372e342d627269676874677265656e)[![PSR-3 Compliant](https://camo.githubusercontent.com/ffa38f0477c93333e85fb1a00466bb9984029c17e788e18dac39bdb0ef423f4e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d332d627269676874677265656e)](https://camo.githubusercontent.com/ffa38f0477c93333e85fb1a00466bb9984029c17e788e18dac39bdb0ef423f4e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d332d627269676874677265656e)[![PSR-4 Compliant](https://camo.githubusercontent.com/2f4700086d2e2fe807bd70b7479ef20330e582cd6a594f203de5b49015d15ab8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d342d627269676874677265656e)](https://camo.githubusercontent.com/2f4700086d2e2fe807bd70b7479ef20330e582cd6a594f203de5b49015d15ab8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d342d627269676874677265656e)[![PSR-11 Compliant](https://camo.githubusercontent.com/5824ddb8420a429e217048b30a43963eb7f038270a9a10c918302998f1e5aa2f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d31312d627269676874677265656e)](https://camo.githubusercontent.com/5824ddb8420a429e217048b30a43963eb7f038270a9a10c918302998f1e5aa2f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d31312d627269676874677265656e)[![PSR-12 Compliant](https://camo.githubusercontent.com/f5517c4a8a2438b2152b62762e852385c588ff2c1d8a028ba56d0626e1151e94/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d31322d627269676874677265656e)](https://camo.githubusercontent.com/f5517c4a8a2438b2152b62762e852385c588ff2c1d8a028ba56d0626e1151e94/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5053522d31322d627269676874677265656e)[![License](https://camo.githubusercontent.com/a1fffd8af823eeb9ec8e092ba156e9487f89b9b66d1adb67f42e2d10e82ee622/687474703a2f2f706f7365722e707567782e6f72672f6865786d616b696e612f6b6164726f2f6c6963656e7365)](https://packagist.org/packages/hexmakina/kadro)[![Latest Stable Version](https://camo.githubusercontent.com/5fb1793c51fe24b259f88a445e8cccf3291827cc598477819988266df9c561e7/687474703a2f2f706f7365722e707567782e6f72672f6865786d616b696e612f6b6164726f2f76)](https://packagist.org/packages/hexmakina/kadro)

kadro
=====

[](#kadro)

PHP MVC framework for building web applications

install
=======

[](#install)

`composer require hexmakina/kadro`

then run `vendor/hexmakina/kadro/install.php` to initialise the application with base tables and data

for instance:

`php vendor/hexmakina/kadro/install.php -db DATABASE_NAME -u DATABASE_USER -p DATABASE_PASSWORD`

or, if the password contains a blank space

`php vendor/hexmakina/kadro/install.php -db DATABASE_NAME -u DATABASE_USER -p "DATABASE_PASSWORD"`

it creates a default root user "root" with password "root"

1. Auth
-------

[](#1-auth)

### Operator

[](#operator)

### Permission

[](#permission)

### ACL

[](#acl)

2. Models
---------

[](#2-models)

### PSR-3 Logger

[](#psr-3-logger)

### PSR-4 Autoloader

[](#psr-4-autoloader)

3. Views
--------

[](#3-views)

4. Controllers
--------------

[](#4-controllers)

### Base

[](#base)

### Displays

[](#displays)

### Kadro

[](#kadro-1)

### ORM

[](#orm)

### Reception

[](#reception)

### Router

[](#router)

### Chainlings &amp; Traitor

[](#chainlings--traitor)

### Container (PSR-11 )

[](#container-psr-11-)

### Errors

[](#errors)

Base

- Routing
- Container &amp; Invoker
- Logger &amp; Errors
- Hopper
- LeMarchand
- Traitor
- LogLaddy

handles errors, routing, logging &amp; container

#### Execution &amp; Return

[](#execution--return)

to properly execute a controller method, f.i. `public function doSomething()`, a call is to be made: `$controller->execute('doSomething')`, allowing for hooks to be executed as well.

The return value of `doSomething()` will be returned, if no errors occured during the Hooks and Traitor part.

#### Hooks

[](#hooks)

when running `$controller->execute('doSomething')` , the following hooks will be called:

```
$this->prepare()
$this->before_doSomething()
$this->doSomething()
$this->after_doSomething()
$this->conclude()

```

there is no need to implement any of the calls as Base will check for their existence first regarding prepare() and conclude(), Base has a default implementation returning true

#### Traitor

[](#traitor)

Base uses the [Traitor](https://github.com/HexMakina/Traitor) trait, and calls the controller's trait-compatible methods before the controller's own methods.

Given a controller using Trait1 and Trait2, the method call list will be the following:

```
$this->Trait1_Traitor_prepare()
$this->Trait2_Traitor_prepare()
$this->prepare()

$this->Trait1_Traitor_before_doSomething()
$this->Trait2_Traitor_before_doSomething()
$this->before_doSomething()

$this->Trait1_Traitor_doSomething()
$this->Trait2_Traitor_doSomething()
$this->doSomething()

$this->Trait1_Traitor_after_doSomething()
$this->Trait2_Traitor_after_doSomething()
$this->after_doSomething()

$this->Trait1_Traitor_conclude()
$this->Trait2_Traitor_conclude()
$this->conclude()

```

5. Routing
----------

[](#5-routing)

kadro requires a 'home' route:

- GET ''

kadro reserves the following routes

```
return [
  // --- auth
  ['GET', 'checkin', 'Reception::checkin', 'checkin'],
  ['GET', 'checkout', 'Reception::checkout', 'checkout'],
  ['POST', 'identify', 'Reception::identify', 'identify'],
  ['GET', 'operator/[*:username]/toggle/active', 'Operator::change_active', 'operator_change_active'],
  ['GET', 'operator/[*:username]/change-acl/[i:permission_id]', 'Operator::change_acl', 'acl_toggle'],

  // --- TRADUKO
  ['POST', 'traduko/update_file', 'Traduko::update_file', 'traduko_update_file'],

  // --- LOCALE JSON
  ['GET', 'locale/language_codes.[a:format]', 'Export::otto_languages', 'otto_languages'],

  // --- EXPORT
  ['GET', 'export', 'Export::dashboard', 'export'], // default ExportController is dashboard
  ['GET', 'otto/language_codes.[a:format]/term/[a:search]?', 'Export::otto_languages', 'otto_languages_search'],
  ['GET', 'otto/[a:model]/distinct/[*:field].[a:format]', 'Export::otto_distinct_field', 'otto_distinct_field'],
  ['GET', 'otto/[a:model]/distinct/[*:field].[a:format]/term/[*:search]?', 'Export::otto_distinct_field', 'otto_distinct_field_where'],
  ['GET', 'export/[*:action].[a:format]', 'Export::dynamic_action_call', 'export_action_call'],
];

```

###  Health Score

27

↑

LowBetter than 49% of packages

Maintenance39

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

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

Recently: every ~36 days

Total

13

Last Release

1565d ago

PHP version history (2 changes)0.0.1PHP &gt;=7.3

0.0.10PHP &gt;=7.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/973280baa800481e705055e3603932b782065471f88e7a3bedd350c3b3a8bcfd?d=identicon)[HexMakina](/maintainers/HexMakina)

---

Top Contributors

[![HexMakina](https://avatars.githubusercontent.com/u/20891495?v=4)](https://github.com/HexMakina "HexMakina (122 commits)")

### Embed Badge

![Health badge](/badges/hexmakina-kadro/health.svg)

```
[![Health](https://phpackages.com/badges/hexmakina-kadro/health.svg)](https://phpackages.com/packages/hexmakina-kadro)
```

###  Alternatives

[prestashop/prestashop

PrestaShop is an Open Source e-commerce platform, committed to providing the best shopping cart experience for both merchants and customers.

9.0k15.4k](/packages/prestashop-prestashop)[thelia/thelia

Thelia is an ecommerce CMS.

8715.1k](/packages/thelia-thelia)[yiisoft/yii2-smarty

The Smarty integration for the Yii framework

74371.8k14](/packages/yiisoft-yii2-smarty)[mathmarques/smarty-view

Slim Framework 4 view helper built on top of the Smarty templating component

24134.7k1](/packages/mathmarques-smarty-view)[sintattica/atk

ATK business framework

4521.4k2](/packages/sintattica-atk)[bearsaturday/bearsaturday

BEAR.Saturday framework

1955.8k1](/packages/bearsaturday-bearsaturday)

PHPackages © 2026

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