Planned and not-yet-built capabilities relative to what Vortex already ships (HTTP, routing, DB + migrations + models/query builder, validation, sessions/CSRF, mail, file cache, storage, sync events, console, Twig, pagination, rate limiting).
-
Authentication & authorization — Session
Auth,Gate(abilities + model policies),RememberCookie+RememberFromCookiemiddleware,PasswordResetBroker(SQL tokens),Authenticate/AuthorizeAbilitymiddleware, Twigauth_*andgate_allows. -
Database queue + worker —
Vortex\Queue\Contracts\Job,DatabaseQueue,Queue::push,queue:work,queue:failed,queue:retry(incl.all),FailedJobStore+ optionalqueue.failed_jobs_table. -
Scheduling —
config/schedule.phptasks,Schedule::register(), five-field cron matching (CronExpression), CLIschedule:run. -
Cache: Redis —
RedisCache+cache.stores.*driverredis(phpredis / ext-redis). -
Cache: Memcached —
MemcachedCache+ drivermemcached(ext-memcached). -
Queue: Redis —
RedisQueue,QueueDrivercontract,queue.driver/queue.redis, sharedPhpRedisConnectwith cache. -
ORM: observers —
Model::observe()withcreating/updated/ … hooks oncreate(),save(),delete(). -
ORM: casts —
$castsonModelfor int/float/bool/string/json/datetime. -
ORM: soft deletes —
$softDeletes/$deletedAtColumn, query scopes,restore/forceDelete. -
ORM: global scopes —
addGlobalScope,withoutGlobalScope(s);find/allviaquery(). -
ORM: eager
with()—Model::eagerRelations()for batchedbelongsTo/hasMany/hasOne/belongsToMany; nested dot paths (e.g.author.country);Relationspec builders,Model::load(),QueryBuilder::eagerLoadOnto(). -
Routing: model binding —
Router::model/Router::bind(+Route::model/Route::bind); missing model ornullresolver → 404. -
Routing: resource groups —
Router::resource/Route::resource(REST index/store/show/update/destroy; optional create/edit). -
HTTP: JSON API envelope —
Response::apiOk/apiError,JsonResource(resolve(),pushResponseTransform/withResponseTransforms,transformResponse()),validationFailed(ValidationResult),Request::validationResponse/bodyValidationResponse,JsonShape/object/listOfObjects/listOfPrimitive+bodyShapeResponse, path/header API version helpers (splitVersionedPath,resolvedApiVersion,withPath), aligned negotiation errors +ErrorRendererJSON. -
Testing helpers —
Vortex\Testing\KernelBrowserfor in-processKerneldispatch +Container::has(). -
Schema builder — extra column types (
decimal,json,date,floatType,char, sized integers),Schema::hasTable, FKON UPDATE, MySQLUNSIGNEDon integers. -
HTTP controllers — optional
Controllerbase + invokable class routes + per-routemiddleware()chaining. -
CLI codegen —
make:migration,make:command,repl(debug /--force). -
PSR-16 cache —
Psr16Cache+ containerPsr\SimpleCache\CacheInterface. -
Packaging —
composer.lockpolicy for apps vs library vs skeleton (rootREADME). -
API cursor pagination —
QueryBuilder::cursorPaginate(),Cursor/CursorPaginator,toApiData()for JSON collections withResponse::apiOk. -
ORM polymorphic relations —
morphTo,morphMany,morphOne(lazy + eager, nested eager undermorphTovia per–concrete-class grouping);MorphMapaliases for_typecolumns +getMorphClass(). -
ORM persistence helpers —
Model::refresh(),firstOrCreate(),updateOrCreate(). -
JSON Schema —
justinrainbow/json-schema,JsonSchemaValidator::validateArray()/validateDecoded(),Request::bodyJsonSchemaResponse()(requests);Response::apiOkValidated()/jsonValidated(),JsonResource::toValidatedResponse()/collectionValidatedResponse()(responses;JsonShaperemains the lightweight default for bodies). -
Container —
Container::call(); constructor unions,self/parent, nullable / interface failures;tag/tagged,bindFor(contextual bindings). -
Real-time — SSE (
Response::serverSentEvents(),SseEmitter);Broadcaster(SyncBroadcaster,RedisBroadcaster+broadcasting.driverredis).
Concrete follow-ups; each is a shippable vertical slice:
- ORM / platform — further conveniences from Data & persistence as needed (e.g.
chunk, custom primary keys).
- Authentication & authorization — Shipped for the current scope (session login, remember-me cookie, gates/policies, reset token broker; apps wire mail and routes).
- Queues & workers — Shipped: SQL + Redis drivers, worker CLI, failed-job persistence + replay.
- Scheduling — Shipped:
schedule:run, config + programmatic tasks, cron lists/ranges, overlap guard viaCache::addandschedule.mutex_store(use a Redis-backed store for distributed mutexes). - Real-time — Shipped: SSE +
SyncBroadcaster+ optionalRedisBroadcaster(broadcasting.driverredis). Optional later: WebSockets or full pub/sub.
- Cache drivers — Redis (phpredis) and Memcached (ext-memcached) behind
Cache; file + null unchanged. PSR-16CacheInterfaceviaPsr16Cacheon the default store. - ORM depth — Shipped: model observers, attribute casts, soft deletes, global scopes, batched
with()(hasOne,morphTo/morphMany/morphOne,MorphMap), nested dot paths (morphTonests per concrete type),refresh(),firstOrCreate(),updateOrCreate(). Remaining: richer conveniences as needed. - Schema builder — Shipped: more column types (
decimal,json,date,floatType, integer sizes,char),Schema::hasTable, FKON UPDATE, MySQLUNSIGNEDon integer columns.
- API conveniences — Shipped:
JsonResource(resolve(),pushResponseTransform/withResponseTransforms,transformResponse()),Response::apiOk/apiError/validationFailed,apiOkValidated/jsonValidated,Requestvalidation + version +JsonShapeand JSON Schema (JsonSchemaValidator,Request::bodyJsonSchemaResponse()), negotiated errors witherrorcodes; cursor pagination (QueryBuilder::cursorPaginate(),CursorPaginator::toApiData()). - Routing DX — Shipped: route model binding, custom
bind,Route::resource, invokable class routes,middleware()on the last route, optionalControllerbase helpers.
- Container — Shipped:
make()constructor injection (incl. union / nullable /self–parent),call(),has(),tag()/tagged(),bindFor()(contextual). Optional: deeper binding DSL if justified. - Tooling — Shipped:
make:migration,make:command,repl(eval loop; not PsySH). Optional: richer debugging (no full debugbar by default). - Framework test kit — Shipped:
KernelBrowser(Vortex\Testing) for consuming app PHPUnit tests.
- Lockfile policy — Shipped: documented in root
README.md(Packaging and composer.lock). Apps commit a lock; the framework package omits it; skeleton apps should commit one for reproducible installs.
Items are not ordered by release; pick by impact and maintenance cost.