003 — Roadmap
We want Yii 3 to:
- Not limit a developer to choosing architecture. Allow anything from "classic" MVC to DDD.
- Be based on the best practices such as SOLID, GRASP, etc. and teach them to the community.
- Keep the most good things from Yii 2.
- Be more open to the global PHP community and infrastructure.
PSRs compliance
PSR compliance helps with customizability, the ability to use general PHP libraries and implement fewer wrappers. Here's the list of PSRs we want to implement.
PSR-3 Logger
Implemented as a separate package that isn't dependent on a framework.
- Framework packages should depend on interface only.
- Split drivers into packages.
- Clean-up code.
- Fix email target.
PSR-4 Autoloading
- Autoloading is fine already.
- Document on how it works.
PSR-7 HTTP message
- Remove our own implementation. At least for now.
- Framework packages should depend on interfaces only.
PSR-11 Container
Implemented as a separate package that isn't dependent on a framework.
- Framework packages shouldn't use container directly. One should be able to instantiate everything manually.
- Finish refactoring.
- Remove all framework-specific implementations from the package. Move to a framework.
- Implement autoloader fallback
PSR-12 Code style
- Make sure the code follows it.
- Automate fixing style before release.
PSR-14 Event dispatcher
- Implement as a separate library.
- Use in other packages.
- Polish.
PSR-15 HTTP handlers
- Rewrite HTTP flow to PSR-7 request-response + formatting response via emitter.
- Offer SAPI emitter out of the box.
- Make it possible to use alternative emitters such as RoadRunner.
- Support middleware.
- Implement filters as middleware:
- Re-implement router w/ middleware support for route groups.
- Filters should be middlewares.
PSR-16 Simple cache
Implemented as a separate package that isn't dependent on a framework.
- Framework packages should depend on interfaces only.
- Split drivers into packages.
- Clean-up code.
PSR-17 HTTP factories
- Use PSR factories.
PSR-18 HTTP client
- Remove our own implementation. At least for now.
- Framework packages should depend on interfaces only.
Stricter types
- Make sure type hinting is used everywhere.
- Make sure types are as definitive as possible. Avoid varying types if possible.
Single application template
- Drop basic/advanced.
- Create a single application template that works out of the box.
Router
Implemented as a separate package that isn't dependent on a framework.
- DSL for configuration.
- Ability to route to any callable.
- Named routes.
- Route groups w/ middleware support.
Best practices and SOLID compliance of all classes/packages
- Make sure interfaces follow the "interface segregation" principle.
- Don't use public properties.
- Don't use
init(). - Don't inherit from
BaseObjectorComponent. Remove these. - No globals.
- No static calls except helpers that are final.
- Prefer throwing exceptions to fixing input.
Development toolkit
- Release command line tool
- Development command line tool (symlinks packages into usable application)
Консоль
- Separate web and console application
- Possibly eliminate base application (still needed)
- Create an interface for the console (using Symfony one)
- Implementation may be one of the popular ones (using Symfony one)
- Ensure application can add commands via config
Documentation
- Follow best practices.
- Don't use the "MVC" term.
- Upgrading from Yii 2.
RBAC
RBAC is implemented as a framework-independent package.
- Finish refactoring.
- Make sure it follows best practices.
- Split drivers into packages.
View
View is implemented as framework-independent package.
- Finish refactoring (see issues).
- Port widgets.
- Rethink and implement active form widgets.
- Implement caching widgets.
Data abstractions and grid
- Finish data abstractions.
- Port sort, use data abstractions. Should be part of yii-dataview.
- Port paging, use data abstractions. Should be part of yii-dataview.
- Port grid, use data abstractions. Should be part of yii-dataview.
- Port list, use data abstractions. Should be part of yii-dataview.
Validators
- Finish the main package redesign
- Port necessary validators
Debug toolbar
- Port debug toolbar.
Gii
- Port Gii.
Infrastructure
Others
- Decide on namespaces.
- Clean up error handler. Make sure the error handler catches fatals and is using response.
- Make validators independent of models to allow reusing them in handlers.
- Split IdentityInterface.