PHPackages                             lucinda/framework-engine - 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. lucinda/framework-engine

ActiveLibrary[Framework](/categories/framework)

lucinda/framework-engine
========================

API integration engine for Lucinda Framework 3.0

v3.1.1(3mo ago)023.5k↑100%12MITPHPPHP ^8.1

Since Aug 7Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/aherne/lucinda-framework-engine)[ Packagist](https://packagist.org/packages/lucinda/framework-engine)[ Docs](https://github.com/aherne/lucinda-framework-engine)[ RSS](/packages/lucinda-framework-engine/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (10)Versions (84)Used By (2)

Lucinda Framework Engine API
============================

[](#lucinda-framework-engine-api)

This API stores internal components of [Lucinda Framework 3.0](http://www.lucinda-framework.com) open for update but not open for change by developers. Most of the classes inside are dedicated at APIs binding, so only the following are of any interest to developers:

- [Lucinda\\Framework\\AbstractCacheable](#abstractcacheable)
- [Lucinda\\Framework\\AbstractLoginThrottler](#abstractloginthrottler)
- [Lucinda\\Framework\\AbstractReporter](#abstractreporter)
- [Lucinda\\Framework\\Json](#json)
- [Lucinda\\Framework\\RestController](#restcontroller)

API is fully PSR-4 compliant, only requiring PHP7.1+ interpreter and SimpleXML extension. It has 100% Unit Test coverage, using [UnitTest API](https://github.com/aherne/unit-testing) instead of PHPUnit for greater flexibility.

AbstractCacheable
-----------------

[](#abstractcacheable)

This abstract class is a [\\Lucinda\\Headers\\Cacheable](https://github.com/aherne/headers-api/blob/master/src/Cacheable.php) that binds to [STDOUT MVC API](https://github.com/aherne/php-servlets-api) in order to implement recipe for a class able to generate an ETag/LastModified header value for response to any cacheable requested resource.

That value will be used in cache-driven communication between your project and client's browser and thus make it possible for your site to answer only with 304 Not Modified header instead of full response in case latter hasn't changed.

Class defines following prototype methods developers must implement when extending:

MethodArgumentsReturnsDescriptionsetTimevoidvoidSets ETag representation of response to requested resource into **$etag** fieldsetEtagvoidvoidSets LastModified representation of response to requested resource into **$last\_modified\_time** fieldBy virtue of binding to STDOUT MVC API, classes implementing above will have access to following protected fields:

FieldTypeDescription$request[\\Lucinda\\STDOUT\\Request](https://github.com/aherne/php-servlets-api/#class-request)Request received from client.$response[\\Lucinda\\MVC\\Response](https://github.com/aherne/mvc/#class-response)Response to send back to caller.AbstractLoginThrottler
----------------------

[](#abstractloginthrottler)

This abstract class is a [\\Lucinda\\WebSecurity\\Authentication\\Form\\LoginThrottler](https://github.com/aherne/php-security-api/blob/master/src/Authentication/Form/LoginThrottler.php) that penalizes each failed login by `pow(2, failedAttempts-1)` seconds in order to fight against dictionary attacks.

Throughout the period of penalty, login will fail automatically without checking database. The more consecutive failed attempts, the greater the penalty. Once login passes, all penalties are unset.

Class defines following prototype methods developers must implement when extending:

MethodArgumentsReturnsDescriptionpersistvoidvoidTracks login attempts to a storage medium (sql or nosql database)Classes implementing above will have access to following protected fields:

FieldTypeDescription$attemptsintegerHow many attempts were made from current IP for same username.$penaltyExpirationinteger|NULLUNIX time at which penalty will expire, if anyAbstractReporter
----------------

[](#abstractreporter)

This abstract class is a [\\Lucinda\\STDERR\\Reporter](https://github.com/aherne/errors-api/#abstract-class-reporter) that binds to [Logging API](https://github.com/aherne/php-logging-api/) in order to report errors to logs based on their severity level, identified by value of attribute *error\_type* of [**exception**](https://github.com/aherne/errors-api/tree/v2.0.0#exceptions) tag @ *stderr.xml* that matches \\Exception handled:

ValueEffectnoneException is not an error so it will not be reported.clientException is an error caused by client (eg: a 404), so it will not be logged except if developers decide otherwise.serverException is an error caused by database server, so it will be logged with *emergency* priority.syntaxException is a code bug made by developers, so it will be logged with *alert* priority.logicalException is a conceptual bug discovered at runtime, so it will be logged with *critical* priority.Exception is a generic error, so it will be logged with *error* priority.Class defines following prototype method developers must implement when extending:

MethodArgumentsReturnsDescriptiongetLoggervoid[\\Lucinda\\Logging\\Logger](https://github.com/aherne/php-logging-api/#logging)Generates and returns a logger instance from matching **reporter** tag @ *stderr.xml*Json
----

[](#json)

This class is an OOP wrapper over PHP's native functions, encapsulating json generation and execution, throwing \\Lucinda\\Framework\\Json\\Exception in case process fails. Class defines following methods, all relevant to developers:

MethodArgumentsReturnsDescriptionencodemixedstringEncodes a primitive/array/object to json format.decodestringarrayDecodes a json into array.RestController
--------------

[](#restcontroller)

This abstract class is a [\\Lucinda\\MVC\\Controller](https://github.com/aherne/php-servlets-api/#abstract-class-controller) to be extended if your project is a RESTful web service API. Classes extending it must implement a method for each HTTP method respective route *supports*:

MethodArgumentsReturnsDescriptionGETvoidvoidLogic to execute when respective route is accessed via GET method.POSTvoidvoidLogic to execute when respective route is accessed via POST method.PUTvoidvoidLogic to execute when respective route is accessed via PUT method.DELETEvoidvoidLogic to execute when respective route is accessed via DELETE method.HEADvoidvoidLogic to execute when respective route is accessed via HEAD method.CONNECTvoidvoidLogic to execute when respective route is accessed via CONNECT method.OPTIONSvoidvoidLogic to execute when respective route is accessed via OPTIONS method.TRACEvoidvoidLogic to execute when respective route is accessed via TRACE method.If a route is accessed using a method not covered in its matching controller, a [\\Lucinda\\STDOUT\\MethodNotAllowedException](https://github.com/aherne/php-servlets-api/blob/master/src/MethodNotAllowedException.php) is thrown!

Unlike other frameworks, Lucinda considers controller "actions" to be an anti-pattern, a recipe for bloated illogical controllers. Only in this particular case are "actions" making a logical sense: a controller that behaves differently depending on HTTP method it's called with.

###  Health Score

55

—

FairBetter than 98% of packages

Maintenance81

Actively maintained with recent releases

Popularity24

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity86

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 97.7% 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 ~33 days

Recently: every ~144 days

Total

83

Last Release

101d ago

Major Versions

v3.0.1 → v4.0.x-dev2022-01-02

v2.2.3 → v3.0.22022-01-29

v1.4.6 → v3.0.32022-05-15

v2.0.x-dev → v3.0.82022-12-25

v1.4.9 → v3.0.92026-01-19

PHP version history (3 changes)v2.0.3PHP ^7.1

v3.0.0PHP ^8.1

v2.2.3PHP ^7.1|^8.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3382770?v=4)[Lucian Gabriel Popescu](/maintainers/aherne)[@aherne](https://github.com/aherne)

---

Top Contributors

[![aherne](https://avatars.githubusercontent.com/u/3382770?v=4)](https://github.com/aherne "aherne (84 commits)")[![luciangreentree](https://avatars.githubusercontent.com/u/20677068?v=4)](https://github.com/luciangreentree "luciangreentree (2 commits)")

### Embed Badge

![Health badge](/badges/lucinda-framework-engine/health.svg)

```
[![Health](https://phpackages.com/badges/lucinda-framework-engine/health.svg)](https://phpackages.com/packages/lucinda-framework-engine)
```

###  Alternatives

[nolimits4web/swiper

Most modern mobile touch slider and framework with hardware accelerated transitions

41.8k177.2k1](/packages/nolimits4web-swiper)[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k36.7M259](/packages/laravel-dusk)[laravel/prompts

Add beautiful and user-friendly forms to your command-line applications.

712181.8M596](/packages/laravel-prompts)[cakephp/chronos

A simple API extension for DateTime.

1.4k47.7M121](/packages/cakephp-chronos)[laravel/pail

Easily delve into your Laravel application's log files directly from the command line.

91545.3M590](/packages/laravel-pail)[nette/bootstrap

🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.

68535.8M592](/packages/nette-bootstrap)

PHPackages © 2026

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