Download the PHP package neophp-dev/neophp without Composer
On this page you can find all versions of the php package neophp-dev/neophp. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package neophp
NeoPHP
PHP 8.5 framework centered around:
- an application core in
neo/ - an internal CLI in
bin/neo - isolated application projects in
src/<Project>/
NeoPHP aims for a different balance than Symfony or Laravel. The goal is not to stack layers, bundles, or a very large ecosystem, but to provide a readable, compact PHP core that can be used directly to build a complete application without leaving the repository. The framework relies on a simple structure, an integrated CLI, auto-discovered core modules, and a multi-project workflow that stays explicit.
In practice, NeoPHP is aimed mainly at projects that want to move fast without adopting all the organizational complexity of large general-purpose frameworks. Compared to Symfony, it greatly reduces configuration ceremony and fragmentation between components. Compared to Laravel, it is more minimal, more direct in its architecture, and less dependent on a "magic" layer or a set of external tools. If what you need is a smaller, more predictable framework that's easier to follow end-to-end in the source code, that's exactly where NeoPHP fits.
Table of contents
- Overview
- Repository architecture
- Core map
- Execution cycle
- Project structure
- DI container and configuration
- HTTP layer
- Routing and controllers
- Twig views, assets, and translations
- Database and QueryBuilder
- ORM and repositories
- Data Mapper ORM (entities)
- Seeding
- Forms, upload, and validation
- Security: auth, password, middlewares, csrf
- Events
- Crons
- Cache, logs, mailer, profiler, and errors
- Markdown
- CLI and generators
- PHPUnit tests
- Deployment
- Dependencies and requirements
Overview
NeoPHP relies on two entry points:
public/index.phpfor the HTTP runtimebin/neofor the CLI
The core goes through Neo\App, which:
- detects the current project
- initializes the container
- registers the current project's application paths
- automatically discovers
*Module.phpmodules inneo/Core/ - orders these modules according to their dependencies, then runs
register()/boot() - activates Twig, the DB, assets, translation, auth, cache, crons, mailer, and profiler
- scans application controllers, routes, listeners, and crons
- executes the HTTP request or CLI command
- centralizes error handling
Repository architecture
The example project present in the repository is src/Test/.
Core map
The neo/Core/ core is organized by subsystem:
| Module | Description | Complexity | Progress | Doc |
|---|---|---|---|---|
Application/ |
Current project detection (HTTP/CLI), path resolution, project:* commands |
🟢 Low | ✅ Stable | README |
Asset/ |
CSS / JS / Less compilation, manifest versioning, asset() Twig helper |
🟡 Medium | ✅ Stable | README |
Console/ |
CLI framework: command scanning, AbstractCommand, colorized Input/Output |
🟡 Medium | ✅ Stable | README |
Controller/ |
AbstractController with HTTP helpers, auth, events, upload, dynamic extensions |
🟢 Low | ✅ Stable | README |
Cron/ |
#[Cron] attribute, scanner, runner with lock, standard cron expressions |
🟡 Medium | ✅ Stable | README |
Database/ |
Full Data Mapper ORM, QueryBuilder, diff migrations, forms, seeding | 🔴 High | ✅ Stable | README |
DI/ |
PSR-11 container, reflection-based autowiring, circular dependency detection | 🟡 Medium | ✅ Stable | README |
Error/ |
ErrorHandler, FrameworkException, differentiated dev/prod behavior |
🟢 Low | ✅ Stable | README |
Event/ |
Dispatcher, #[AsListener], subscribers, priorities, JSON cache in prod |
🟡 Medium | ✅ Stable | README |
Extension/ |
Utility extensions (Array, Date, File, Html, Json, Number, Path, String, Url) | 🟢 Low | ✅ Stable | README |
Http/ |
Request, Response, JsonResponse, RedirectResponse, HttpClient, Session, Flash, Cookie, Upload | 🟡 Medium | ✅ Stable | README |
Module/ |
Discovery of *Module.php, topological sort of dependencies, register()/boot() cycle |
🟡 Medium | ✅ Stable | README |
Profiler/ |
Dev debug bar, pluggable collectors (SQL, router, events, logs…) | 🟡 Medium | ✅ Stable | README |
Routing/ |
#[Route]/#[MainRoute] attributes, prod JSON cache, parameter injection, debug:router |
🟡 Medium | ✅ Stable | README |
Security/ |
Session/token auth, JWT, #[IsGranted], middlewares, CSRF |
🔴 High | ✅ Stable | README |
Testing/ |
TestCase, DatabaseTestCase, FeatureTestCase, auto scaffold via #[Test] |
🟡 Medium | 🔧 In progress | README |
Tools/Markdown/ |
Dependency-free Markdown parser, block array, markdown_blocks() Twig function and md_inline filter |
🟢 Low | ✅ Stable | README |
Translation/ |
Domains, LocaleManager, cache, Twig, translation:sync |
🟡 Medium | ✅ Stable | README |
Utils/ |
Cache (File/Redis/Array), Config, Logger, Notifications (Email/Slack/SMS), Scanner | 🟡 Medium | ✅ Stable | README |
Validator/ |
Attribute constraints + separate validators, ValidatorManager, 11 constraints |
🟡 Medium | ✅ Stable | README |
View/ |
Twig 3.x integration, extensions, app global variable, template cache |
🟢 Low | ✅ Stable | README |
Notable subfolders in neo/Core/:
Execution cycle
Over HTTP
Neo\App looks for a project by reading src/*/Config/app.config.php and compares the access key to HTTP_HOST / SERVER_NAME.
If only one project exists in src/, it is selected automatically.
In the CLI
Commands that operate on an existing project generally expect --project=ProjectName.
Notable exceptions:
project:createproject:syncapp:serve
Example:
Project structure
A project generated by app:make:project first contains:
Without the --skeleton option, the generator also adds:
Some folders are created later, when the feature is enabled:
App/Crons/viamake:cronApp/Event/Listener/viamake:eventandmake:event:listenerDatabase/Entity/viamake:entityDatabase/Migrations/on the firstdatabase:orm:diffordatabase:migration:migrateTests/viamake:testormake:test:auto
The sensitive configs database.config.php, deploy.config.php, api.config.php, and mailer.config.php are meant to be ignored by Git in the generated .gitignore.
The generator also ignores Storage/.
DI container and configuration
The Neo\Core\DI\Container container provides:
set()to register a service or a factoryget()to resolve a servicebind()to map an abstraction to an implementationmake()to instantiate a class with runtime parameters- reflection-based autowiring
- support for controller and service constructors
Example:
Configuration
The Config service loads every *.config.php file in the project and can merge *.config.test.php files during tests.
Example:
Example app.config.php:
HTTP layer
The HTTP layer is made up mainly of:
Request— incoming requestResponse/JsonResponse/RedirectResponse— HTTP responsesHttpClient— cURL HTTP client for outgoing requestsSession/Cookie/Flash— client state
Request
Request notably exposes:
getMethod()getPath()query()body()header()file()getIp()getUserAgent()getPreviousUrl()
Example:
Response
Response is used to build basic HTTP responses.
Example:
Shortcut examples via AbstractController:
HttpClient
HttpClientManager lets you make outgoing HTTP requests via cURL. It returns a standard Response object.
Common options: base_uri, query, headers, bearer, json, body, auth_basic, timeout, max_redirects.
Session, cookie, and flash
The framework automatically configures the session from session.config.php.
Example in a controller:
Twig exposes flash messages via flashes():
Routing and controllers
Routing is based on PHP attributes scanned in src/<Project>/App/Controllers.
Confirmed features:
- route prefix via
#[MainRoute(...)] - multi-method routes via
methods: [...] - dynamic parameters
{id} - optional parameters
{slug?} - regex constraints via
requirements - route caching outside the
devenvironment - typed argument injection via the container
Simple example:
More complete example:
Helpers exposed by AbstractController:
render()template()redirectToRoute()redirectToPath()redirectBack()json()jsonSuccess()jsonError()auth()dispatch()upload()getSession()getFlash()getCookie()- access to
Logger,Cache,Config
Twig also exposes:
path()currentRoute()
Twig views, assets, and translations
Twig views
Views are loaded from src/<Project>/App/Views.
Twig is initialized with:
- optional cache
- optional debug
twig/intl-extraappglobal- functions added by the framework
Example:
Assets
Source assets live in src/<Project>/Assets/.
The AssetHandler component:
- exposes
asset() - compiles
css,js, andless - minifies CSS and JS
- generates hashed file names
- writes
public/builds/<Project>/manifest.json - serves compiled files from
public/builds/<Project>/assets/
Twig example:
Source tree:
Translations
Translations are loaded from src/<Project>/Translations/<locale>.php.
Available Twig functions:
translate()trans()getLocales()getLocale()isEnabledTranslation()
Notable behavior:
- the locale is resolved from the config and cookies
setLocale()persists the language in alangcookie- in the
devenvironment, a missing key is automatically registered in the current locale's file translation:synclets you sync the keys across all locale files
Example src/Blog/Translations/fr.php file:
Twig example:
Example in a controller:
Utility extensions
The neo/Core/Extension/ folder exposes reusable helpers at two levels:
- in controllers via
getString(),getDate(),getFile(),getHtml(),getJson(),getNumber(),getPath(),getUrl(), andgetArray() - in Twig via automatically registered functions and filters
Available families:
StringExtensionslugify(),camelCase(),snakeCase(),pascalCase(),truncate(),excerpt()DateExtensiondate_now(),date_format(),human_diff(),date_age(),is_past(),is_future(),is_today()NumberExtensioncurrency(),percent(),human_size(),ordinal(),to_roman()FileExtensionfile_extension(),file_size(),file_mime(),is_image()HtmlExtensionhtml_escape(),html_strip(),html_truncate(),html_tag()JsonExtensionjson_encode_ext(),json_decode_ext(),json_is_valid()UrlExtensionurl_is_valid(),url_host(),url_params(),url_add_params()PathExtensionpath_join(),path_normalize(),path_extension(),path_filename()ArrayExtensionarray_flatten(),array_pluck(),array_only(),array_except(),array_group_by()
Examples:
Database and QueryBuilder
The PDO connection is driven by Config/database.config.php via DatabaseConnection.
Minimal example:
Schema tools
The framework ships a dedicated database CLI:
database:createcreates the database declared indatabase.config.phpmake:entitygenerates a Data Mapper entity (POPO) and its repository inDatabase/Entity/andDatabase/Repository/database:orm:diffcompares entities against the current database and generates a migration file inDatabase/Migrations/database:migration:migrateapplies all pending migrationsdatabase:migration:rollbackrolls back the last applied batchdatabase:migration:statusdisplays migration status and flags a drift between the current schema and the latest snapshot
Notable behaviors:
make:entityis interactive: it asks for the entity name, its properties, and their typesmake:entity --no-repositoryskips repository generationdatabase:orm:diff --dry-runshows the diff without writing a filedatabase:orm:diff --connection=<name>targets a specific connection for multi-database projects- the internal
neo_migrationsandneo_schema_snapshotstables are excluded from introspection - generated migrations are written to
src/<Project>/Database/Migrations/
Examples:
QueryBuilder
QueryBuilder notably covers:
table()select()where(),orWhere()whereLike(),whereIn(),whereNull(),whereNotNull()between()join(),leftJoin()orderBy(),groupBy()limit(),offset()get(),first(),count()insert(),insertGetId(),update(),delete()paginate()- transactions via
transaction()
Example:
Example with a transaction:
Migrations
Migrations live in src/<Project>/Database/Migrations/.
Each migration exposes:
up(DatabaseManager $db): voiddown(DatabaseManager $db): void
The runner maintains two technical tables:
neo_migrationsfor the history of applied migrationsneo_schema_snapshotsto store a schema hash after execution
The snapshot lets database:migration:status warn when the current schema has changed since the last generated or applied migration.
Example workflow:
Minimal migration example:
ORM and repositories
NeoPHP's ORM is a Data Mapper. Entities are POPOs annotated with mapping attributes. No parent class is required. Persistence goes through the EntityManager.
EntityManager
EntityManager is the entry point for all persistence operations.
Main API:
persist(object $entity)— registers an entity for insert or updateremove(object $entity)— marks an entity for deletionflush()— writes all changes to the databasefind(string $class, mixed $id)— lookup by primary keygetRepository(string $class)— returns the entity's repositorywrapInTransaction(callable $callback)— runs a callback within a transactioncontains(object $entity)— checks whether an entity is managed by the UnitOfWorkclear()— clears the identity map
In a controller, EntityManager is accessible via $this->entityManager (registered by DatabaseControllerExtension).
Example:
EntityRepository
EntityRepository is the base class generated by make:entity.
Available API:
find($id)— lookup by primary keyfindAll()— returns all entitiesfindBy(array $criteria, array $orderBy, ?int $limit, ?int $offset)— search by criteriafindOneBy(array $criteria, array $orderBy)— returns a single resultcount(array $criteria)— counts entities matching criteria
Repository example:
Usage in a controller:
Relations
Relations available via attributes:
#[OneToOne(targetEntity: ..., inversedBy: ...)]with#[JoinColumn]#[ManyToOne(targetEntity: ..., inversedBy: ...)]with#[JoinColumn]#[OneToMany(targetEntity: ..., mappedBy: ...)]#[ManyToMany(targetEntity: ..., inversedBy: ...)]with#[JoinTable]
Collections (OneToMany, ManyToMany) use the Collection class. Loading is lazy by default, handled through transparent proxies.
Example entity with relations:
See the Data Mapper ORM (entities) section for creating entities via the CLI and the migration workflow.
Data Mapper ORM (entities)
NeoPHP's ORM is built on the Data Mapper pattern. make:entity creates an entity and its repository. database:orm:diff generates the migration from the difference between the entities and the database.
Creating an entity
The generator is interactive: it asks for the name, then the properties and their types.
Example entity generated in Database/Entity/Post.php:
Available scalar types:
string,textinteger,bigint,smallintboolean,float,decimaldatetime,date,timejson
Available relations:
#[OneToOne(...)]with#[JoinColumn(...)]#[ManyToOne(...)]with#[JoinColumn(...)]#[OneToMany(...)]#[ManyToMany(...)]with#[JoinTable(...)]
OneToMany and ManyToMany sides use Collection to manage collections of related objects.
ManyToMany note — automatic persistence on flush: ManyToMany collections are now persisted automatically on
flush(). A snapshot of the collection is taken when the entity is loaded; at flush time, the UoW computes the diff (additions/removals) and syncs the join table without manual action.
Data Mapper repository
The generated repository extends EntityRepository:
--no-repository option available to skip repository generation.
Generating the migration from entities
On a multi-database project, the --connection=<name> option targets a specific connection.
Migrations generated by database:orm:diff follow the same up() / down() format as manual migrations and are stored in Database/Migrations/.
Forms, upload, and validation
Forms
NeoPHP ships:
FormFactory— entry point for creating formsFormBuilder— fluent building APIForm— form objectFieldType— enum of available field types- Twig rendering
- built-in CSRF
- constraint-based validation
Field types available via FieldType:
text,textareaemail,passwordnumberhiddencheckboxselectdate,datetime-local
Available Twig helpers:
form_start()form_end()form_row()form_widget()form_label()form_error()form_errors()form_csrf()
Example built via FormFactory:
Twig example:
Upload in a controller
The application entry point is AbstractController::upload().
Signature:
This helper:
- retrieves the file via
Request::file() - checks the PHP upload
- reads the original extension
- rejects
php,phtml,exe,sh,js - checks the provided whitelist
- creates the target folder in
src/<Project>/Assets/<directory> - moves the file
- returns the final file name
Example:
Then display it:
Validation
The validator relies on constraint attributes placed on the properties of any class (entity, DTO, etc.).
Since the refactor, each constraint is split into two files: a PHP attribute in Assert/ (which declares the parameters) and a validator in Validator/ (which contains the logic). ValidatorManager resolves the validator via the DI container using the constraint's validatedBy() method.
Constraints present in the framework:
NotBlankLengthEmailDateChoiceRangeRegexUrlUniqueExists— checks that a value exists in the database (useful for validating a foreign key)EqualToField
Example on a DTO:
Seeding
The Seeder module lets you populate the database with reference or demo data.
A seeder is a class annotated #[Seeder] that implements SeedInterface::run(EntityManager $em):
The #[Seeder] attribute configures two parameters:
| Parameter | Default | Description |
|---|---|---|
order |
0 |
Increasing execution order |
group |
'reference' |
'reference' for stable data, 'demo' for development data |
Available commands:
Security: auth, password, middlewares, csrf
Authentication
Auth is driven from app.config.php.
The framework supports two guards:
sessiontoken
The token guard relies on JwtManager.
Typical configuration:
AuthManager API:
attempt()login()logout()check()user()hasRole()generateToken()
Session login example:
Token login example:
Twig exposes:
auth_check()auth_user()auth_has_role()csrf_token()
PasswordManager
The PasswordManager service provides:
hash()verify()needsRehash()generate()getInfo()
Example:
Middlewares
Supported attributes:
#[Middleware(...)]— attaches a middleware to a class or method#[RateLimit(...)]— rate limit on a route#[Maintenance(...)]— maintenance mode#[IsGranted(roles: [...])]— role-based access, shortcut forRoleMiddleware
Core middlewares:
AuthMiddleware— checks that the user is authenticatedGuestMiddleware— checks that the user is not logged inRoleMiddleware— checks a specific roleIsGrantedMiddleware— checks one or more roles via#[IsGranted]RateLimitMiddleware— general rate limitingAuthRateLimitMiddleware— rate limiting on authenticationCsrfMiddleware— CSRF validation on POST/PUT/PATCH/DELETE requests
Application middleware example:
Usage example with #[Middleware]:
Example with #[IsGranted]:
CSRF
The CSRF manager stores tokens in the session under _csrf_tokens.
Behavior:
- generation via
generateToken() - default expiration of 3600 seconds
- validation via
validateToken() - integration in forms via
form_csrf()andcsrf_token()
Events
NeoPHP ships an event dispatcher and several core events:
RequestEventResponseEventExceptionEvent
Application listeners are expected in src/<Project>/App/Event/Listener.
They can be declared:
- via
#[AsListener(event: ..., priority: ...)] - via
EventSubscriberInterface
Full example:
Example in a controller:
Crons
NeoPHP ships a scheduled task system runnable via the CLI.
Application crons are expected in the current project and can be run manually or automatically via the operating system.
Creating a cron
To generate a new cron:
Example:
The generator automatically creates the cron file in the target project.
Listing crons
To display all crons available in a project:
This command notably shows:
- the cron name
- its description
- its frequency
- its status
Running crons
To run all of a project's crons:
This is the command that should be scheduled automatically by the operating system.
Automatic cron execution
Linux
On Linux, crons are usually driven via crontab.
Open the cron configuration:
Run NeoPHP crons every minute:
Concrete example:
Check cron logs:
macOS
macOS also supports crontab.
Open the configuration:
Add:
Example:
Check scheduled tasks:
Windows
On Windows, use Task Scheduler.
Command to run:
Example:
Recommended configuration:
- trigger: every minute
- program:
php.exe - arguments:
Task Scheduler can be opened with:
Docker
Example with a simple loop:
Example via docker-compose:
Recommendations
In production, it is recommended to:
- run
cron:runevery minute - log errors via the
Logger - avoid overly long blocking operations
- use queues for heavy processing
- monitor executions via application or system logs
Cache, logs, mailer, profiler, and errors
Cache
The Cache service is driven by cache.config.php.
Available drivers:
filesstorage insrc/<Project>/Storage/<path>redisviapredis/predisarrayin-memory storage for short-lived use or tests
API:
set()get()delete()clear()has()remember()
Example:
Logger
The Logger service reads logger.config.php and handles:
- log levels
- channels
- rotation
- zip archiving
Supported levels:
debuginfonoticewarningerrorcriticalalertemergency
Example:
Mailer
The neo/Core/Utils/Mailer/ folder registers a Mailer service based on PHPMailer.
Configuration:
src/<Project>/Config/mailer.config.php- current driver via
default - sender via
from - SMTP via
drivers.smtp
Main API:
to()subject()body()template()cc()bcc()attach()send()getSentMails()
In a controller, getMailer() is available via the controller extension.
Example:
If the mailer is disabled, sending is skipped and a warning is logged.
Profiler
The neo/Core/Profiler/ folder activates a debug bar only over HTTP and only when app.config.php sets environment = dev.
Exposed collectors:
- HTTP request
- resolved route and parameters
- SQL queries
- dispatched events
- logs
- authenticated user
- resolved translations and missing keys
- sent emails
The toolbar is injected into HTML responses.
It is skipped for JsonResponse, RedirectResponse, and non-HTML content.
Error handling
ErrorHandler:
- intercepts exceptions and PHP errors
- logs errors
- dispatches an
ExceptionEvent - renders
errors/<code>.html.twigif present - otherwise provides an HTML fallback
- shows more detail in
dev
Example error views:
Example 404.html.twig:
Markdown
The Tools/Markdown module provides a dependency-free Markdown parser. It converts Markdown text or a .md file into an array of structured blocks, rendered via Twig.
Usage from a template
The markdown_blocks() function is available in every Twig template:
The md_inline filter applies inline formatting (bold, italic, code, links):
Usage from PHP
Block types returned: heading, paragraph, code, list, table, quote, hr.
CLI and generators
Display global help:
Display help for a command:
The console automatically loads:
- the framework's native commands in
neo/**/Commands/ - application commands in
src/<Project>/App/Commands/
Available native commands:
project:createproject:deleteproject:syncapp:serveapp:make:commandapp:make:serviceapp:composer:requireasset:reloadcache:clearcron:listcron:rundatabase:createdatabase:orm:diffdatabase:migration:migratedatabase:migration:rollbackdatabase:migration:statusdebug:routergenerate:default:configmake:configmake:controllermake:cronmake:entitymake:middlewaremake:eventmake:event:listenermake:testmake:test:autorun:testrun:test:alltranslation:sync
Main generators
Examples:
Example interactive config command:
You could then enter, for example:
smtp.hostsmtp.portsmtp.usersmtp.pass
The generator will write a nested PHP array.
Application commands
app:make:command lets you generate a command in the target project. Once created in src/<Project>/App/Commands/, it is automatically detected by the console alongside native commands.
Example:
Project maintenance
Examples:
PHPUnit tests
The framework ships a per-project test layer with PHPUnit 13.2.
Available commands:
make:testmake:test:autorun:testrun:test:all
On the first make:test or make:test:auto, NeoPHP generates:
src/<Project>/Tests/bootstrap.phpsrc/<Project>/Tests/phpunit.xmlsrc/<Project>/Tests/Config/database.config.test.php- the
Unit,Feature,Database,Middlewarefolders
Base classes:
TestCaseFeatureTestCaseDatabaseTestCaseMiddlewareTestCase
Confirmed features:
- HTTP request simulation for feature tests
- transactions and automatic rollback for database tests
- config overrides via
*.config.test.php - dev-to-test schema sync
junit.xmlreports and HTML coverage
Manual tests
Examples:
Automatic generation with #[Test]
The automatic system relies on the Neo\Core\Testing\Attribute\Test attribute.
It can be placed:
- on a class
- on a public method
Current signature:
What make:test:auto does:
- prepares the PHPUnit scaffold if needed
- scans all PHP files in the project
- loads classes that contain
#[Test] - reads the attribute at the class and method level
- infers a test type
- picks a template
- generates the file in
Tests/<Type>/
Type inference when type = auto:
Repository=>databaseController=>featureMiddleware=>middleware- otherwise =>
unit
Example on a service class:
Example on a repository:
Example on a controller method:
Useful options:
Deployment
The app:make:deployment command prepares an FTP deployment from src/<Project>/Config/deploy.config.php.
The flow implements:
- temporary patch of
app.config.phptoprod - temporary patch of
public/index.php - merge of the root
composer.jsonand the projectcomposer.json - dependency installation with
--no-dev - compression of
vendor/ - FTP upload of the framework, the project, and the public folder
- upload of
vendor.zip - execution of a temporary unzip script on the server side
Expected keys in deploy.config.php:
ftp.hostftp.userftp.passremote.domainremote.framework_dirremote.public_dir
Example:
Dependencies and requirements
PHP
- PHP
>= 8.5
Required PHP extensions
ext-pdoext-zipext-libxmlext-domext-ftpext-iconvext-curlext-simplexmlext-fileinfo
Main dependencies
twig/twigtwig/intl-extrapsr/containermatthiasmullie/minifywikimedia/less.phpphpmailer/phpmailerpredis/predis
Development dependencies
phpunit/phpunitphpstan/phpstan
Summary
NeoPHP currently covers:
- multi-project application core
- DI container with autowiring
- configuration via PHP files
- HTTP layer, responses, sessions, cookies, and flash
- attribute-based routing
- controllers and Twig views
- CSS, JS, and Less asset pipeline
- string-based translation, one file per locale, CLI sync
- Data Mapper ORM: annotated POPO entities (
#[Entity],#[Column], relations),EntityManager,EntityRepository - entity-driven migrations via
database:orm:diff - database migrations and schema snapshot tracking
- forms via
FormFactory/FormBuilder, validation, upload, and CSRF - session / token auth, password, middlewares, and
#[IsGranted] - events and crons
- cache, logs, mailer, profiler, and error handling
- generation and admin CLI (
project:create,make:entity,database:orm:diff, etc.) - manual testing and automatic generation via
#[Test] - built-in FTP deployment
The key point of the repository stays the same:
neo/holds the enginesrc/holds the applicationsphp bin/neo ...drives most of the workflow
All versions of neophp with dependencies
twig/twig Version ^3.0
psr/container Version ^2.0
matthiasmullie/minify Version ^1.3
ext-pdo Version *
ext-zip Version *
ext-libxml Version *
ext-dom Version *
wikimedia/less.php Version ^5.4
wikimedia/composer-merge-plugin Version ^2.1
twig/intl-extra Version ^3.23
ext-ftp Version *
ext-iconv Version *
ext-curl Version *
ext-simplexml Version *
phpmailer/phpmailer Version ^7.1
ext-fileinfo Version *
predis/predis Version ^3.5