- Added composer.lock
- Cleaned up code style and documentation
- Improved readme files for each component
- Cleaned up trailing whitespace and unused imports
- Implemented SQLite adapter
- Implemented SQL Server ANSI offset (#49)
- Fixed a bug when using
nullin array filter values - Fixed use of deprecated
MYSQL_ASSOCconstant - Implemented SQLite support for
Database\Factory
- Ensured that records loaded through find() and findOrNew() are reinstated (no changed attributes)
- Updated
Record::save()to skip saving if no data has changed - Implemented
Record::attach()andRecord::detach(), which are now used for magic setters on relation attributes, instead of saving (associating) them immediately (#46) - Improved belongs-to consistency issues
- Added
JsonSerializableinterface toModel - Updated
Record::call()to be more strict; avoids unexpected behavior such as any method call on aRecordbeing valid - Implemented
Relation::query()support - allows opening relation queries from a relation object - Fixed an issue when associating has-many relations with empty ID values
- Renamed
Queryable::execute()andQuery\Builder::execute()methods torun()(#51) - Improved in-memory storage when updating and deleting
- Added @mixin Query annotation for
Storage\Query\Builder(#53)
- Fixed strict standards issue with
Facade - Implemented delegate service containers
- Added readmes for all packages, apart from Foundation
- Simplified the framework readme
- PSR-2 code style for all packages
- PSR-4 namespacing for all unit tests
- Implemented a database-specific query object that provides table joins,
subqueries,
GROUP BYandHAVING, which database query translators now support - Fixed MySQL connection query issues that occurred without the
mysqlndextension - Added missing error check after preparing MySQL query statement result - Catches syntax or logical errors with queries, e.g. 'Subquery returns more than 1 row' for column subqueries
- Implemented a new
Foundationnamespace to house classes that aid the set up of an application, including a configuration interface with implementations and a handful of default service providers - Moved the autoloader to this namespace
- Improved HTTP response
- Changed response to prepare content as a string when sent instead of when the content is set
- Changed content type to
application/jsoninstead oftext/jsonfor array content - Implemented
Response::body()for retrieving content as a string - Removed old cookie methods
- Refactored and added more dynamic properties such as
status,headers,cookies,contentandredirected - Unit tested
- Lots of general improvements and refactoring for
ModelandRecord - Implemented querying parameters (filter, order, limit) to relations and eager
loading in
Record Model::data()now returns transformed (non-raw attributes)- Raw attribute access has moved to
Model::rawData() - The
toArray(),toJson()andgetIterator()methods now utilise the transformed attributes
- Raw attribute access has moved to
- Implemented
Model::convertToJson()- allows converting plain array of models to JSON - Added unique() method to
Queryobjects andQuery\Builderexecutor methods
- Implemented relation constraints
- Improved model hydration, generation and reinstatement
- Tested relations and records more thoroughly
- Implemented dot notation for
Records for accessing relation attributes - Refactored relation naming and factory method
- Allows string keys in relation definitions, which call methods on the
relation when it is built, such as
'foreignKey','localKey'and'constrain'
- Allows string keys in relation definitions, which call methods on the
relation when it is built, such as
- Refactored abstract SQL translator
- Fixed null and boolean comparisons for MySQL queries
- Refactored database/storage results
- Implemented iterable storage results (includes database results)
- Updated database connections to accept
Queryobjects for theirquery()methods - Database factory throws an exception if it fails, instead of returning null
- Fixed and refactored
Requestcreation, path retrieval and optionally setting status code - Implemented default value parameters for
Requestdata retrieval methods - Implemented
content()method forRequestobjects
- Updated MySQL connection to work without the mysqlnd driver
- Implemented
InMemorystorage for unit tests; includes in-memory filtering, sorting, limiting etc - Implemented many-to-many eager loading and counting
- Refactored, tested and fixed ORM relations and other ORM & database classes
- Implemented SQL Server database connection
- Implemented prepared queries for MySQL connection
- Implemented dedicated
Queryclass to represent database queries - Implemented
Transformerclasses forModelattribute access and mutation - Implemented fluent query builder with queryable storage and dedicated translator classes
- Implemented reverse routing, or route URL/path generation
- Added event dispatchment to database connections
- Extracted handling of
Responsecookies to aCookiesclass - Removed
escape()methods from database connections. - Many database-related bug fixes.
- Implemented
Database,ORMandStoragepackages - Removed use of global
DEBUGconstant - Made
Responsecontent optional - Wrote lots of unit tests
- Removed
Interfacesuffix for many interfaces - Implemented recursive service/alias resolution for
Container. - Renamed abstract
Viewclass toAbstractView
- Minor
Autoloaderimprovement - Major
Routerrefactoring using method extraction Sessionobjects can now be accessed like arrays, and as a result through their parentRequestobjects in the same way as other request dataResponserefactoring, also removedResponse::addContent()- Removed redundant
Tools::processPost() - Added
ContainerInterface::all()andSessionInterface::has() Containernow automatically injects itself to anyContainerAwareInterfaceimplementors that it instantiates- Simplified
Request/ResponseAPI
Autoloaderrefactoring- Implemented improved
Dispatcherfunctionality inRouter, makingDispatcherredundant - Implemented
Eventscomponent that can be optionally used for routing hooks - Implemented optional usage of service container for resolving route controllers and actions
- Method support for
Container::call() - Implemented
Container::share()to wrap callable service definitions in closures that always return the same instance. This enables lazy-loading service instances, only instantiating them when resolved from the container. - Request objects parse URI queries into get variables and store a path value.
- Updated main readme to consist primarily of code examples.
Controllernow implements ContainerAwareInterface, as doesRouter.- Added more thorough
Facadeexceptions - Implemented
Applicationclass which registered and boots service providers.
- More expressive routing API
- Implemented reverse routing (using named routes)
- Various non-backwards-compatible API changes, hence the minor version change
- Readme files
- Autoloader script (
autoloader.php) - Improvements to
Autoloaderclass - Minor and cosmetic improvements to
RequestandResponseclasses Responseaccepts arrays as content to be sent as JSON- Implemented
Model::toArray(),Model::toJson()and some useful interfaces - Implemented
SmartyView - Routes accept objects as default controllers
- Respond to a request directly from a
RouterusingRouter::respond - Implemented service container reflection so function or class constructor
parameters can be resolved using
Container::callorContainer::createif the type-hinted classes or interfaces are registered with the container
- Initial commit after a few months of experimentation