Franz Hello folks, we are working on some final large refactorings of our PHP backend. We believe these changes are needed to provide extension developers with stable APIs - without which we would not want to release a stable version. I have completed the first phase of refactorings in Flarum's core on the next-back branch. You can help us by applying these changes to our official extensions: Please send pull requests to the various extension repositories - always targeting the next-back branch as well. Here are all namespace changes: Admin/Controller/{WebAppController → FrontendController} Admin/{WebApp → Frontend} Api/Serializer/{DiscussionBasicSerializer → BasicDiscussionSerializer} Api/Serializer/{PostBasicSerializer → BasicPostSerializer} Api/Serializer/{UserBasicSerializer → BasicUserSerializer} Api/{Handler → ExceptionHandler}/FloodingExceptionHandler Api/{Handler → ExceptionHandler}/IlluminateValidationExceptionHandler Api/{Handler → ExceptionHandler}/InvalidAccessTokenExceptionHandler Api/{Handler → ExceptionHandler}/InvalidConfirmationTokenExceptionHandler Api/{Handler → ExceptionHandler}/MethodNotAllowedExceptionHandler Api/{Handler → ExceptionHandler}/ModelNotFoundExceptionHandler Api/{Handler → ExceptionHandler}/PermissionDeniedExceptionHandler Api/{Handler → ExceptionHandler}/RouteNotFoundExceptionHandler Api/{Handler → ExceptionHandler}/TokenMismatchExceptionHandler Api/{Handler → ExceptionHandler}/ValidationExceptionHandler Console/{Command → }/AbstractCommand Discussion/{DiscussionRenamedNotifier → DiscussionRenamedLogger} Forum/Controller/{WebAppController → FrontendController} Forum/{WebApp → Frontend} Http/{Handler → }/ControllerRouteHandler Http/{Handler → }/RouteHandlerFactory { → Frontend}/Asset/CompilerInterface { → Frontend}/Asset/JsCompiler { → Frontend}/Asset/LessCompiler { → Frontend}/Asset/RevisionCompiler {Console/Command → Database/Console}/GenerateMigrationCommand {Core → Discussion}/Command/DeleteDiscussion {Core → Discussion}/Command/DeleteDiscussionHandler {Core → Discussion}/Command/EditDiscussion {Core → Discussion}/Command/EditDiscussionHandler {Core → Discussion}/Command/ReadDiscussion {Core → Discussion}/Command/ReadDiscussionHandler {Core → Discussion}/Command/StartDiscussion {Core → Discussion}/Command/StartDiscussionHandler {Core → Discussion}/Discussion {Core → Group}/Command/CreateGroup {Core → Group}/Command/CreateGroupHandler {Core → Group}/Command/DeleteGroup {Core → Group}/Command/DeleteGroupHandler {Core → Group}/Command/EditGroup {Core → Group}/Command/EditGroupHandler {Core → Group}/Group {Core → Group}/Permission {Core → Notification}/Command/ReadAllNotifications {Core → Notification}/Command/ReadAllNotificationsHandler {Core → Notification}/Command/ReadNotification {Core → Notification}/Command/ReadNotificationHandler {Core → Notification}/Notification {Core → Post}/Command/DeletePost {Core → Post}/Command/DeletePostHandler {Core → Post}/Command/EditPost {Core → Post}/Command/EditPostHandler {Core → Post}/Command/PostReply {Core → Post}/Command/PostReplyHandler {Core → Post}/Exception/FloodingException {Core → Post}/Post {Core → User}/AuthToken {Core → User}/Command/ConfirmEmail {Core → User}/Command/ConfirmEmailHandler {Core → User}/Command/DeleteAvatar {Core → User}/Command/DeleteAvatarHandler {Core → User}/Command/DeleteUser {Core → User}/Command/DeleteUserHandler {Core → User}/Command/EditUser {Core → User}/Command/EditUserHandler {Core → User}/Command/RegisterUser {Core → User}/Command/RegisterUserHandler {Core → User}/Command/RequestPasswordReset {Core → User}/Command/RequestPasswordResetHandler {Core → User}/Command/UploadAvatar {Core → User}/Command/UploadAvatarHandler {Core → User}/EmailToken {Core → User}/Exception/InvalidConfirmationTokenException {Core → User}/Exception/PermissionDeniedException {Core → User}/Guest {Core → User}/PasswordToken {Core → User}/User {Core → }/Notification/MailableInterface {Core → }/Notification/NotificationMailer {Core → }/Notification/NotificationServiceProvider {Core → }/Notification/NotificationSyncer {Core → }/Post/AbstractEventPost {Core → }/Post/CommentPost {Core → }/Post/DiscussionRenamedPost {Core → }/Post/Floodgate {Core → }/Post/MergeableInterface {Core → }/Post/RegisteredTypesScope {Core → }/Search/AbstractRegexGambit {Core → }/Search/AbstractSearch {Core → }/Search/ApplySearchParametersTrait {Core → }/Search/GambitInterface {Core → }/Search/GambitManager {Core → }/Search/SearchCriteria {Core → }/Search/SearchResults {Core → }/Search/SearchServiceProvider {Core/Access → Discussion}/DiscussionPolicy {Core/Access → Group}/GroupPolicy {Core/Access → Post}/PostPolicy {Core/Access → User}/AbstractPolicy {Core/Access → User}/AssertPermissionTrait {Core/Access → User}/Gate {Core/Access → User}/UserPolicy {Core/DiscussionState → Discussion/UserState} {Core/Exception → Foundation}/ValidationException {Core/Listener → Discussion}/DiscussionMetadataUpdater {Core/Listener → Discussion}/DiscussionRenamedNotifier {Core/Listener → User}/EmailConfirmationMailer {Core/Listener → User}/UserMetadataUpdater {Core/Listener/ExtensionValidator → Extension/DefaultLanguagePackGuard} {Core/Notification → Notification/Blueprint}/BlueprintInterface {Core/Notification → Notification/Blueprint}/DiscussionRenamedBlueprint {Core/Repository → Discussion}/DiscussionRepository {Core/Repository → Group}/GroupRepository {Core/Repository → Notification}/NotificationRepository {Core/Repository → Post}/PostRepository {Core/Repository → User}/UserRepository {Core/Search/Discussion → Discussion/Search}/DiscussionSearch {Core/Search/Discussion → Discussion/Search}/DiscussionSearcher {Core/Search/Discussion → Discussion/Search}/Fulltext/DriverInterface {Core/Search/Discussion → Discussion/Search}/Fulltext/MySqlFulltextDriver {Core/Search/Discussion → Discussion/Search}/Gambit/AuthorGambit {Core/Search/Discussion → Discussion/Search}/Gambit/CreatedGambit {Core/Search/Discussion → Discussion/Search}/Gambit/FulltextGambit {Core/Search/Discussion → Discussion/Search}/Gambit/HiddenGambit {Core/Search/Discussion → Discussion/Search}/Gambit/UnreadGambit {Core/Search/User → User/Search}/Gambit/EmailGambit {Core/Search/User → User/Search}/Gambit/FulltextGambit {Core/Search/User → User/Search}/Gambit/GroupGambit {Core/Search/User → User/Search}/UserSearch {Core/Search/User → User/Search}/UserSearcher {Core/Support → Database}/ScopeVisibilityTrait {Core/Support → Foundation}/DispatchEventsTrait {Core/Support → Foundation}/EventGeneratorTrait {Core/Validator → Discussion}/DiscussionValidator {Core/Validator → Foundation}/AbstractValidator {Core/Validator → Group}/GroupValidator {Core/Validator → Post}/PostValidator {Core/Validator → User}/AvatarValidator {Core/Validator → User}/UserValidator {Debug → Foundation}/Console/CacheClearCommand {Debug → Foundation}/Console/InfoCommand {Event/AvatarWillBeDeleted → User/Event/AvatarDeleting} {Event/AvatarWillBeSaved → User/Event/AvatarSaving} {Event/CheckUserPassword → User/Event/CheckingPassword} {Event/ConfigureApiController → Api/Event/WillGetData} {Event/ConfigureDiscussionSearch → Discussion/Event/Searching} {Event/ConfigureFormatter → Formatter/Event/Configuring} {Event/ConfigureFormatterParser → Formatter/Event/Parsing} {Event/ConfigureFormatterRenderer → Formatter/Event/Rendering} {Event/ConfigureUserSearch → User/Event/Searching} {Event/ConfigureValidator → Foundation/Event/Validating} {Event/ConfigureWebApp → Frontend/Event/Rendering} {Event/DiscussionStateWillBeSaved → Discussion/Event/UserDataSaving} {Event/DiscussionWasDeleted → Discussion/Event/Deleted} {Event/DiscussionWasHidden → Discussion/Event/Hidden} {Event/DiscussionWasRead → Discussion/Event/UserRead} {Event/DiscussionWasRenamed → Discussion/Event/Renamed} {Event/DiscussionWasRestored → Discussion/Event/Restored} {Event/DiscussionWasStarted → Discussion/Event/Started} {Event/DiscussionWillBeDeleted → Discussion/Event/Deleting} {Event/DiscussionWillBeSaved → Discussion/Event/Saving} {Event/ExtensionWasDisabled → Extension/Event/Disabled} {Event/ExtensionWasEnabled → Extension/Event/Enabled} {Event/ExtensionWasUninstalled → Extension/Event/Uninstalled} {Event/ExtensionWillBeDisabled → Extension/Event/Disabling} {Event/ExtensionWillBeEnabled → Extension/Event/Enabling} {Event/GroupWasCreated → Group/Event/Created} {Event/GroupWasDeleted → Group/Event/Deleted} {Event/GroupWasRenamed → Group/Event/Renamed} {Event/GroupWillBeDeleted → Group/Event/Deleting} {Event/GroupWillBeSaved → Group/Event/Saving} {Event/NotificationWillBeSent → Notification/Event/Sending} {Event/PostWasDeleted → Post/Event/Deleted} {Event/PostWasHidden → Post/Event/Hidden} {Event/PostWasPosted → Post/Event/Posted} {Event/PostWasRestored → Post/Event/Restored} {Event/PostWasRevised → Post/Event/Revised} {Event/PostWillBeDeleted → Post/Event/Deleting} {Event/PostWillBeSaved → Post/Event/Saving} {Event/PrepareApiAttributes → Api/Event/Serializing} {Event/PrepareApiData → Api/Event/WillSerializeData} {Event/PrepareSerializedSetting → Settings/Event/Serializing} {Event/PrepareUnserializedSettings → Settings/Event/Deserializing} {Event/SettingWasSet → Settings/Event/Saved} {Event/UserAvatarWasChanged → User/Event/AvatarChanged} {Event/UserBioWasChanged → User/Event/BioChanged} {Event/UserEmailChangeWasRequested → User/Event/EmailChangeRequested} {Event/UserEmailWasChanged → User/Event/EmailChanged} {Event/UserGroupsWereChanged → User/Event/GroupsChanged} {Event/UserLoggedIn → User/Event/LoggedIn} {Event/UserLoggedOut → User/Event/LoggedOut} {Event/UserPasswordWasChanged → User/Event/PasswordChanged} {Event/UserWasActivated → User/Event/Activated} {Event/UserWasDeleted → User/Event/Deleted} {Event/UserWasRegistered → User/Event/Registered} {Event/UserWasRenamed → User/Event/Renamed} {Event/UserWillBeDeleted → User/Event/Deleting} {Event/UserWillBeSaved → User/Event/Saving} {Http/Controller/AbstractWebAppController → Frontend/AbstractFrontendController} {Http/WebApp/AbstractWebApp → Frontend/AbstractFrontend} {Http/WebApp/WebAppAssets → Frontend/FrontendAssets} {Http/WebApp/WebAppAssetsFactory → Frontend/FrontendAssetsFactory} {Http/WebApp/WebAppView → Frontend/FrontendView} {Http/WebApp/WebAppViewFactory → Frontend/FrontendViewFactory} {Locale/JsCompiler → Frontend/Asset/LocaleJsCompiler} {Update → Database}/Console/MigrateCommand In addition, there were some smaller changes that may or may not affect you (in order of importance, from highest to lowest): URL generation has been changed - there is now only one interface instead of three, and its usage is slightly different. There is now a new Site class. Only relevant if you were dealing with Application or Server instances so far. Server classes have been removed. Likely not relevant, as the ConfigureMiddleware event still has the same API. The CoreServiceProvider has been split up into several smaller ones. You can take the opportunity to change your own extensions accordingly, so that they are prepared for beta 8. We have some more changes in store for beta.8 - we are trying to batch all breaking changes together as much as possible, to keep your upgrading work to a minimum.
Kyrne Franz rip all extensions once beta 8 comes out. I'll create a .sh script to convert everything automatically