5.15.0 (2026-06-18)
Tools
- Zephir Parser v2.0.4
- Zephir 0.23.0 (development - 27535f802)
Changed
- Changed
Phalcon\Acl\Adapter\Memoryto fire theacl:beforeCheckAccessandacl:afterCheckAccessevents with an immutable array payload (role,component,access, plusgrantedon theafterevent) as the event data, instead of passing the adapter instance. #17143 [doc] - Changed
Phalcon\Assets\AssetInterfaceandPhalcon\Assets\FilterInterfaceto extend the newPhalcon\Contracts\Assets\AssetandPhalcon\Contracts\Assets\Filtercontracts. #17147 [doc] - Changed
Phalcon\Assets\Collection::has()to an O(1) keyed lookup (isset) over the asset store instead of a linear scan. #17147 [doc] - Changed
Phalcon\Assets\Managerto reject any collection filter that is not aPhalcon\Assets\FilterInterfaceinstance withPhalcon\Assets\Exceptions\InvalidFilter, instead of a fatal error when a non-conforming object reachedfilter(). #17147 [doc] - Changed
Phalcon\Auth\Guard\Sessionto accept an optionalPhalcon\Time\Clock\ClockInterface; the remember-me cookie expiry now reads "now" through the clock, defaulting toPhalcon\Time\Clock\SystemClock::fromUTC(). #17151 [doc] [doc] - Changed
Phalcon\Auth\Manager::attempt()andPhalcon\Auth\Manager::logout()to throwPhalcon\Auth\Exceptions\DoesNotImplement(a subclass ofPhalcon\Auth\Exception) when the default guard does not implementGuardStateful. #17148 [doc] - Changed
Phalcon\Auth\ManagerFactoryto validate the required guard configuration keys (type,adapter, and the adaptername) up front, throwing a diagnosticPhalcon\Auth\Exceptioninstead of a notice andTypeError. #17148 [doc] - Changed
Phalcon\Autoload\Exceptions\LoaderDirectoriesNotArrayto accept an optional namespace name; when supplied, the message names the namespace whose directory registration failed. #17149 [doc] - Changed
Phalcon\Autoload\Loader::getFoundPath()to return the resolved path for every lookup strategy (class map, namespace, directory), not only for file loading. #17149 [doc] - Changed
Phalcon\Autoload\Loaderto drop the redundant directory and namespace-prefix re-normalization on the namespace resolution path (no behavior change). #17149 [doc] - Changed
Phalcon\Cache\AbstractCache::checkKey()andPhalcon\Cache\AbstractCache::checkKeys()to throw the exception class returned bygetExceptionClass()(defaulting toPhalcon\Cache\Exception\InvalidArgumentException) instead of the dedicatedInvalidCacheKey/CacheKeysNotIterablesubclasses, so the thrown type can be overridden (for example to restore the PSR-16 marker). The exception messages are unchanged. #17156 [doc] - Changed
Phalcon\Cache\AbstractCache::checkKey()to reject an empty-string key, so every cache operation now throws for"", matching the PSR-16 requirement that keys be non-empty and closing the bare-prefix collision channel. #17164 [doc] - Changed
Phalcon\Cache\AbstractCache::doDelete()to validate the key before firing thecache:beforeDeleteevent, matchingdoGet()/doSet()/doHas(); the event no longer fires for a delete that throws on an invalid key. #17164 [doc] - Changed
Phalcon\Cache\AbstractCache::doSetMultiple()to validate every key before writing any item, so an invalid key fails the operation up front instead of leaving the already-written pairs persisted behind the thrown exception. #17164 [doc] - Changed
Phalcon\Cache\CacheInterfaceto extend the newPhalcon\Contracts\Cache\Cachecontract. #17156 [doc] - Changed
Phalcon\Cli\Router::handle()to return the router instance on every path; the matched branch previously returnednull. #17165 [doc] - Changed
Phalcon\Cli\Router\Exceptions\BeforeMatchNotCallable,Phalcon\Cli\Router\Exceptions\InvalidRoutePaths, andPhalcon\Cli\Router\Exceptions\RouterArgumentsInvalidTypeto accept optional context (the route pattern, the route pattern, and the received type respectively) and include it in the exception message. #17165 [doc] - Changed
Phalcon\Cli\Router\Route::beforeMatch()to reject a non-callable callback at registration withPhalcon\Cli\Router\Exceptions\BeforeMatchNotCallable, instead of deferring the failure to match time, matching thePhalcon\Mvc\Router\Routebehavior. #17165 [doc] - Changed
Phalcon\Contracts\Paginator\Adapter::setCurrentPage()andPhalcon\Contracts\Paginator\Adapter::setLimit()to return thePhalcon\Contracts\Paginator\Adaptercontract instead of the implementation-sidePhalcon\Paginator\Adapter\AdapterInterface, removing the contract layer's dependency on the implementation namespace. Implementations returning the narrower interface remain covariant-compatible. #17153 [doc] - Changed
Phalcon\Contracts\Paginator\Repositoryto document the offset and cursor adapter dialects on its getters: cursor adapters (Phalcon\Paginator\Adapter\QueryBuilderCursor) store cursor values ingetCurrent()/getNext()and do not computegetTotalItems(),getLast()orgetPrevious()(returning0). #17153 [doc] - Changed
Phalcon\Db\Adapter\AbstractAdapter::__construct()to reject adialectClassdescriptor object that does not implementPhalcon\Db\DialectInterfacewith the newPhalcon\Db\Exceptions\InvalidDialectClassat construction time, instead of deferring the failure to first use. #17163 [doc] - Changed
Phalcon\Db\Adapter\AbstractAdapter::tableExists()andPhalcon\Db\Adapter\AbstractAdapter::tableOptions()to returnfalseand[]respectively when the metadata query returns no rows, instead of emitting a notice on a missing array offset. #17163 [doc] - Changed
Phalcon\Db\Geometry\GeometryInterfaceto extend the newPhalcon\Contracts\Db\Geometry\Geometrycontract. #17163 [doc] - Changed
Phalcon\Dispatcher\AbstractDispatcher::callActionMethod()to build thedispatch:beforeCallAction/afterCallActionobserverPhalcon\Support\Collectiondirectly instead of resolving it from the DI container by class name, removing a per-action container lookup on the hot path. (Release note: an application that registered aPhalcon\Support\Collectionservice to override that lookup is no longer consulted here.) #17159 [doc] - Changed
Phalcon\Dispatcher\AbstractDispatcher::callActionMethod()to re-validate the handler/action pair withis_callable()after thedispatch:beforeCallActionobserver runs, so a listener that substitutes a non-existent action now fails through theEXCEPTION_ACTION_NOT_FOUNDchannel instead of a rawcall_user_func_array()fatal. #17159 [doc] - Changed
Phalcon\Dispatcher\AbstractDispatcherto declare itsthrowDispatchException()andhandleException()error hooks asabstract protectedmethods and call them directly instead of through dynamic string dispatch. A custom dispatcher that omits either now fails when the class is loaded rather than with an undefined-method fatal on the first error path. #17159 [doc] - Changed
Phalcon\Dispatcher\AbstractDispatcherto document its three lifecycle hook channels (events-manager listener, duck-typed handler method, and thedispatch:beforeCallActionobserver), record theafterBindingblocks' intentional bypass ofhandleException(), and correct the stale initialize-ordering note that referenced Phalcon 4.0 (no behavior change). #17159 [doc] - Changed
Phalcon\Dispatcher\DispatcherInterface,Phalcon\Mvc\DispatcherInterface, andPhalcon\Cli\DispatcherInterfaceto extend the newPhalcon\Contracts\Dispatcher\Dispatcher,Phalcon\Contracts\Mvc\Dispatcher, andPhalcon\Contracts\Cli\Dispatchercontracts. #17159 [doc] - Changed
Phalcon\Domain\Payload\PayloadInterface,Phalcon\Domain\Payload\ReadableInterface, andPhalcon\Domain\Payload\WriteableInterfaceto extend the newPhalcon\Contracts\Domain\Payload\Payload,Phalcon\Contracts\Domain\Payload\Readable, andPhalcon\Contracts\Domain\Payload\Writeablecontracts. #17162 [doc] - Changed
Phalcon\Encryption\Crypt::decrypt()to reject input shorter than the selected cipher requires up front with the newPhalcon\Encryption\Crypt\Exception\InvalidDecryptLength, instead of failing later as the less specificPhalcon\Encryption\Crypt\Exception\DecryptionFailed. #17160 [doc] - Changed
Phalcon\Encryption\Crypt::setAuthTagLength()to validate that the length is between 4 and 16 bytes, throwing the newPhalcon\Encryption\Crypt\Exception\InvalidAuthTagLengthinstead of accepting any integer. #17160 [doc] - Changed
Phalcon\Encryption\Crypt\CryptInterfaceandPhalcon\Encryption\Crypt\Padding\PadInterfaceto extend the newPhalcon\Contracts\Encryption\Crypt\CryptandPhalcon\Contracts\Encryption\Crypt\Padding\Padcontracts. #17162 [doc] - Changed
Phalcon\Encryption\Crypt\PadFactory::padNumberToService()to throw on an unknown padding constant instead of silently mapping it to the no-op padding (fail closed). #17160 [doc] - Changed
Phalcon\Encryption\CryptandPhalcon\Encryption\Crypt\CryptInterfaceto drop the unreachable ECB padding branches (ECB ciphers are filtered out at construction) and to document the encrypted payload wire format (iv ‖ hmac ‖ ciphertext ‖ tag) and the AEAD parameter statefulness. #17160 [doc] - Changed
Phalcon\Encryption\Security\JWT\Signer\SignerInterfaceto extend the newPhalcon\Contracts\Encryption\Security\JWT\Signer\Signercontract. #17162 [doc] - Changed
Phalcon\Encryption\Security\JWT\Validatorto accept an optionalPhalcon\Time\Clock\ClockInterfaceconstructor parameter for reading the current time;timeShiftis retained as the legacy clock-skew mechanism. #17151 [doc] [doc] - Changed
Phalcon\Encryption\Security\Uuid\UuidInterface,Phalcon\Encryption\Security\Uuid\TimeBasedUuidInterface, andPhalcon\Encryption\Security\Uuid\NodeProviderInterfaceto extend the newPhalcon\Contracts\Encryption\Security\Uuid\Uuid,Phalcon\Contracts\Encryption\Security\Uuid\TimeBasedUuid, andPhalcon\Contracts\Encryption\Security\Uuid\NodeProvidercontracts. #17162 [doc] - Changed
Phalcon\Flash\AbstractFlashto declaremessage()as anabstract publicmethod and call it directly fromerror(),notice(),success(), andwarning()instead of through dynamic string dispatch. #17158 [doc] - Changed
Phalcon\Flash\FlashInterfaceto extend the newPhalcon\Contracts\Flash\Flashcontract. #17158 [doc] - Changed
Phalcon\Flash\Session::output()to no longer discard the accumulated messages when implicit flush is disabled; it now clears the buffer only in the implicit-flush (echo) mode, so with implicit flush off the rendered messages remain reachable instead of being silently destroyed. #17158 [doc] - Changed
Phalcon\Html\Attributes::renderAttributes()to escape attribute values throughPhalcon\Html\Escaper\AttributeEscaperinstead of a hardcodedhtmlspecialchars()call, consolidating attribute escaping in one place. Output is byte-identical for the default configuration (ENT_QUOTES, UTF-8, double-encode on). #17157 [doc] - Changed
Phalcon\Html\Breadcrumbs::render()to return an empty string when no crumbs have been added, instead of indexingend([])and emitting a PHP warning followed by a malformed single-crumb<dl>. #17157 [doc] - Changed
Phalcon\Html\Link\Serializer\Header::serialize()to escape embedded backslashes and double quotes in attribute values per the RFC 8288 quoted-string rules, so an attribute value containing a double quote no longer produces a malformedLinkheader. #17157 [doc] - Changed
Phalcon\Image\Adapter\AbstractAdapter::background()andPhalcon\Image\Adapter\AbstractAdapter::text()to validate the supplied hex color through a single shared parser, throwing the newPhalcon\Image\Exceptions\InvalidColorfor a malformed color instead of silently producing incorrect channel values. #17156 [doc] - Changed
Phalcon\Image\Adapter\AbstractAdapterto declare its fourteenprocess*operations asabstract protectedmethods and call them directly instead of through dynamic string dispatch. A custom adapter that omits one now fails when the class is loaded rather than with an undefined-method fatal on the first operation. #17156 [doc] - Changed
Phalcon\Image\Adapter\Gd::__construct()to throwPhalcon\Image\Exceptions\ImageLoadFailedwhen an existing file cannot be read (for example a corrupt or unreadable image), instead of falling through toPhalcon\Image\Exceptions\UnsupportedImageTypewith no context. #17156 [doc] - Changed
Phalcon\Logger\AbstractLogger::addMessage()to route each adapter through a directadd()/process()conditional instead of a dynamic method-name dispatch, and normalized thedefaultFormatterclass-string escaping inPhalcon\Logger\Adapter\AbstractAdapter(no behavior change). #17155 [doc] - Changed
Phalcon\Logger\AbstractLoggerto accept an optionalPhalcon\Time\Clock\ClockInterfaceconstructor parameter; log item timestamps now come from the clock, defaulting to aPhalcon\Time\Clock\SystemClockon the logger timezone (current behavior preserved). #17151 [doc] [doc] - Changed
Phalcon\Logger\Adapter\AbstractAdapter::__destruct()to auto-commit an open transaction, flushing the queued items, instead of throwingPhalcon\Logger\Exceptions\TransactionAlreadyActive. Throwing from a destructor is fatal during script shutdown, so an exception unwinding past acommit()no longer escalates a lost log buffer into a process fatal. #17155 [doc] - Changed
Phalcon\Logger\Adapter\AbstractAdapter::begin()to throwPhalcon\Logger\Exceptions\TransactionAlreadyActivewhen a transaction is already active, instead of silently re-arming the flag. #17155 [doc] - Changed
Phalcon\Logger\LoggerInterface,Phalcon\Logger\Adapter\AdapterInterface, andPhalcon\Logger\Formatter\FormatterInterfaceto extend the newPhalcon\Contracts\Logger\Logger,Phalcon\Contracts\Logger\Adapter\Adapter, andPhalcon\Contracts\Logger\Formatter\Formattercontracts. #17156 [doc] - Changed
Phalcon\Messages\Messages::appendMessages()to reject a non-Traversableobject withPhalcon\Messages\Exceptions\MessagesNotIterable, instead of a fatal error onrewind(). #17154 [doc] - Changed
Phalcon\Messages\Messages::offsetSet()to require aPhalcon\Messages\MessageInterfaceinstance, throwingPhalcon\Messages\Exceptions\MessageNotObjectfor any other value instead of accepting any object; the exception message now states the required type. #17154 [doc] - Changed
Phalcon\Messages\Messagesto implement the newPhalcon\Contracts\Messages\Messagescontract; the concrete type is unchanged. #17154 [doc] - Changed
Phalcon\Mvc\Application\Exceptions\InvalidModuleDefinitionandPhalcon\Cli\Console\Exceptions\InvalidModuleDefinitionto accept an optional module name and reason in the constructor. The exception message now identifies the offending module and why its definition is invalid. #17146 [doc] [doc] - Changed
Phalcon\Mvc\ModelInterface::find()to document the four query dialects and their intended lanes (find-parameter arrays,Phalcon\Mvc\Model\Query\Builder,Phalcon\Mvc\Model\Criteria, and raw PHQL) (no behavior change). #17166 [doc] - Changed
Phalcon\Mvc\Model\MetaDatato document its two positional metadata array layouts on the class docblock - the 14-slot attribute array and the 2-slot column map - noting that the two constant families share numeric values and that the metadata cache adapters persist the layout (no behavior change). #17166 [doc] - Changed
Phalcon\Mvc\Modelto document the__get/__call/__callStaticmagic-resolution order and finder grammar on its class docblock, and thatPhalcon\Mvc\Model::setup()writes process-globalorm.*settings that affect every model in the process (no behavior change). #17166 [doc] - Changed
Phalcon\Paginator\Adapter\AbstractAdapterto require thelimitoption andPhalcon\Paginator\Adapter\Modelto require themodeloption in their constructors, both throwingPhalcon\Paginator\Exceptions\MissingRequiredParameter, matching thePhalcon\Paginator\Adapter\QueryBuilderandPhalcon\Paginator\Adapter\QueryBuilderCursoradapters. Previously a missinglimitreached a division-by-zero inModel/NativeArrayand a missingmodelproduced a notice followed by a fatal. #17153 [doc] - Changed
Phalcon\Paginator\Adapter\QueryBuilderCursorto throwPhalcon\Paginator\Exceptions\InvalidCursorColumnwhen the cursor column value of the last row is non-numeric, instead of casting it to0and silently terminating pagination (e.g. over UUID or ULID keys). #17153 [doc] - Changed
Phalcon\Paginator\Adapter\QueryBuilderto explicitly initialize its internalhasMultipleGroupsflag and documented that thecolumnsconstructor option is consumed only by the total-count rewrite forHAVING/GROUP BYqueries. #17153 [doc] - Changed
Phalcon\Session\Adapter\Redis::read()to short-circuit a re-entrant read when this instance already holds the lock for the same session id, returning the held lock instead of spinning against its own lock for the full retry budget before throwingPhalcon\Session\Adapter\Exceptions\AdapterRuntimeError(thesession_reset()re-read path). Only the self-deadlock scenario changes. #17167 [doc] - Changed
Phalcon\Session\Manager::setId()to validate the supplied id against the PHP session-id alphabet ([a-zA-Z0-9,-]), throwing the newPhalcon\Session\Exceptions\InvalidSessionId, matching the cookie validation already performed instart()instead of passing an invalid id straight tosession_id(). #17167 [doc] - Changed
Phalcon\Session\Manager::setName()to reject a digits-only name withPhalcon\Session\Exceptions\InvalidSessionName, instead of letting PHP emit asession_name()warning and silently leave the name unchanged. #17167 [doc] - Changed
Phalcon\Storage\Adapter\AbstractAdapter::doGet()and thePhalcon\Storage\Adapter\Streamcounter and delete internals to route through the protecteddo*primitives instead of re-entering the publicget()/set()/has()/delete()surface. A networked read onRedis/Libmemcachedno longer issues a separateEXISTSbeforeGET(roughly halving the round trips), and no fabricated nestedbefore*/after*events are fired - event listeners now observe the real operation sequence (a behavior note for listeners, not a break). #17168 [doc] - Changed
Phalcon\Storage\Adapter\AbstractAdapter::getArrVal()to delegate to the canonicalPhalcon\Support\Helper\Arr\Gethelper instead of carrying its own diverged copy (no behavior change). #17168 [doc] - Changed
Phalcon\Storage\Adapter\AbstractAdapter::getUnserializedData()to guard theisSuccess()call withmethod_exists(), defaulting to success. A custom serializer implementing onlyPhalcon\Storage\Serializer\SerializerInterface(which does not declareisSuccess()) no longer fatals on the first cache miss or corrupt entry. #17168 [doc] - Changed
Phalcon\Storage\Adapter\Redis::getKeys()to enumerate keys with a non-blockingSCANiteration instead of the blockingKEYS *command, removing the production hazard on large keyspaces while returning the same keys.Phalcon\Storage\Adapter\RedisCluster::getKeys()retainsKEYSbecause clusterSCANiterates one node at a time. #17168 [doc] - Changed
Phalcon\Support\Collection::sort()to throwInvalidArgumentExceptionwhen given a non-callable callback, instead of fataling insideuasort(), and to compare against theSORT_ASC/SORT_DESCconstants rather than the literals4/3. #17152 [doc] - Changed
Phalcon\Support\Helper\Str\AbstractStrandPhalcon\Support\Helper\Arr\AbstractArrto be marked@internal, documenting that they exist only for their respective helper hierarchies; new code should compose the invokable helpers (Phalcon\Support\Helper\Str\Interpolate,Phalcon\Support\Helper\Arr\Get) rather than extending these bases. #17152 [doc] - Changed
Phalcon\Support\Settings::get()andPhalcon\Support\Settings::set()to share a single internal reader for the setting whitelist instead of duplicating the list across the read and write paths, removing the drift risk between them. #17152 [doc] - Changed
Phalcon\Translate\Adapter\AbstractAdapterandPhalcon\Translate\Interpolator\AssociativeArrayto memoize the interpolator instance and thePhalcon\Support\Helper\Str\Interpolatehelper respectively, removing two object allocations per translation call on the hot path. #17150 [doc] - Changed
Phalcon\Translate\Adapter\AbstractAdapterto host thetriggerErrorstrict-mode option and thenotFound()hook (lifted fromPhalcon\Translate\Adapter\NativeArray), soPhalcon\Translate\Adapter\CsvandPhalcon\Translate\Adapter\Gettextnow also support strict mode - a missing key throwsPhalcon\Translate\Exceptions\KeyNotFoundwhentriggerErroris enabled. Defaults preserve current behavior. #17150 [doc] - Changed several
Phalcon\Assetsexceptions to provide better descriptions. #17147 [doc] - Changed the Redis fast path in
Phalcon\Cache\AbstractCache::doGetMultiple()to validate each key, acceptTraversableinputs (previously aTypeErroron the Redis adapter only), and apply the serializer's full unserialize protocol (returning the default value for a corrupt entry), aligning it with the per-key loop path used by the other adapters. #17164 [doc] - Changed the
Phalcon\Application\Exceptions\ModuleNotRegisteredmessage to be more descriptive. #17146 [doc] [doc] - Changed the
Phalcon\Auth\Guard\Sessionauth:*events to fire as non-cancellable, matching that their return value was already ignored. #17148 [doc] - Changed the
Phalcon\Auth\Guard\Sessionremember-me cookie lifetime to a configurablePhalcon\Auth\Guard\Config\SessionGuardConfigvalue (rememberTtl, defaultDEFAULT_REMEMBER_TTL); the default is now 365 days (previously a hardcoded 360). #17148 [doc] - Changed the
Phalcon\Authadapters (Memory,Stream,Model) to verify the configured user model implementsPhalcon\Contracts\Auth\AuthUserduring hydration, throwingPhalcon\Auth\Exceptions\DoesNotImplementinstead of failing later. #17148 [doc] - Changed the
Phalcon\Autoload\Loaderclass-map strategy to fire theloader:beforeCheckPathevent before probing, matching the namespace and directory strategies. #17149 [doc] - Changed the
Phalcon\Flash\Exceptions\EscaperServiceUnavailableandPhalcon\Flash\Exceptions\SessionServiceUnavailablemessages to "The '' service is not available (no container, or service not registered)", describing both trigger conditions (no container at all, or a container that lacks the service). #17158 [doc] - Deprecated
Phalcon\Assets\Filters\CssminandPhalcon\Assets\Filters\Jsmin; both return the content unchanged (the minification has never been implemented). #17147 [doc] - Deprecated
Phalcon\Cli\Router::getParams()andPhalcon\Cli\RouterInterface::getParams()in favor ofgetParameters(). #17165 [doc] - Deprecated the
Phalcon\Dispatcher\AbstractDispatcherandPhalcon\Dispatcher\DispatcherInterfaceparameter accessorsgetParam(),getParams(),hasParam(),setParam(), andsetParams()in favor of theirgetParameter(),getParameters(),hasParameter(),setParameter(), andsetParameters()counterparts; the deprecated spellings will be removed in the next major version. #17159 [doc] - Deprecated the
Phalcon\Encryption\SecurityconstantsCRYPT_STD_DES,CRYPT_EXT_DES,CRYPT_BLOWFISH, andCRYPT_BLOWFISH_Y(never implemented; they resolve to bcrypt) andCRYPT_MD5(weak legacy algorithm); any unhandleddefaultHashvalue resolves to bcrypt. #17160 [doc]
Added
- Added
Phalcon\Contracts\Assets\AssetandPhalcon\Contracts\Assets\Filter, the canonical contracts forPhalcon\Assets\Assetand the Assets filters. They are the long-term replacements for the deprecatedPhalcon\Assets\AssetInterfaceandPhalcon\Assets\FilterInterface. #17147 [doc] - Added
Phalcon\Contracts\Cache\Cache, the canonical contract forPhalcon\Cache\Cache(the PSR-16-shaped cache surface). It is the long-term replacement for the deprecatedPhalcon\Cache\CacheInterface. #17156 [doc] - Added
Phalcon\Contracts\Db\Geometry\Geometry, the canonical contract for thePhalcon\Db\Geometryvalue objects (getSrid(),getType(),toWkt()). It is the long-term replacement for the deprecatedPhalcon\Db\Geometry\GeometryInterface. #17163 [doc] - Added
Phalcon\Contracts\Dispatcher\Dispatcher,Phalcon\Contracts\Mvc\Dispatcher, andPhalcon\Contracts\Cli\Dispatcher, the canonical contracts forPhalcon\Dispatcher\AbstractDispatcher,Phalcon\Mvc\Dispatcher, andPhalcon\Cli\Dispatcher. They are the long-term replacements for the deprecatedPhalcon\Dispatcher\DispatcherInterface,Phalcon\Mvc\DispatcherInterface, andPhalcon\Cli\DispatcherInterface. #17159 [doc] - Added
Phalcon\Contracts\Flash\Flash, the canonical contract for thePhalcon\Flashmessengers (Phalcon\Flash\Direct,Phalcon\Flash\Session). It is the long-term replacement for the deprecatedPhalcon\Flash\FlashInterface. #17158 [doc] - Added
Phalcon\Contracts\Logger\Logger,Phalcon\Contracts\Logger\Adapter\Adapter, andPhalcon\Contracts\Logger\Formatter\Formatter, the canonical contracts forPhalcon\Logger\Logger, its adapters, and its formatters. They are the long-term replacements for the deprecatedPhalcon\Logger\LoggerInterface,Phalcon\Logger\Adapter\AdapterInterface, andPhalcon\Logger\Formatter\FormatterInterface. #17156 [doc] - Added
Phalcon\Contracts\Messages\Messages, the canonical contract for thePhalcon\Messages\Messagescollection (append, count, filter, and iteration); the collection previously had no interface of its own. #17154 [doc] - Added
Phalcon\Db\Exceptions\InvalidDialectClass, thrown byPhalcon\Db\Adapter\AbstractAdapter::__construct()when thedialectClassdescriptor object does not implementPhalcon\Db\DialectInterface. #17163 [doc] - Added
Phalcon\Dispatcher\AbstractDispatcher::getPreviousActionName(),Phalcon\Dispatcher\AbstractDispatcher::getPreviousHandlerName(), andPhalcon\Dispatcher\AbstractDispatcher::getPreviousNamespaceName(), lifting the previously MVC-only previous-dispatch getters to the base soPhalcon\Cli\Dispatchergains them too.Phalcon\Mvc\Dispatcher::getPreviousControllerName()remains as a controller-named alias. #17159 [doc] - Added
Phalcon\Encryption\Crypt\Exception\InvalidAuthTagLengthandPhalcon\Encryption\Crypt\Exception\InvalidDecryptLength. #17160 [doc] - Added
Phalcon\Image\Adapter\Gd::create()andPhalcon\Image\Adapter\Imagick::create(), static named constructors for the blank-canvas case that avoid the constructor's load-or-create ambiguity. #17156 [doc] - Added
Phalcon\Image\Exceptions\InvalidColor, thrown when a malformed hex color is passed toPhalcon\Image\Adapter\AbstractAdapter::background()orPhalcon\Image\Adapter\AbstractAdapter::text(). #17156 [doc] - Added
Phalcon\Logger\AbstractLogger::begin(),Phalcon\Logger\AbstractLogger::commit(), andPhalcon\Logger\AbstractLogger::rollback(), which fan the transaction out across every non-excluded adapter, so transactions can be controlled at the logger level instead of one adapter at a time. #17155 [doc] - Added a correctly-spelled
"pkcs7"service alias toPhalcon\Encryption\Crypt\PadFactoryalongside the existing (misspelled)"pjcs7", sonewInstance("pkcs7")resolves the PKCS7 padding. #17160 [doc] - Added an optional
sessionKeyconstructor parameter toPhalcon\Flash\Session(defaulting to the existing_flashMessageskey), letting multi-instance applications namespace their flash messages instead of sharing one session slot. #17158 [doc] - Added the
Phalcon\Db\Dialect::supportsReturning(),Phalcon\Db\Dialect::supportsOnConflictUpdate(),Phalcon\Db\Dialect::supportsMaterializedViews(), andPhalcon\Db\Dialect::supportsAlterTable()capability predicates (overridden per dialect to match each backend) so callers can detect an optional feature instead of catching its dedicated exception. #17163 [doc]
Fixed
- Fixed
Phalcon\Autoload\Loaderreporting a successful autoload for a class-map entry whose mapped file does not exist; the class-map strategy now honors therequireresult and falls through to the namespace and directory strategies instead of short-circuiting them. #17149 [doc] - Fixed
Phalcon\Db\Adapter\Pdo\Mysql::describeColumns()treating a column declaredDEFAULT NULLas having the string"NULL"as its default (MySQL'sINFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULTreports it that way since the 5.13.0 switch away fromSHOW FULL COLUMNS); the sentinel is now read as no default. This stops a nullable column whose value isnullfrom being turned into the string"NULL"on the model attribute aftersave(). #17176 [doc] - Fixed
Phalcon\Encryption\Crypt::decrypt()extracting the GCM/CCM authentication tag withstr_replace(), which stripped every occurrence of the tag's byte sequence from the ciphertext rather than only the trailing tag. With short auth tags an interior collision corrupted the ciphertext and made a valid AEAD payload fail authentication; the tag is now split off by length. #17160 [doc] - Fixed
Phalcon\Encryption\Crypt\Padding\Pkcs7andPhalcon\Encryption\Crypt\Padding\Zeromeasuring binary padded data with the encoding-sensitivemb_strlen(); on a multibyte-capable internal encoding this computed the padding size from the wrong byte and silently mis-unpadded. Both now use byte-truestrlen(). #17160 [doc] - Fixed
Phalcon\Encryption\Security::hash()discarding caller-supplied Argon2 tuning options (memory_cost,time_cost,threads); it rebuilt the options array with onlycost, so a hardened configuration silently ran with defaults. The caller's options are now preserved. #17160 [doc] - Fixed
Phalcon\Filter\Validation::bind()emitting anInvalid arguments supplied for camelize()warning when the data being validated against an entity contained a numeric (integer) key, as happened withPhalcon\Forms\Form::isValid($data, $entity); integer keys are now skipped during entity binding. #17173 [doc] - Fixed
Phalcon\Logger\AbstractLogger::excludeAdapters()leaving the exclusion list armed across calls when the level filter discarded the message; the list is now cleared on everyPhalcon\Logger\AbstractLogger::addMessage()call, so an exclusion is consumed by the call that set it instead of skipping adapters on the next, unrelated log call. #17155 [doc] - Fixed
Phalcon\Mvc\Model::sum()andPhalcon\Mvc\Model::average()returningnullon an empty result set, which violated their declaredfloat | ResultsetInterfacereturn type and raised aTypeErrorin any subclass that overrode them with the same type and delegated throughparent. Both now coerce the empty aggregate to0.0. #17184 [doc] - Fixed
Phalcon\Mvc\Router\Route::compilePattern()andPhalcon\Cli\Router\Route::compilePattern()expanding the:paramsplaceholder - and the built-in/:controller/:action/:paramsand/:task/:action/:paramsdefault routes - to the nested quantifier(/.*)*. The group body overlaps itself, so an unmatchable trailing byte made the compiled pattern backtrack catastrophically: a short crafted URI (a run of/followed by a byte.cannot match) drove thepreg_match()inPhalcon\Mvc\Router::handle()/Phalcon\Cli\Router::handle()into exponential time on every request. The trailing group is now compiled to the equivalent(/.*)?, which captures the sameparamsvalue in linear time. [doc] - Fixed
Phalcon\Support\Collection(and every descendant, includingPhalcon\Config\ConfigandPhalcon\Html\Attributes) orphaning the previously stored entry when a key was overwritten with a different letter casing on a case-insensitive collection.set("Key", 1)followed byset("KEY", 2)left both entries in the backing store, socount(),toArray(), and iteration disagreed withget(),has(), andremove(). The stale entry is now evicted before the new value is written. #17152 [doc] - Fixed
Phalcon\Time\Clock\FrozenClock::adjust()leaving the process-globalwarning.enableflag clobbered on the pre-PHP-8.3 fallback path; the prior value is now restored on both exits. #17151 [doc] - Fixed the
Phalcon\Acl\Adapter\Memorydocumentation and metadata. #17143 [doc] - Fixed the
Phalcon\Autoload\Loaderdebug trail (getDebug()) being wiped by nested autoloads (a class requiring a not-yet-loaded parent); the trail is now reset only on the outermost call. #17149 [doc] - Fixed the
loader:pathFoundevent inPhalcon\Autoload\Loaderfiring more than once per load (and, for the class-map strategy, before the file was confirmed); it now fires once, from the point that loads the file. #17149 [doc]