summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2022-02-22 11:28:26 +0000
committerGreg Roach <greg@subaqua.co.uk>2022-02-23 10:22:28 +0000
commitb55cbc6b43247e8b2ad14af6f6d24dc6747195ff (patch)
tree7c48ed3c99e4c7887dee5e923035c862fdff92cd /app
parent709c7e1a4da00208ea2ab538eb0a1f2d46f63629 (diff)
downloadwebtrees-b55cbc6b43247e8b2ad14af6f6d24dc6747195ff.tar.gz
webtrees-b55cbc6b43247e8b2ad14af6f6d24dc6747195ff.tar.bz2
webtrees-b55cbc6b43247e8b2ad14af6f6d24dc6747195ff.zip
Update and use Validation class
Diffstat (limited to 'app')
-rw-r--r--app/Auth.php5
-rw-r--r--app/Census/CensusColumnRelationToHead.php8
-rw-r--r--app/CommonMark/CensusTableExtension.php1
-rw-r--r--app/CommonMark/XrefNode.php1
-rw-r--r--app/Elements/AbstractEventElement.php1
-rw-r--r--app/Elements/Census.php14
-rw-r--r--app/Elements/DateValue.php5
-rw-r--r--app/Encodings/UTF16BE.php1
-rw-r--r--app/Encodings/UTF16LE.php1
-rw-r--r--app/Encodings/UTF8.php1
-rw-r--r--app/Exceptions/InvalidGedcomEncodingException.php1
-rw-r--r--app/Factories/ElementFactory.php1
-rw-r--r--app/GedcomRecord.php15
-rw-r--r--app/Helpers/functions.php14
-rw-r--r--app/Http/Middleware/AuthAdministrator.php3
-rw-r--r--app/Http/Middleware/AuthEditor.php9
-rw-r--r--app/Http/Middleware/AuthLoggedIn.php5
-rw-r--r--app/Http/Middleware/AuthManager.php9
-rw-r--r--app/Http/Middleware/AuthMember.php9
-rw-r--r--app/Http/Middleware/AuthModerator.php9
-rw-r--r--app/Http/Middleware/BadBotBlocker.php9
-rw-r--r--app/Http/Middleware/BaseUrl.php3
-rw-r--r--app/Http/Middleware/CheckCsrf.php3
-rw-r--r--app/Http/Middleware/HandleExceptions.php10
-rw-r--r--app/Http/Middleware/LoadRoutes.php3
-rw-r--r--app/Http/Middleware/RequestHandler.php4
-rw-r--r--app/Http/Middleware/Router.php3
-rw-r--r--app/Http/Middleware/UseDatabase.php25
-rw-r--r--app/Http/RequestHandlers/AbstractTomSelectHandler.php11
-rw-r--r--app/Http/RequestHandlers/AccountDelete.php5
-rw-r--r--app/Http/RequestHandlers/AccountEdit.php8
-rw-r--r--app/Http/RequestHandlers/AccountUpdate.php5
-rw-r--r--app/Http/RequestHandlers/AddChildToFamilyAction.php15
-rw-r--r--app/Http/RequestHandlers/AddChildToFamilyPage.php15
-rw-r--r--app/Http/RequestHandlers/AddChildToIndividualAction.php16
-rw-r--r--app/Http/RequestHandlers/AddChildToIndividualPage.php14
-rw-r--r--app/Http/RequestHandlers/AddMediaFileAction.php17
-rw-r--r--app/Http/RequestHandlers/AddMediaFileModal.php9
-rw-r--r--app/Http/RequestHandlers/AddNewFact.php11
-rw-r--r--app/Http/RequestHandlers/AddParentToIndividualAction.php18
-rw-r--r--app/Http/RequestHandlers/AddParentToIndividualPage.php18
-rw-r--r--app/Http/RequestHandlers/AddSpouseToFamilyAction.php14
-rw-r--r--app/Http/RequestHandlers/AddSpouseToFamilyPage.php16
-rw-r--r--app/Http/RequestHandlers/AddSpouseToIndividualAction.php18
-rw-r--r--app/Http/RequestHandlers/AddSpouseToIndividualPage.php14
-rw-r--r--app/Http/RequestHandlers/AddUnlinkedAction.php9
-rw-r--r--app/Http/RequestHandlers/AddUnlinkedPage.php7
-rw-r--r--app/Http/RequestHandlers/AdminMediaFileDownload.php4
-rw-r--r--app/Http/RequestHandlers/AutoCompleteCitation.php7
-rw-r--r--app/Http/RequestHandlers/AutoCompleteFolder.php7
-rw-r--r--app/Http/RequestHandlers/AutoCompletePlace.php7
-rw-r--r--app/Http/RequestHandlers/AutoCompleteSurname.php7
-rw-r--r--app/Http/RequestHandlers/BroadcastAction.php5
-rw-r--r--app/Http/RequestHandlers/BroadcastPage.php3
-rw-r--r--app/Http/RequestHandlers/CalendarAction.php9
-rw-r--r--app/Http/RequestHandlers/CalendarEvents.php8
-rw-r--r--app/Http/RequestHandlers/CalendarPage.php9
-rw-r--r--app/Http/RequestHandlers/ChangeFamilyMembersAction.php6
-rw-r--r--app/Http/RequestHandlers/ChangeFamilyMembersPage.php8
-rw-r--r--app/Http/RequestHandlers/CheckTree.php5
-rw-r--r--app/Http/RequestHandlers/CleanDataFolder.php5
-rw-r--r--app/Http/RequestHandlers/ContactAction.php21
-rw-r--r--app/Http/RequestHandlers/ContactPage.php7
-rw-r--r--app/Http/RequestHandlers/CopyFact.php14
-rw-r--r--app/Http/RequestHandlers/CreateLocationAction.php7
-rw-r--r--app/Http/RequestHandlers/CreateLocationModal.php6
-rw-r--r--app/Http/RequestHandlers/CreateMediaObjectAction.php7
-rw-r--r--app/Http/RequestHandlers/CreateMediaObjectFromFile.php8
-rw-r--r--app/Http/RequestHandlers/CreateMediaObjectModal.php8
-rw-r--r--app/Http/RequestHandlers/CreateNoteAction.php8
-rw-r--r--app/Http/RequestHandlers/CreateNoteModal.php6
-rw-r--r--app/Http/RequestHandlers/CreateRepositoryAction.php15
-rw-r--r--app/Http/RequestHandlers/CreateRepositoryModal.php6
-rw-r--r--app/Http/RequestHandlers/CreateSourceAction.php7
-rw-r--r--app/Http/RequestHandlers/CreateSourceModal.php6
-rw-r--r--app/Http/RequestHandlers/CreateSubmissionAction.php8
-rw-r--r--app/Http/RequestHandlers/CreateSubmissionModal.php7
-rw-r--r--app/Http/RequestHandlers/CreateSubmitterAction.php8
-rw-r--r--app/Http/RequestHandlers/CreateSubmitterModal.php7
-rw-r--r--app/Http/RequestHandlers/DataFixChoose.php6
-rw-r--r--app/Http/RequestHandlers/DataFixData.php8
-rw-r--r--app/Http/RequestHandlers/DataFixPage.php8
-rw-r--r--app/Http/RequestHandlers/DataFixPreview.php8
-rw-r--r--app/Http/RequestHandlers/DataFixSelect.php7
-rw-r--r--app/Http/RequestHandlers/DataFixUpdate.php8
-rw-r--r--app/Http/RequestHandlers/DataFixUpdateAll.php7
-rw-r--r--app/Http/RequestHandlers/DeleteFact.php14
-rw-r--r--app/Http/RequestHandlers/DeleteRecord.php12
-rw-r--r--app/Http/RequestHandlers/DeleteTreeAction.php6
-rw-r--r--app/Http/RequestHandlers/EditFactAction.php16
-rw-r--r--app/Http/RequestHandlers/EditFactPage.php14
-rw-r--r--app/Http/RequestHandlers/EditMediaFileAction.php14
-rw-r--r--app/Http/RequestHandlers/EditMediaFileModal.php14
-rw-r--r--app/Http/RequestHandlers/EditNoteAction.php16
-rw-r--r--app/Http/RequestHandlers/EditNotePage.php11
-rw-r--r--app/Http/RequestHandlers/EditRawFactAction.php29
-rw-r--r--app/Http/RequestHandlers/EditRawFactPage.php22
-rw-r--r--app/Http/RequestHandlers/EditRawRecordAction.php11
-rw-r--r--app/Http/RequestHandlers/EditRawRecordPage.php10
-rw-r--r--app/Http/RequestHandlers/EditRecordAction.php17
-rw-r--r--app/Http/RequestHandlers/EditRecordPage.php12
-rw-r--r--app/Http/RequestHandlers/EmailPreferencesAction.php6
-rw-r--r--app/Http/RequestHandlers/EmptyClipboard.php4
-rw-r--r--app/Http/RequestHandlers/ExportGedcomClient.php15
-rw-r--r--app/Http/RequestHandlers/ExportGedcomPage.php7
-rw-r--r--app/Http/RequestHandlers/ExportGedcomServer.php6
-rw-r--r--app/Http/RequestHandlers/FamilyPage.php17
-rw-r--r--app/Http/RequestHandlers/FindDuplicateRecords.php6
-rw-r--r--app/Http/RequestHandlers/GedcomLoad.php6
-rw-r--r--app/Http/RequestHandlers/GedcomRecordPage.php12
-rw-r--r--app/Http/RequestHandlers/HeaderPage.php15
-rw-r--r--app/Http/RequestHandlers/HomePage.php3
-rw-r--r--app/Http/RequestHandlers/ImportGedcomAction.php6
-rw-r--r--app/Http/RequestHandlers/ImportGedcomPage.php6
-rw-r--r--app/Http/RequestHandlers/IndividualPage.php15
-rw-r--r--app/Http/RequestHandlers/LinkChildToFamilyAction.php10
-rw-r--r--app/Http/RequestHandlers/LinkChildToFamilyPage.php16
-rw-r--r--app/Http/RequestHandlers/LinkMediaToFamilyModal.php10
-rw-r--r--app/Http/RequestHandlers/LinkMediaToIndividualModal.php10
-rw-r--r--app/Http/RequestHandlers/LinkMediaToRecordAction.php10
-rw-r--r--app/Http/RequestHandlers/LinkMediaToSourceModal.php10
-rw-r--r--app/Http/RequestHandlers/LinkSpouseToIndividualAction.php10
-rw-r--r--app/Http/RequestHandlers/LinkSpouseToIndividualPage.php10
-rw-r--r--app/Http/RequestHandlers/LocationPage.php15
-rw-r--r--app/Http/RequestHandlers/LoginAction.php10
-rw-r--r--app/Http/RequestHandlers/LoginPage.php5
-rw-r--r--app/Http/RequestHandlers/Logout.php3
-rw-r--r--app/Http/RequestHandlers/ManageTrees.php3
-rw-r--r--app/Http/RequestHandlers/Masquerade.php5
-rw-r--r--app/Http/RequestHandlers/MediaFileDownload.php10
-rw-r--r--app/Http/RequestHandlers/MediaFileThumbnail.php11
-rw-r--r--app/Http/RequestHandlers/MediaPage.php15
-rw-r--r--app/Http/RequestHandlers/MergeFactsAction.php6
-rw-r--r--app/Http/RequestHandlers/MergeFactsPage.php6
-rw-r--r--app/Http/RequestHandlers/MergeRecordsAction.php6
-rw-r--r--app/Http/RequestHandlers/MergeRecordsPage.php7
-rw-r--r--app/Http/RequestHandlers/MessageAction.php14
-rw-r--r--app/Http/RequestHandlers/MessagePage.php9
-rw-r--r--app/Http/RequestHandlers/MessageSelect.php6
-rw-r--r--app/Http/RequestHandlers/ModuleAction.php4
-rw-r--r--app/Http/RequestHandlers/NotePage.php15
-rw-r--r--app/Http/RequestHandlers/PasswordRequestAction.php3
-rw-r--r--app/Http/RequestHandlers/PasswordRequestPage.php5
-rw-r--r--app/Http/RequestHandlers/PasswordResetAction.php3
-rw-r--r--app/Http/RequestHandlers/PasswordResetPage.php3
-rw-r--r--app/Http/RequestHandlers/PasteFact.php13
-rw-r--r--app/Http/RequestHandlers/PendingChanges.php6
-rw-r--r--app/Http/RequestHandlers/PendingChangesAcceptChange.php10
-rw-r--r--app/Http/RequestHandlers/PendingChangesAcceptRecord.php9
-rw-r--r--app/Http/RequestHandlers/PendingChangesAcceptTree.php6
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogData.php6
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogDelete.php7
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogDownload.php7
-rw-r--r--app/Http/RequestHandlers/PendingChangesLogPage.php8
-rw-r--r--app/Http/RequestHandlers/PendingChangesRejectChange.php10
-rw-r--r--app/Http/RequestHandlers/PendingChangesRejectRecord.php9
-rw-r--r--app/Http/RequestHandlers/PendingChangesRejectTree.php6
-rw-r--r--app/Http/RequestHandlers/RedirectDescendencyPhp.php1
-rw-r--r--app/Http/RequestHandlers/RedirectFamilyPhp.php4
-rw-r--r--app/Http/RequestHandlers/RedirectGedRecordPhp.php4
-rw-r--r--app/Http/RequestHandlers/RedirectIndividualPhp.php4
-rw-r--r--app/Http/RequestHandlers/RedirectMediaViewerPhp.php4
-rw-r--r--app/Http/RequestHandlers/RedirectModulePhp.php1
-rw-r--r--app/Http/RequestHandlers/RedirectNotePhp.php4
-rw-r--r--app/Http/RequestHandlers/RedirectRelationshipPhp.php1
-rw-r--r--app/Http/RequestHandlers/RedirectRepositoryPhp.php4
-rw-r--r--app/Http/RequestHandlers/RedirectSourcePhp.php4
-rw-r--r--app/Http/RequestHandlers/RegisterAction.php7
-rw-r--r--app/Http/RequestHandlers/RegisterPage.php3
-rw-r--r--app/Http/RequestHandlers/RenumberTreeAction.php7
-rw-r--r--app/Http/RequestHandlers/RenumberTreePage.php7
-rw-r--r--app/Http/RequestHandlers/ReorderChildrenAction.php10
-rw-r--r--app/Http/RequestHandlers/ReorderChildrenPage.php10
-rw-r--r--app/Http/RequestHandlers/ReorderFamiliesAction.php10
-rw-r--r--app/Http/RequestHandlers/ReorderFamiliesPage.php13
-rw-r--r--app/Http/RequestHandlers/ReorderMediaAction.php14
-rw-r--r--app/Http/RequestHandlers/ReorderMediaPage.php16
-rw-r--r--app/Http/RequestHandlers/ReorderNamesAction.php10
-rw-r--r--app/Http/RequestHandlers/ReorderNamesPage.php16
-rw-r--r--app/Http/RequestHandlers/ReportGenerate.php13
-rw-r--r--app/Http/RequestHandlers/ReportListAction.php11
-rw-r--r--app/Http/RequestHandlers/ReportListPage.php12
-rw-r--r--app/Http/RequestHandlers/ReportSetupAction.php13
-rw-r--r--app/Http/RequestHandlers/ReportSetupPage.php13
-rw-r--r--app/Http/RequestHandlers/RepositoryPage.php17
-rw-r--r--app/Http/RequestHandlers/RobotsTxt.php3
-rw-r--r--app/Http/RequestHandlers/SearchAdvancedAction.php11
-rw-r--r--app/Http/RequestHandlers/SearchAdvancedPage.php6
-rw-r--r--app/Http/RequestHandlers/SearchGeneralAction.php7
-rw-r--r--app/Http/RequestHandlers/SearchGeneralPage.php5
-rw-r--r--app/Http/RequestHandlers/SearchPhoneticAction.php7
-rw-r--r--app/Http/RequestHandlers/SearchPhoneticPage.php6
-rw-r--r--app/Http/RequestHandlers/SearchQuickAction.php6
-rw-r--r--app/Http/RequestHandlers/SearchReplaceAction.php8
-rw-r--r--app/Http/RequestHandlers/SearchReplacePage.php11
-rw-r--r--app/Http/RequestHandlers/SelectDefaultTree.php6
-rw-r--r--app/Http/RequestHandlers/SelectLanguage.php4
-rw-r--r--app/Http/RequestHandlers/SelectNewFact.php10
-rw-r--r--app/Http/RequestHandlers/SelectTheme.php4
-rw-r--r--app/Http/RequestHandlers/SetupWizard.php8
-rw-r--r--app/Http/RequestHandlers/SourcePage.php17
-rw-r--r--app/Http/RequestHandlers/SubmissionPage.php15
-rw-r--r--app/Http/RequestHandlers/SubmitterPage.php17
-rw-r--r--app/Http/RequestHandlers/SynchronizeTrees.php7
-rw-r--r--app/Http/RequestHandlers/TreePage.php11
-rw-r--r--app/Http/RequestHandlers/TreePageBlock.php7
-rw-r--r--app/Http/RequestHandlers/TreePageBlockEdit.php13
-rw-r--r--app/Http/RequestHandlers/TreePageBlockUpdate.php10
-rw-r--r--app/Http/RequestHandlers/TreePageEdit.php11
-rw-r--r--app/Http/RequestHandlers/TreePageUpdate.php10
-rw-r--r--app/Http/RequestHandlers/TreePreferencesAction.php7
-rw-r--r--app/Http/RequestHandlers/TreePreferencesPage.php9
-rw-r--r--app/Http/RequestHandlers/TreePrivacyAction.php7
-rw-r--r--app/Http/RequestHandlers/TreePrivacyPage.php6
-rw-r--r--app/Http/RequestHandlers/UnconnectedAction.php7
-rw-r--r--app/Http/RequestHandlers/UnconnectedPage.php12
-rw-r--r--app/Http/RequestHandlers/UserEditAction.php5
-rw-r--r--app/Http/RequestHandlers/UserListData.php3
-rw-r--r--app/Http/RequestHandlers/UserListPage.php3
-rw-r--r--app/Http/RequestHandlers/UserPage.php12
-rw-r--r--app/Http/RequestHandlers/UserPageBlock.php9
-rw-r--r--app/Http/RequestHandlers/UserPageBlockEdit.php15
-rw-r--r--app/Http/RequestHandlers/UserPageBlockUpdate.php13
-rw-r--r--app/Http/RequestHandlers/UserPageEdit.php13
-rw-r--r--app/Http/RequestHandlers/UserPageUpdate.php10
-rw-r--r--app/Http/RequestHandlers/VerifyEmail.php5
-rw-r--r--app/Http/Routes/WebRoutes.php8
-rw-r--r--app/Log.php6
-rw-r--r--app/Module/AncestorsChartModule.php51
-rw-r--r--app/Module/BranchesListModule.php21
-rw-r--r--app/Module/CensusAssistantModule.php6
-rw-r--r--app/Module/ChartsMenuModule.php7
-rw-r--r--app/Module/ClippingsCartModule.php77
-rw-r--r--app/Module/ColorsTheme.php5
-rw-r--r--app/Module/CompactTreeChartModule.php29
-rw-r--r--app/Module/ContactsFooterModule.php3
-rw-r--r--app/Module/DescendancyChartModule.php36
-rw-r--r--app/Module/DescendancyModule.php11
-rw-r--r--app/Module/FamilyBookChartModule.php52
-rw-r--r--app/Module/FamilyListModule.php12
-rw-r--r--app/Module/FamilyTreeFavoritesModule.php15
-rw-r--r--app/Module/FamilyTreeNewsModule.php12
-rw-r--r--app/Module/FamilyTreeStatisticsModule.php18
-rw-r--r--app/Module/FanChartModule.php46
-rw-r--r--app/Module/FrequentlyAskedQuestionsModule.php7
-rw-r--r--app/Module/GoogleAnalyticsModule.php8
-rw-r--r--app/Module/HitCountFooterModule.php12
-rw-r--r--app/Module/HourglassChartModule.php44
-rw-r--r--app/Module/IndividualListModule.php17
-rw-r--r--app/Module/InteractiveTreeModule.php23
-rw-r--r--app/Module/LifespansChartModule.php18
-rw-r--r--app/Module/LocationListModule.php13
-rw-r--r--app/Module/MediaListModule.php13
-rw-r--r--app/Module/ModuleAnalyticsTrait.php7
-rw-r--r--app/Module/ModuleTabTrait.php9
-rw-r--r--app/Module/ModuleThemeTrait.php49
-rw-r--r--app/Module/NoteListModule.php13
-rw-r--r--app/Module/OpenStreetMap.php1
-rw-r--r--app/Module/PedigreeChartModule.php36
-rw-r--r--app/Module/PedigreeMapModule.php50
-rw-r--r--app/Module/PlaceHierarchyListModule.php13
-rw-r--r--app/Module/PrivacyPolicy.php15
-rw-r--r--app/Module/RelationshipsChartModule.php53
-rw-r--r--app/Module/ReportsMenuModule.php7
-rw-r--r--app/Module/RepositoryListModule.php13
-rw-r--r--app/Module/ShareAnniversaryModule.php15
-rw-r--r--app/Module/SiteMapModule.php12
-rw-r--r--app/Module/SourceListModule.php13
-rw-r--r--app/Module/StatisticsChartModule.php11
-rw-r--r--app/Module/StoriesModule.php27
-rw-r--r--app/Module/SubmitterListModule.php13
-rw-r--r--app/Module/ThemeSelectModule.php5
-rw-r--r--app/Module/TimelineChartModule.php29
-rw-r--r--app/Module/UserFavoritesModule.php17
-rw-r--r--app/Module/UserJournalModule.php12
-rw-r--r--app/Module/UserMessagesModule.php13
-rw-r--r--app/Report/ReportParserBase.php1
-rw-r--r--app/Services/CaptchaService.php10
-rw-r--r--app/Services/EmailService.php3
-rw-r--r--app/Services/HomePageService.php10
-rw-r--r--app/Services/MediaFileService.php5
-rw-r--r--app/Services/UserService.php9
-rw-r--r--app/Session.php2
-rw-r--r--app/SessionDatabaseHandler.php2
-rw-r--r--app/Statistics/Repository/IndividualRepository.php11
-rw-r--r--app/Statistics/Repository/ServerRepository.php1
-rw-r--r--app/Tree.php28
-rw-r--r--app/TreeUser.php4
-rw-r--r--app/User.php4
-rw-r--r--app/Validator.php191
290 files changed, 1358 insertions, 1915 deletions
diff --git a/app/Auth.php b/app/Auth.php
index b3bee2ed54..811d1fd2d9 100644
--- a/app/Auth.php
+++ b/app/Auth.php
@@ -170,7 +170,10 @@ class Auth
*/
public static function user(): UserInterface
{
- return app(UserService::class)->find(self::id()) ?? new GuestUser();
+ $user_service = app(UserService::class);
+ assert($user_service instanceof UserService);
+
+ return $user_service->find(self::id()) ?? new GuestUser();
}
/**
diff --git a/app/Census/CensusColumnRelationToHead.php b/app/Census/CensusColumnRelationToHead.php
index f4ff089918..9b2af642c8 100644
--- a/app/Census/CensusColumnRelationToHead.php
+++ b/app/Census/CensusColumnRelationToHead.php
@@ -22,6 +22,9 @@ namespace Fisharebest\Webtrees\Census;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Services\RelationshipService;
+use function app;
+use function assert;
+
/**
* Relationship to head of household.
*/
@@ -43,6 +46,9 @@ class CensusColumnRelationToHead extends AbstractCensusColumn implements CensusC
return static::HEAD_OF_HOUSEHOLD;
}
- return app(RelationshipService::class)->getCloseRelationshipName($head, $individual);
+ $relationship_service = app(RelationshipService::class);
+ assert($relationship_service instanceof RelationshipService);
+
+ return $relationship_service->getCloseRelationshipName($head, $individual);
}
}
diff --git a/app/CommonMark/CensusTableExtension.php b/app/CommonMark/CensusTableExtension.php
index b00b24c6bf..9feea43100 100644
--- a/app/CommonMark/CensusTableExtension.php
+++ b/app/CommonMark/CensusTableExtension.php
@@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\CommonMark;
use League\CommonMark\Environment\EnvironmentBuilderInterface;
use League\CommonMark\Extension\ConfigurableExtensionInterface;
-use League\CommonMark\Extension\Table\TableExtension;
use League\Config\ConfigurationBuilderInterface;
/**
diff --git a/app/CommonMark/XrefNode.php b/app/CommonMark/XrefNode.php
index 76b3d20742..968cedf2d9 100644
--- a/app/CommonMark/XrefNode.php
+++ b/app/CommonMark/XrefNode.php
@@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\CommonMark;
use Fisharebest\Webtrees\GedcomRecord;
use League\CommonMark\Node\Node;
-use League\CommonMark\Renderer\NodeRendererInterface;
/**
* Convert XREFs within markdown text to links
diff --git a/app/Elements/AbstractEventElement.php b/app/Elements/AbstractEventElement.php
index 7af4ba76be..23c5bbb55d 100644
--- a/app/Elements/AbstractEventElement.php
+++ b/app/Elements/AbstractEventElement.php
@@ -23,7 +23,6 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Tree;
use function e;
-use function nl2br;
/**
* Events which can take "Y" to indicate that they occurred, but date/place are unknown.
diff --git a/app/Elements/Census.php b/app/Elements/Census.php
index 8eba75c711..c893a36b5a 100644
--- a/app/Elements/Census.php
+++ b/app/Elements/Census.php
@@ -26,8 +26,12 @@ use Fisharebest\Webtrees\Module\CensusAssistantModule;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
+use function app;
+use function assert;
+
/**
* Census
*/
@@ -62,9 +66,15 @@ class Census extends AbstractElement
'census_places' => Censuses::censusPlaces(I18N::languageTag()),
]);
- $xref = app(ServerRequestInterface::class)->getAttribute('xref', '');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
+
+ $module_service = app(ModuleService::class);
+ assert($module_service instanceof ModuleService);
- $census_assistant = app(ModuleService::class)->findByInterface(CensusAssistantModule::class)->first();
+ $census_assistant = $module_service->findByInterface(CensusAssistantModule::class)->first();
$record = Registry::individualFactory()->make($xref, $tree);
if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) {
diff --git a/app/Elements/DateValue.php b/app/Elements/DateValue.php
index 0cc42655c7..1c63659e5c 100644
--- a/app/Elements/DateValue.php
+++ b/app/Elements/DateValue.php
@@ -57,7 +57,10 @@ class DateValue extends AbstractElement
public function edit(string $id, string $name, string $value, Tree $tree): string
{
// Need to know if the user prefers DMY/MDY/YMD so we can validate dates properly.
- $dmy = app(LocalizationService::class)->dateFormatToOrder(I18N::dateFormat());
+ $localization_service = app(LocalizationService::class);
+ assert($localization_service instanceof LocalizationService);
+
+ $dmy = $localization_service->dateFormatToOrder(I18N::dateFormat());
return
'<div class="input-group">' .
diff --git a/app/Encodings/UTF16BE.php b/app/Encodings/UTF16BE.php
index 85c0cc92aa..81ba901b29 100644
--- a/app/Encodings/UTF16BE.php
+++ b/app/Encodings/UTF16BE.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Encodings;
use function chr;
use function intdiv;
use function ord;
-use function str_split;
/**
* Convert between UTF-16BE and UTF-8.
diff --git a/app/Encodings/UTF16LE.php b/app/Encodings/UTF16LE.php
index afed6b0bd4..c96ef93416 100644
--- a/app/Encodings/UTF16LE.php
+++ b/app/Encodings/UTF16LE.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Encodings;
use function chr;
use function intdiv;
use function ord;
-use function str_split;
/**
* Convert between UTF-16LE and UTF-8.
diff --git a/app/Encodings/UTF8.php b/app/Encodings/UTF8.php
index e1de438392..bed21d15c3 100644
--- a/app/Encodings/UTF8.php
+++ b/app/Encodings/UTF8.php
@@ -23,7 +23,6 @@ use InvalidArgumentException;
use function chr;
use function mb_substitute_character;
-use function preg_replace;
/**
* Convert between (potentially invalid) UTF-8 and UTF-8.
diff --git a/app/Exceptions/InvalidGedcomEncodingException.php b/app/Exceptions/InvalidGedcomEncodingException.php
index 8205f0c1c5..e69490a86b 100644
--- a/app/Exceptions/InvalidGedcomEncodingException.php
+++ b/app/Exceptions/InvalidGedcomEncodingException.php
@@ -19,7 +19,6 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Exceptions;
-use DomainException;
use Exception;
use Fisharebest\Webtrees\I18N;
diff --git a/app/Factories/ElementFactory.php b/app/Factories/ElementFactory.php
index 0bd768b16a..578dbd8a01 100644
--- a/app/Factories/ElementFactory.php
+++ b/app/Factories/ElementFactory.php
@@ -63,7 +63,6 @@ use Fisharebest\Webtrees\Elements\CountOfChildren;
use Fisharebest\Webtrees\Elements\CountOfMarriages;
use Fisharebest\Webtrees\Elements\Cremation;
use Fisharebest\Webtrees\Elements\CustomElement;
-use Fisharebest\Webtrees\Elements\CustomEvent;
use Fisharebest\Webtrees\Elements\CustomFact;
use Fisharebest\Webtrees\Elements\CustomFamilyEvent;
use Fisharebest\Webtrees\Elements\CustomIndividualEvent;
diff --git a/app/GedcomRecord.php b/app/GedcomRecord.php
index 25f7cb13b6..a392dc779f 100644
--- a/app/GedcomRecord.php
+++ b/app/GedcomRecord.php
@@ -1000,7 +1000,10 @@ class GedcomRecord
$this->pending = $new_gedcom;
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
- app(PendingChangesService::class)->acceptRecord($this);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($this);
$this->gedcom = $new_gedcom;
$this->pending = null;
}
@@ -1048,7 +1051,10 @@ class GedcomRecord
// Accept this pending change
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
- app(PendingChangesService::class)->acceptRecord($this);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($this);
$this->gedcom = $gedcom;
$this->pending = null;
}
@@ -1078,7 +1084,10 @@ class GedcomRecord
// Auto-accept this pending change
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
- app(PendingChangesService::class)->acceptRecord($this);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($this);
}
Log::addEditLog('Delete: ' . static::RECORD_TYPE . ' ' . $this->xref, $this->tree);
diff --git a/app/Helpers/functions.php b/app/Helpers/functions.php
index 4b8989a67b..c97bc28fa3 100644
--- a/app/Helpers/functions.php
+++ b/app/Helpers/functions.php
@@ -21,6 +21,7 @@ use Aura\Router\RouterContainer;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Html;
use Fisharebest\Webtrees\Session as WebtreesSession;
+use Fisharebest\Webtrees\Validator;
use Fisharebest\Webtrees\View as WebtreesView;
use Fisharebest\Webtrees\Webtrees;
use Psr\Http\Message\ResponseFactoryInterface;
@@ -62,7 +63,10 @@ function asset(string $path): string
$version = '?v=' . filemtime(Webtrees::ROOT_DIR . 'public/' . $path);
}
- $base_url = app(ServerRequestInterface::class)->getAttribute('base_url');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $base_url = Validator::attributes($request)->string('base_url');
return $base_url . '/public/' . $path . $version;
}
@@ -160,8 +164,10 @@ function response($content = '', int $code = StatusCodeInterface::STATUS_OK, arr
*/
function route(string $route_name, array $parameters = []): string
{
- $request = app(ServerRequestInterface::class);
- $base_url = $request->getAttribute('base_url');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $base_url = Validator::attributes($request)->string('base_url');
$router_container = app(RouterContainer::class);
$route = $router_container->getMap()->getRoute($route_name);
@@ -173,7 +179,7 @@ function route(string $route_name, array $parameters = []): string
return !str_contains($route->path, '{' . $key . '}') && !str_contains($route->path, '{/' . $key . '}');
}, ARRAY_FILTER_USE_KEY);
- if ($request->getAttribute('rewrite_urls') === '1') {
+ if (Validator::attributes($request)->boolean('rewrite_urls', false)) {
// Make the pretty URL absolute.
$base_path = parse_url($base_url, PHP_URL_PATH) ?? '';
$url = $base_url . substr($url, strlen($base_path));
diff --git a/app/Http/Middleware/AuthAdministrator.php b/app/Http/Middleware/AuthAdministrator.php
index 0a3596985c..a60ddd6b69 100644
--- a/app/Http/Middleware/AuthAdministrator.php
+++ b/app/Http/Middleware/AuthAdministrator.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
@@ -45,7 +46,7 @@ class AuthAdministrator implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
// Logged in with the correct role?
if (Auth::isAdmin($user)) {
diff --git a/app/Http/Middleware/AuthEditor.php b/app/Http/Middleware/AuthEditor.php
index 4d34840df1..3c4555e324 100644
--- a/app/Http/Middleware/AuthEditor.php
+++ b/app/Http/Middleware/AuthEditor.php
@@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -47,10 +46,8 @@ class AuthEditor implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
// Logged in with the correct role?
if (Auth::isEditor($tree, $user)) {
diff --git a/app/Http/Middleware/AuthLoggedIn.php b/app/Http/Middleware/AuthLoggedIn.php
index ef5e12c0d7..7805e77255 100644
--- a/app/Http/Middleware/AuthLoggedIn.php
+++ b/app/Http/Middleware/AuthLoggedIn.php
@@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\Middleware;
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
@@ -42,8 +43,8 @@ class AuthLoggedIn implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
// Logged in?
if ($user instanceof User) {
diff --git a/app/Http/Middleware/AuthManager.php b/app/Http/Middleware/AuthManager.php
index 4c75dc20cb..3f2ca4e346 100644
--- a/app/Http/Middleware/AuthManager.php
+++ b/app/Http/Middleware/AuthManager.php
@@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -47,10 +46,8 @@ class AuthManager implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
// Logged in with the correct role?
if (Auth::isManager($tree, $user)) {
diff --git a/app/Http/Middleware/AuthMember.php b/app/Http/Middleware/AuthMember.php
index 258a93be90..a5f1f083a2 100644
--- a/app/Http/Middleware/AuthMember.php
+++ b/app/Http/Middleware/AuthMember.php
@@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -47,10 +46,8 @@ class AuthMember implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
// Logged in with the correct role?
if (Auth::isMember($tree, $user)) {
diff --git a/app/Http/Middleware/AuthModerator.php b/app/Http/Middleware/AuthModerator.php
index 4e3e1d18ac..574e2b1939 100644
--- a/app/Http/Middleware/AuthModerator.php
+++ b/app/Http/Middleware/AuthModerator.php
@@ -23,14 +23,13 @@ use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -47,10 +46,8 @@ class AuthModerator implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
// Logged in with the correct role?
if (Auth::isModerator($tree, $user)) {
diff --git a/app/Http/Middleware/BadBotBlocker.php b/app/Http/Middleware/BadBotBlocker.php
index 610a39fcd0..30dc317c43 100644
--- a/app/Http/Middleware/BadBotBlocker.php
+++ b/app/Http/Middleware/BadBotBlocker.php
@@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\Middleware;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Registry;
+use Fisharebest\Webtrees\Validator;
use Iodev\Whois\Loaders\CurlLoader;
use Iodev\Whois\Modules\Asn\AsnRouteInfo;
use Iodev\Whois\Whois;
@@ -165,8 +166,8 @@ class BadBotBlocker implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $ua = $request->getServerParams()['HTTP_USER_AGENT'] ?? '';
- $ip = $request->getAttribute('client-ip');
+ $ua = Validator::serverParams($request)->string('HTTP_USER_AGENT', '');
+ $ip = Validator::attributes($request)->string('client-ip');
$address = IPFactory::parseAddressString($ip);
assert($address instanceof AddressInterface);
@@ -217,7 +218,9 @@ class BadBotBlocker implements MiddlewareInterface
}
// Allow sites to block access from entire networks.
- preg_match_all('/(AS\d+)/', $request->getAttribute('block_asn', ''), $matches);
+ $block_asn = Validator::attributes($request)->string('block_asn', '');
+ preg_match_all('/(AS\d+)/', $block_asn, $matches);
+
foreach ($matches[1] as $asn) {
foreach ($this->fetchIpRangesForAsn($asn) as $range) {
if ($range->contains($address)) {
diff --git a/app/Http/Middleware/BaseUrl.php b/app/Http/Middleware/BaseUrl.php
index 627548ddac..8a40459326 100644
--- a/app/Http/Middleware/BaseUrl.php
+++ b/app/Http/Middleware/BaseUrl.php
@@ -19,6 +19,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\Middleware;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
@@ -50,7 +51,7 @@ class BaseUrl implements MiddlewareInterface
$request_url = $request->getUri();
// The base URL, as specified in the configuration file.
- $base_url = $request->getAttribute('base_url', '');
+ $base_url = Validator::attributes($request)->string('base_url');
if ($base_url === '') {
// Guess the base URL from the request URL.
diff --git a/app/Http/Middleware/CheckCsrf.php b/app/Http/Middleware/CheckCsrf.php
index ba87018579..940748dc04 100644
--- a/app/Http/Middleware/CheckCsrf.php
+++ b/app/Http/Middleware/CheckCsrf.php
@@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Http\RequestHandlers\SelectLanguage;
use Fisharebest\Webtrees\Http\RequestHandlers\SelectTheme;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Session;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
@@ -53,7 +54,7 @@ class CheckCsrf implements MiddlewareInterface
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $route = $request->getAttribute('route');
+ $route = Validator::attributes($request)->route();
if (!in_array($route->name, self::EXCLUDE_ROUTES, true)) {
$params = (array) $request->getParsedBody();
diff --git a/app/Http/Middleware/HandleExceptions.php b/app/Http/Middleware/HandleExceptions.php
index 8485411434..5a9370c674 100644
--- a/app/Http/Middleware/HandleExceptions.php
+++ b/app/Http/Middleware/HandleExceptions.php
@@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Log;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Site;
+use Fisharebest\Webtrees\Validator;
use League\Flysystem\FilesystemException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -151,10 +152,9 @@ class HandleExceptions implements MiddlewareInterface, StatusCodeInterface
*/
private function httpExceptionResponse(ServerRequestInterface $request, HttpException $exception): ResponseInterface
{
- $tree = $request->getAttribute('tree');
-
+ $tree = Validator::attributes($request)->treeOptional();
$default = Site::getPreference('DEFAULT_GEDCOM');
- $tree = $tree ?? $this->tree_service->all()[$default] ?? $this->tree_service->all()->first();
+ $tree ??= $this->tree_service->all()[$default] ?? $this->tree_service->all()->first();
$status_code = $exception->getCode();
@@ -183,7 +183,7 @@ class HandleExceptions implements MiddlewareInterface, StatusCodeInterface
*/
private function thirdPartyExceptionResponse(ServerRequestInterface $request, Throwable $exception): ResponseInterface
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$default = Site::getPreference('DEFAULT_GEDCOM');
$tree = $tree ?? $this->tree_service->all()[$default] ?? $this->tree_service->all()->first();
@@ -242,7 +242,7 @@ class HandleExceptions implements MiddlewareInterface, StatusCodeInterface
'title' => 'Error',
'error' => $trace,
'request' => $request,
- 'tree' => $request->getAttribute('tree'),
+ 'tree' => Validator::attributes($request)->treeOptional(),
], StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR);
} catch (Throwable $ignore) {
// Try with a minimal header/menu
diff --git a/app/Http/Middleware/LoadRoutes.php b/app/Http/Middleware/LoadRoutes.php
index 71c54eb789..d2f85c429f 100644
--- a/app/Http/Middleware/LoadRoutes.php
+++ b/app/Http/Middleware/LoadRoutes.php
@@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\Middleware;
use Aura\Router\RouterContainer;
use Fisharebest\Webtrees\Http\Routes\ApiRoutes;
use Fisharebest\Webtrees\Http\Routes\WebRoutes;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
@@ -59,7 +60,7 @@ class LoadRoutes implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
$base_path = parse_url($base_url, PHP_URL_PATH);
$router_container = new RouterContainer($base_path);
diff --git a/app/Http/Middleware/RequestHandler.php b/app/Http/Middleware/RequestHandler.php
index c4c698a3e9..6f12149170 100644
--- a/app/Http/Middleware/RequestHandler.php
+++ b/app/Http/Middleware/RequestHandler.php
@@ -20,6 +20,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\Middleware;
use Aura\Router\Route;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Container\Container;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -41,8 +42,7 @@ class RequestHandler implements MiddlewareInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- /** @var Route $route */
- $route = $request->getAttribute('route');
+ $route = Validator::attributes($request)->route();
$request_handler = $route->handler;
diff --git a/app/Http/Middleware/Router.php b/app/Http/Middleware/Router.php
index ee4dd5e11d..b3a58e2449 100644
--- a/app/Http/Middleware/Router.php
+++ b/app/Http/Middleware/Router.php
@@ -26,6 +26,7 @@ use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Fisharebest\Webtrees\Webtrees;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -75,7 +76,7 @@ class Router implements MiddlewareInterface
// Turn the ugly URL into a pretty one, so the router can parse it.
$pretty = $request;
- if ($request->getAttribute('rewrite_urls') !== '1') {
+ if (!Validator::attributes($request)->boolean('rewrite_urls', false)) {
// Ugly URLs store the path in a query parameter.
$url_route = $request->getQueryParams()['route'] ?? '';
$uri = $request->getUri()->withPath($url_route);
diff --git a/app/Http/Middleware/UseDatabase.php b/app/Http/Middleware/UseDatabase.php
index bb2580f51c..9ccc1235b8 100644
--- a/app/Http/Middleware/UseDatabase.php
+++ b/app/Http/Middleware/UseDatabase.php
@@ -19,6 +19,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\Middleware;
+use Fisharebest\Webtrees\Validator;
use Fisharebest\Webtrees\Webtrees;
use Illuminate\Database\Capsule\Manager as DB;
use PDO;
@@ -43,9 +44,9 @@ class UseDatabase implements MiddlewareInterface
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// Earlier versions of webtrees did not have a dbtype config option. They always used mysql.
- $driver = $request->getAttribute('dbtype', 'mysql');
+ $driver = Validator::attributes($request)->string('dbtype', 'mysql');
- $dbname = $request->getAttribute('dbname');
+ $dbname = Validator::attributes($request)->string('dbname');
if ($driver === 'sqlite') {
$dbname = Webtrees::ROOT_DIR . 'data/' . $dbname . '.sqlite';
@@ -54,7 +55,7 @@ class UseDatabase implements MiddlewareInterface
$capsule = new DB();
// Newer versions of webtrees support utf8mb4. Older ones only support 3-byte utf8
- if ($driver === 'mysql' && $request->getAttribute('mysql_utf8mb4') === '1') {
+ if ($driver === 'mysql' && Validator::attributes($request)->boolean('mysql_utf8mb4', false)) {
$charset = 'utf8mb4';
$collation = 'utf8mb4_unicode_ci';
} else {
@@ -67,10 +68,10 @@ class UseDatabase implements MiddlewareInterface
PDO::ATTR_STRINGIFY_FETCHES => true,
];
- $dbkey = (string) $request->getAttribute('dbkey');
- $dbcert = (string) $request->getAttribute('dbcert');
- $dbca = (string) $request->getAttribute('dbca');
- $dbverify = (bool) $request->getAttribute('dbverify');
+ $dbkey = Validator::attributes($request)->string('dbkey', '');
+ $dbcert = Validator::attributes($request)->string('dbcert', '');
+ $dbca = Validator::attributes($request)->string('dbca', '');
+ $dbverify = Validator::attributes($request)->boolean('dbverify', false);
// MySQL/MariaDB support encrypted connections
if ($dbkey !== '' && $dbcert !== '' && $dbca !== '') {
@@ -82,12 +83,12 @@ class UseDatabase implements MiddlewareInterface
$capsule->addConnection([
'driver' => $driver,
- 'host' => $request->getAttribute('dbhost'),
- 'port' => $request->getAttribute('dbport'),
+ 'host' => Validator::attributes($request)->string('dbhost'),
+ 'port' => Validator::attributes($request)->string('dbport'),
'database' => $dbname,
- 'username' => $request->getAttribute('dbuser'),
- 'password' => $request->getAttribute('dbpass'),
- 'prefix' => $request->getAttribute('tblpfx'),
+ 'username' => Validator::attributes($request)->string('dbuser'),
+ 'password' => Validator::attributes($request)->string('dbpass'),
+ 'prefix' => Validator::attributes($request)->string('tblpfx'),
'prefix_indexes' => true,
'options' => $options,
// For MySQL
diff --git a/app/Http/RequestHandlers/AbstractTomSelectHandler.php b/app/Http/RequestHandlers/AbstractTomSelectHandler.php
index 7411ef7e54..e37cfbd25f 100644
--- a/app/Http/RequestHandlers/AbstractTomSelectHandler.php
+++ b/app/Http/RequestHandlers/AbstractTomSelectHandler.php
@@ -26,9 +26,7 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
-use function strlen;
/**
* Autocomplete for TomSelect based controls.
@@ -45,12 +43,11 @@ abstract class AbstractTomSelectHandler implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
- $at = Validator::queryParams($request)->requiredString('at');
- $page = Validator::queryParams($request)->integer('page') ?? 1;
- $query = Validator::queryParams($request)->requiredString('query');
+ $at = Validator::queryParams($request)->string('at');
+ $page = Validator::queryParams($request)->optionalInteger('page') ?? 1;
+ $query = Validator::queryParams($request)->string('query');
// Fetch one more row than we need, so we can know if more rows exist.
$offset = ($page - 1) * self::RESULTS_PER_PAGE;
diff --git a/app/Http/RequestHandlers/AccountDelete.php b/app/Http/RequestHandlers/AccountDelete.php
index b0b906db35..1fe1012abc 100644
--- a/app/Http/RequestHandlers/AccountDelete.php
+++ b/app/Http/RequestHandlers/AccountDelete.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -55,8 +56,8 @@ class AccountDelete implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
// An administrator can only be deleted by another administrator
if ($user instanceof User && $user->getPreference(UserInterface::PREF_IS_ADMINISTRATOR) !== '1') {
diff --git a/app/Http/RequestHandlers/AccountEdit.php b/app/Http/RequestHandlers/AccountEdit.php
index ae14453eaf..88122d06ee 100644
--- a/app/Http/RequestHandlers/AccountEdit.php
+++ b/app/Http/RequestHandlers/AccountEdit.php
@@ -29,7 +29,7 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MessageService;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Tree;
-use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -66,10 +66,8 @@ class AccountEdit implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
-
- $user = $request->getAttribute('user');
- assert($user instanceof User);
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
if ($tree instanceof Tree) {
$my_individual_record = Registry::individualFactory()->make($tree->getUserPreference(Auth::user(), UserInterface::PREF_TREE_ACCOUNT_XREF), $tree);
diff --git a/app/Http/RequestHandlers/AccountUpdate.php b/app/Http/RequestHandlers/AccountUpdate.php
index 19f6f0dae3..14abcf100b 100644
--- a/app/Http/RequestHandlers/AccountUpdate.php
+++ b/app/Http/RequestHandlers/AccountUpdate.php
@@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Session;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -57,9 +58,9 @@ class AccountUpdate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
- $user = $request->getAttribute('user');
assert($user instanceof User);
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/AddChildToFamilyAction.php b/app/Http/RequestHandlers/AddChildToFamilyAction.php
index 232df36526..1798c39960 100644
--- a/app/Http/RequestHandlers/AddChildToFamilyAction.php
+++ b/app/Http/RequestHandlers/AddChildToFamilyAction.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -56,17 +55,11 @@ class AddChildToFamilyAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$params = (array) $request->getParsedBody();
-
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
-
$levels = $params['ilevels'] ?? [];
$tags = $params['itags'] ?? [];
$values = $params['ivalues'] ?? [];
@@ -78,8 +71,8 @@ class AddChildToFamilyAction implements RequestHandlerInterface
// Link the child to the family
$family->createFact('1 CHIL @' . $child->xref() . '@', false);
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $child->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $child->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/AddChildToFamilyPage.php b/app/Http/RequestHandlers/AddChildToFamilyPage.php
index 4715aa6623..2292eabb77 100644
--- a/app/Http/RequestHandlers/AddChildToFamilyPage.php
+++ b/app/Http/RequestHandlers/AddChildToFamilyPage.php
@@ -20,13 +20,12 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
use Fisharebest\Webtrees\SurnameTradition;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -61,15 +60,9 @@ class AddChildToFamilyPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $sex = $request->getAttribute('sex');
- assert(is_string($sex));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $sex = Validator::attributes($request)->string('sex');
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
diff --git a/app/Http/RequestHandlers/AddChildToIndividualAction.php b/app/Http/RequestHandlers/AddChildToIndividualAction.php
index 70aa01557d..98ec77636d 100644
--- a/app/Http/RequestHandlers/AddChildToIndividualAction.php
+++ b/app/Http/RequestHandlers/AddChildToIndividualAction.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -56,14 +55,9 @@ class AddChildToIndividualAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $params = (array) $request->getParsedBody();
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $params = (array) $request->getParsedBody();
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
@@ -86,8 +80,8 @@ class AddChildToIndividualAction implements RequestHandlerInterface
// Link the child to the family
$child->createFact('1 FAMC @' . $family->xref() . '@', false);
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $child->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $child->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/AddChildToIndividualPage.php b/app/Http/RequestHandlers/AddChildToIndividualPage.php
index c10635e636..3669fc1d3d 100644
--- a/app/Http/RequestHandlers/AddChildToIndividualPage.php
+++ b/app/Http/RequestHandlers/AddChildToIndividualPage.php
@@ -20,20 +20,16 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
use Fisharebest\Webtrees\SurnameTradition;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function array_map;
-use function assert;
-use function is_string;
use function route;
/**
@@ -62,12 +58,8 @@ class AddChildToIndividualPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/AddMediaFileAction.php b/app/Http/RequestHandlers/AddMediaFileAction.php
index 249167ce59..31745241a1 100644
--- a/app/Http/RequestHandlers/AddMediaFileAction.php
+++ b/app/Http/RequestHandlers/AddMediaFileAction.php
@@ -25,13 +25,11 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MediaFileService;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -64,15 +62,10 @@ class AddMediaFileAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $media = Registry::mediaFactory()->make($xref, $tree);
- $media = Auth::checkMediaAccess($media, true);
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $media = Registry::mediaFactory()->make($xref, $tree);
+ $media = Auth::checkMediaAccess($media, true);
$params = (array) $request->getParsedBody();
$title = $params['title'] ?? '';
$type = $params['type'] ?? '';
diff --git a/app/Http/RequestHandlers/AddMediaFileModal.php b/app/Http/RequestHandlers/AddMediaFileModal.php
index 65ebea621e..326b8b9de4 100644
--- a/app/Http/RequestHandlers/AddMediaFileModal.php
+++ b/app/Http/RequestHandlers/AddMediaFileModal.php
@@ -25,7 +25,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MediaFileService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -61,11 +61,8 @@ class AddMediaFileModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$data_filesystem = Registry::filesystem()->data();
diff --git a/app/Http/RequestHandlers/AddNewFact.php b/app/Http/RequestHandlers/AddNewFact.php
index 80fada3c0b..0da760c588 100644
--- a/app/Http/RequestHandlers/AddNewFact.php
+++ b/app/Http/RequestHandlers/AddNewFact.php
@@ -25,12 +25,11 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
use function trim;
@@ -60,11 +59,9 @@ class AddNewFact implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = (string) $request->getAttribute('xref');
- $subtag = (string) $request->getAttribute('fact');
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $subtag = Validator::attributes($request)->isTag()->string('fact');
if ($subtag === 'OBJE' && !Auth::canUploadMedia($tree, Auth::user())) {
throw new HttpAccessDeniedException();
diff --git a/app/Http/RequestHandlers/AddParentToIndividualAction.php b/app/Http/RequestHandlers/AddParentToIndividualAction.php
index 9ea0f0dd5c..ace8bebed4 100644
--- a/app/Http/RequestHandlers/AddParentToIndividualAction.php
+++ b/app/Http/RequestHandlers/AddParentToIndividualAction.php
@@ -22,14 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -56,14 +53,9 @@ class AddParentToIndividualAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $params = (array) $request->getParsedBody();
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $params = (array) $request->getParsedBody();
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
@@ -86,8 +78,8 @@ class AddParentToIndividualAction implements RequestHandlerInterface
// Link the parent to the family
$parent->createFact('1 FAMS @' . $family->xref() . '@', false);
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $parent->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $parent->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/AddParentToIndividualPage.php b/app/Http/RequestHandlers/AddParentToIndividualPage.php
index 8e4d6e8bb2..fbdc628b29 100644
--- a/app/Http/RequestHandlers/AddParentToIndividualPage.php
+++ b/app/Http/RequestHandlers/AddParentToIndividualPage.php
@@ -20,20 +20,16 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
use Fisharebest\Webtrees\SurnameTradition;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function array_map;
-use function assert;
-use function is_string;
use function route;
/**
@@ -62,15 +58,9 @@ class AddParentToIndividualPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $sex = $request->getAttribute('sex');
- assert(is_string($sex));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $sex = Validator::attributes($request)->string('sex');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/AddSpouseToFamilyAction.php b/app/Http/RequestHandlers/AddSpouseToFamilyAction.php
index f4d9a007c9..b33c8d781c 100644
--- a/app/Http/RequestHandlers/AddSpouseToFamilyAction.php
+++ b/app/Http/RequestHandlers/AddSpouseToFamilyAction.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -56,14 +55,9 @@ class AddSpouseToFamilyAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$params = (array) $request->getParsedBody();
-
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
@@ -95,8 +89,8 @@ class AddSpouseToFamilyAction implements RequestHandlerInterface
// Link the spouse to the family
$family->createFact('1 ' . $link . ' @' . $spouse->xref() . '@', false);
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $spouse->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $spouse->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/AddSpouseToFamilyPage.php b/app/Http/RequestHandlers/AddSpouseToFamilyPage.php
index f1ba17b0ad..8e8a1ced7f 100644
--- a/app/Http/RequestHandlers/AddSpouseToFamilyPage.php
+++ b/app/Http/RequestHandlers/AddSpouseToFamilyPage.php
@@ -20,19 +20,17 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
use Fisharebest\Webtrees\SurnameTradition;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function array_map;
use function assert;
use function is_string;
use function route;
@@ -63,15 +61,9 @@ class AddSpouseToFamilyPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $sex = $request->getAttribute('sex');
- assert(is_string($sex));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $sex = Validator::attributes($request)->string('sex');
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
diff --git a/app/Http/RequestHandlers/AddSpouseToIndividualAction.php b/app/Http/RequestHandlers/AddSpouseToIndividualAction.php
index edadd01aa1..12b4a283cf 100644
--- a/app/Http/RequestHandlers/AddSpouseToIndividualAction.php
+++ b/app/Http/RequestHandlers/AddSpouseToIndividualAction.php
@@ -22,14 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -56,14 +53,9 @@ class AddSpouseToIndividualAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $params = (array) $request->getParsedBody();
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $params = (array) $request->getParsedBody();
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
@@ -89,8 +81,8 @@ class AddSpouseToIndividualAction implements RequestHandlerInterface
// Link the spouse to the family
$spouse->createFact('1 FAMS @' . $family->xref() . '@', false);
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $spouse->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $spouse->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/AddSpouseToIndividualPage.php b/app/Http/RequestHandlers/AddSpouseToIndividualPage.php
index e822aa482b..98ec966a94 100644
--- a/app/Http/RequestHandlers/AddSpouseToIndividualPage.php
+++ b/app/Http/RequestHandlers/AddSpouseToIndividualPage.php
@@ -20,20 +20,16 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
use Fisharebest\Webtrees\SurnameTradition;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function array_map;
-use function assert;
-use function is_string;
use function route;
/**
@@ -70,12 +66,8 @@ class AddSpouseToIndividualPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/AddUnlinkedAction.php b/app/Http/RequestHandlers/AddUnlinkedAction.php
index 3212480b23..cb34f21298 100644
--- a/app/Http/RequestHandlers/AddUnlinkedAction.php
+++ b/app/Http/RequestHandlers/AddUnlinkedAction.php
@@ -20,13 +20,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
/**
@@ -53,8 +51,7 @@ class AddUnlinkedAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
@@ -66,8 +63,8 @@ class AddUnlinkedAction implements RequestHandlerInterface
$individual = $tree->createIndividual("0 @@ INDI\n" . $gedcom);
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $individual->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $individual->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/AddUnlinkedPage.php b/app/Http/RequestHandlers/AddUnlinkedPage.php
index 3ec2059827..bd02d6d5b5 100644
--- a/app/Http/RequestHandlers/AddUnlinkedPage.php
+++ b/app/Http/RequestHandlers/AddUnlinkedPage.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -57,9 +56,7 @@ class AddUnlinkedPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$sex = Registry::elementFactory()->make('INDI:SEX')->default($tree);
$name = Registry::elementFactory()->make('INDI:NAME')->default($tree);
diff --git a/app/Http/RequestHandlers/AdminMediaFileDownload.php b/app/Http/RequestHandlers/AdminMediaFileDownload.php
index ca67824d81..3f81c22d61 100644
--- a/app/Http/RequestHandlers/AdminMediaFileDownload.php
+++ b/app/Http/RequestHandlers/AdminMediaFileDownload.php
@@ -20,6 +20,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Registry;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -39,8 +40,7 @@ class AdminMediaFileDownload implements RequestHandlerInterface
public function handle(ServerRequestInterface $request): ResponseInterface
{
$filesystem = Registry::filesystem()->data();
- $params = $request->getQueryParams();
- $path = $params['path'] ?? '';
+ $path = Validator::queryParams($request)->string('path');
return Registry::imageFactory()->fileResponse($filesystem, $path, false);
}
diff --git a/app/Http/RequestHandlers/AutoCompleteCitation.php b/app/Http/RequestHandlers/AutoCompleteCitation.php
index e0b076b05e..8c2a2969f3 100644
--- a/app/Http/RequestHandlers/AutoCompleteCitation.php
+++ b/app/Http/RequestHandlers/AutoCompleteCitation.php
@@ -22,13 +22,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\JoinClause;
use Illuminate\Support\Collection;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function preg_match_all;
use function preg_quote;
@@ -39,9 +38,7 @@ class AutoCompleteCitation extends AbstractAutocompleteHandler
{
protected function search(ServerRequestInterface $request): Collection
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$query = $request->getQueryParams()['query'] ?? '';
$xref = $request->getQueryParams()['extra'] ?? '';
$source = Registry::sourceFactory()->make($xref, $tree);
diff --git a/app/Http/RequestHandlers/AutoCompleteFolder.php b/app/Http/RequestHandlers/AutoCompleteFolder.php
index 8b10b33626..14c43df247 100644
--- a/app/Http/RequestHandlers/AutoCompleteFolder.php
+++ b/app/Http/RequestHandlers/AutoCompleteFolder.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Services\MediaFileService;
use Fisharebest\Webtrees\Services\SearchService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use League\Flysystem\FilesystemException;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Autocomplete handler for media folders
*/
@@ -49,8 +47,7 @@ class AutoCompleteFolder extends AbstractAutocompleteHandler
*/
protected function search(ServerRequestInterface $request): Collection
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$query = $request->getQueryParams()['query'] ?? '';
diff --git a/app/Http/RequestHandlers/AutoCompletePlace.php b/app/Http/RequestHandlers/AutoCompletePlace.php
index 0fe25ab498..68a9ee5a75 100644
--- a/app/Http/RequestHandlers/AutoCompletePlace.php
+++ b/app/Http/RequestHandlers/AutoCompletePlace.php
@@ -23,12 +23,10 @@ use Fisharebest\Webtrees\Module\ModuleMapAutocompleteInterface;
use Fisharebest\Webtrees\Place;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\SearchService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Autocomplete handler for places
*/
@@ -54,8 +52,7 @@ class AutoCompletePlace extends AbstractAutocompleteHandler
*/
protected function search(ServerRequestInterface $request): Collection
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$query = $request->getQueryParams()['query'] ?? '';
diff --git a/app/Http/RequestHandlers/AutoCompleteSurname.php b/app/Http/RequestHandlers/AutoCompleteSurname.php
index 2f3541b15b..bba63837bc 100644
--- a/app/Http/RequestHandlers/AutoCompleteSurname.php
+++ b/app/Http/RequestHandlers/AutoCompleteSurname.php
@@ -19,12 +19,10 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Autocomplete handler for surnames
*/
@@ -37,8 +35,7 @@ class AutoCompleteSurname extends AbstractAutocompleteHandler
*/
protected function search(ServerRequestInterface $request): Collection
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$query = $request->getQueryParams()['query'] ?? '';
diff --git a/app/Http/RequestHandlers/BroadcastAction.php b/app/Http/RequestHandlers/BroadcastAction.php
index fdffd1ab2c..8a5c09ed6c 100644
--- a/app/Http/RequestHandlers/BroadcastAction.php
+++ b/app/Http/RequestHandlers/BroadcastAction.php
@@ -23,6 +23,7 @@ use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\MessageService;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -57,13 +58,13 @@ class BroadcastAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
$body = $params['body'];
$subject = $params['subject'];
$to = $params['to'];
- $ip = $request->getAttribute('client-ip');
+ $ip = Validator::attributes($request)->string('client-ip');
$to_users = $this->message_service->recipientUsers($to);
if ($body === '' || $subject === '') {
diff --git a/app/Http/RequestHandlers/BroadcastPage.php b/app/Http/RequestHandlers/BroadcastPage.php
index b84467bdf4..9de46dae2c 100644
--- a/app/Http/RequestHandlers/BroadcastPage.php
+++ b/app/Http/RequestHandlers/BroadcastPage.php
@@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Services\MessageService;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -52,7 +53,7 @@ class BroadcastPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
$params = $request->getQueryParams();
$body = $params['body'] ?? '';
$subject = $params['subject'] ?? '';
diff --git a/app/Http/RequestHandlers/CalendarAction.php b/app/Http/RequestHandlers/CalendarAction.php
index 0b0d33f066..379055fbda 100644
--- a/app/Http/RequestHandlers/CalendarAction.php
+++ b/app/Http/RequestHandlers/CalendarAction.php
@@ -19,12 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -40,10 +39,8 @@ class CalendarAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $view = $request->getAttribute('view');
+ $tree = Validator::attributes($request)->tree();
+ $view = Validator::attributes($request)->string('view');
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/CalendarEvents.php b/app/Http/RequestHandlers/CalendarEvents.php
index 28661e8f9d..669f1ed33f 100644
--- a/app/Http/RequestHandlers/CalendarEvents.php
+++ b/app/Http/RequestHandlers/CalendarEvents.php
@@ -33,12 +33,12 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\CalendarService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function count;
use function e;
use function explode;
@@ -75,10 +75,8 @@ class CalendarEvents implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $view = $request->getAttribute('view');
+ $tree = Validator::attributes($request)->tree();
+ $view = Validator::attributes($request)->string('view');
$CALENDAR_FORMAT = $tree->getPreference('CALENDAR_FORMAT');
$cal = $request->getQueryParams()['cal'] ?? '';
diff --git a/app/Http/RequestHandlers/CalendarPage.php b/app/Http/RequestHandlers/CalendarPage.php
index 3b7c01f4bc..c845a551ed 100644
--- a/app/Http/RequestHandlers/CalendarPage.php
+++ b/app/Http/RequestHandlers/CalendarPage.php
@@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\CalendarService;
use Fisharebest\Webtrees\Services\LocalizationService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Show anniversaries for events in a given day/month/year.
*/
@@ -63,10 +61,9 @@ class CalendarPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
- $view = $request->getAttribute('view');
+ $view = Validator::attributes($request)->string('view');
$cal = $request->getQueryParams()['cal'] ?? '';
$day = $request->getQueryParams()['day'] ?? '';
$month = $request->getQueryParams()['month'] ?? '';
diff --git a/app/Http/RequestHandlers/ChangeFamilyMembersAction.php b/app/Http/RequestHandlers/ChangeFamilyMembersAction.php
index 68fac3ff62..0a6b334482 100644
--- a/app/Http/RequestHandlers/ChangeFamilyMembersAction.php
+++ b/app/Http/RequestHandlers/ChangeFamilyMembersAction.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function in_array;
use function redirect;
@@ -43,8 +42,7 @@ class ChangeFamilyMembersAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/ChangeFamilyMembersPage.php b/app/Http/RequestHandlers/ChangeFamilyMembersPage.php
index 0463c2d67e..c41eab84f4 100644
--- a/app/Http/RequestHandlers/ChangeFamilyMembersPage.php
+++ b/app/Http/RequestHandlers/ChangeFamilyMembersPage.php
@@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Change the members of a family.
*/
@@ -44,9 +42,7 @@ class ChangeFamilyMembersPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'];
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
diff --git a/app/Http/RequestHandlers/CheckTree.php b/app/Http/RequestHandlers/CheckTree.php
index ea5fa515f6..8ccb1a7766 100644
--- a/app/Http/RequestHandlers/CheckTree.php
+++ b/app/Http/RequestHandlers/CheckTree.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Header;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Psr\Http\Message\ResponseInterface;
@@ -31,7 +32,6 @@ use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function array_key_exists;
-use function assert;
use function e;
use function in_array;
use function preg_match;
@@ -57,8 +57,7 @@ class CheckTree implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
// We need to work with raw GEDCOM data, as we are looking for errors
// which may prevent the GedcomRecord objects from working.
diff --git a/app/Http/RequestHandlers/CleanDataFolder.php b/app/Http/RequestHandlers/CleanDataFolder.php
index 9e09f12e56..058c443313 100644
--- a/app/Http/RequestHandlers/CleanDataFolder.php
+++ b/app/Http/RequestHandlers/CleanDataFolder.php
@@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\TreeService;
+use Fisharebest\Webtrees\Validator;
use League\Flysystem\FilesystemException;
use League\Flysystem\FilesystemReader;
use League\Flysystem\StorageAttributes;
@@ -69,8 +70,8 @@ class CleanDataFolder implements RequestHandlerInterface
'config.ini.php',
];
- if ($request->getAttribute('dbtype') === 'sqlite') {
- $protected[] = $request->getAttribute('dbname') . '.sqlite';
+ if (Validator::attributes($request)->string('dbtype') === 'sqlite') {
+ $protected[] = Validator::attributes($request)->string('dbname') . '.sqlite';
}
// Protect the media folders
diff --git a/app/Http/RequestHandlers/ContactAction.php b/app/Http/RequestHandlers/ContactAction.php
index 2364751031..0460f4a551 100644
--- a/app/Http/RequestHandlers/ContactAction.php
+++ b/app/Http/RequestHandlers/ContactAction.php
@@ -30,13 +30,11 @@ use Fisharebest\Webtrees\Services\EmailService;
use Fisharebest\Webtrees\Services\MessageService;
use Fisharebest\Webtrees\Services\RateLimitService;
use Fisharebest\Webtrees\Services\UserService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function in_array;
use function preg_match;
@@ -91,17 +89,16 @@ class ContactAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
- $base_url = $request->getAttribute('base_url');
- $body = Validator::parsedBody($request)->string('body') ?? '';
- $from_email = Validator::parsedBody($request)->string('from_email') ?? '';
- $from_name = Validator::parsedBody($request)->string('from_name') ?? '';
- $subject = Validator::parsedBody($request)->string('subject') ?? '';
- $to = Validator::parsedBody($request)->string('to') ?? '';
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $base_url;
- $ip = $request->getAttribute('client-ip');
+ $base_url = Validator::attributes($request)->string('base_url');
+ $body = Validator::parsedBody($request)->optionalString('body') ?? '';
+ $from_email = Validator::parsedBody($request)->optionalString('from_email') ?? '';
+ $from_name = Validator::parsedBody($request)->optionalString('from_name') ?? '';
+ $subject = Validator::parsedBody($request)->optionalString('subject') ?? '';
+ $to = Validator::parsedBody($request)->optionalString('to') ?? '';
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $base_url;
+ $ip = Validator::attributes($request)->string('client-ip');
$to_user = $this->user_service->findByUserName($to);
if ($to_user === null) {
diff --git a/app/Http/RequestHandlers/ContactPage.php b/app/Http/RequestHandlers/ContactPage.php
index db371779c8..44fbbf0c46 100644
--- a/app/Http/RequestHandlers/ContactPage.php
+++ b/app/Http/RequestHandlers/ContactPage.php
@@ -25,12 +25,11 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\CaptchaService;
use Fisharebest\Webtrees\Services\MessageService;
use Fisharebest\Webtrees\Services\UserService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function in_array;
use function route;
@@ -71,9 +70,7 @@ class ContactPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
$body = $params['body'] ?? '';
$from_email = $params['from_email'] ?? '';
diff --git a/app/Http/RequestHandlers/CopyFact.php b/app/Http/RequestHandlers/CopyFact.php
index fbc01219b5..a788cf8383 100644
--- a/app/Http/RequestHandlers/CopyFact.php
+++ b/app/Http/RequestHandlers/CopyFact.php
@@ -24,13 +24,11 @@ use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function response;
/**
@@ -59,13 +57,9 @@ class CopyFact implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $fact_id = $request->getAttribute('fact_id');
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
diff --git a/app/Http/RequestHandlers/CreateLocationAction.php b/app/Http/RequestHandlers/CreateLocationAction.php
index 95c93703eb..06068050df 100644
--- a/app/Http/RequestHandlers/CreateLocationAction.php
+++ b/app/Http/RequestHandlers/CreateLocationAction.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Process a form to create a new location.
*/
@@ -40,8 +38,7 @@ class CreateLocationAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$name = $params['location_name'];
diff --git a/app/Http/RequestHandlers/CreateLocationModal.php b/app/Http/RequestHandlers/CreateLocationModal.php
index 8fbf673e43..7afbaddcf5 100644
--- a/app/Http/RequestHandlers/CreateLocationModal.php
+++ b/app/Http/RequestHandlers/CreateLocationModal.php
@@ -19,12 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
use function view;
@@ -40,8 +39,7 @@ class CreateLocationModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return response(view('modals/create-location', [
'tree' => $tree,
diff --git a/app/Http/RequestHandlers/CreateMediaObjectAction.php b/app/Http/RequestHandlers/CreateMediaObjectAction.php
index 3541795d6a..d2f5674ee8 100644
--- a/app/Http/RequestHandlers/CreateMediaObjectAction.php
+++ b/app/Http/RequestHandlers/CreateMediaObjectAction.php
@@ -24,12 +24,11 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MediaFileService;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function in_array;
use function response;
@@ -63,9 +62,7 @@ class CreateMediaObjectAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$note = $params['media-note'] ?? '';
$title = $params['title'] ?? '';
diff --git a/app/Http/RequestHandlers/CreateMediaObjectFromFile.php b/app/Http/RequestHandlers/CreateMediaObjectFromFile.php
index b6db5cedcc..6b39c0a857 100644
--- a/app/Http/RequestHandlers/CreateMediaObjectFromFile.php
+++ b/app/Http/RequestHandlers/CreateMediaObjectFromFile.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Services\MediaFileService;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Create a new media object.
*/
@@ -56,9 +54,7 @@ class CreateMediaObjectFromFile implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$file = $params['file'] ?? '';
$type = $params['type'] ?? '';
diff --git a/app/Http/RequestHandlers/CreateMediaObjectModal.php b/app/Http/RequestHandlers/CreateMediaObjectModal.php
index abfe4d29f9..d4214ee873 100644
--- a/app/Http/RequestHandlers/CreateMediaObjectModal.php
+++ b/app/Http/RequestHandlers/CreateMediaObjectModal.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MediaFileService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Show a form to create a new media object.
*/
@@ -52,9 +50,7 @@ class CreateMediaObjectModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$max_upload_size = $this->media_file_service->maxUploadFilesize();
$media_types = Registry::elementFactory()->make('OBJE:FILE:FORM:TYPE')->values();
$data_filesystem = Registry::filesystem()->data();
diff --git a/app/Http/RequestHandlers/CreateNoteAction.php b/app/Http/RequestHandlers/CreateNoteAction.php
index 6bba935ff8..e40cbd2436 100644
--- a/app/Http/RequestHandlers/CreateNoteAction.php
+++ b/app/Http/RequestHandlers/CreateNoteAction.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Process a form to create a new note object.
*/
@@ -40,9 +38,7 @@ class CreateNoteAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$note = $params['note'];
$restriction = $params['restriction'];
diff --git a/app/Http/RequestHandlers/CreateNoteModal.php b/app/Http/RequestHandlers/CreateNoteModal.php
index e37b27bbaa..0da3977a4b 100644
--- a/app/Http/RequestHandlers/CreateNoteModal.php
+++ b/app/Http/RequestHandlers/CreateNoteModal.php
@@ -19,12 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
use function view;
@@ -42,8 +41,7 @@ class CreateNoteModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return response(view('modals/create-note-object', [
'tree' => $tree,
diff --git a/app/Http/RequestHandlers/CreateRepositoryAction.php b/app/Http/RequestHandlers/CreateRepositoryAction.php
index 899d77525a..4b1e57af45 100644
--- a/app/Http/RequestHandlers/CreateRepositoryAction.php
+++ b/app/Http/RequestHandlers/CreateRepositoryAction.php
@@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function in_array;
use function preg_replace;
use function response;
@@ -45,13 +44,11 @@ class CreateRepositoryAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $params = (array) $request->getParsedBody();
- $name = $params['name'];
- $address = $params['address'];
- $url = $params['url'];
+ $tree = Validator::attributes($request)->tree();
+ $params = (array) $request->getParsedBody();
+ $name = $params['name'];
+ $address = $params['address'];
+ $url = $params['url'];
$restriction = $params['restriction'];
// Fix non-printing characters
diff --git a/app/Http/RequestHandlers/CreateRepositoryModal.php b/app/Http/RequestHandlers/CreateRepositoryModal.php
index 07add2baf3..d283a1b9bd 100644
--- a/app/Http/RequestHandlers/CreateRepositoryModal.php
+++ b/app/Http/RequestHandlers/CreateRepositoryModal.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Elements\AddressLine;
use Fisharebest\Webtrees\Elements\AddressWebPage;
use Fisharebest\Webtrees\Elements\NameOfRepository;
use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
use function view;
@@ -44,8 +43,7 @@ class CreateRepositoryModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$elements = [
'name' => new NameOfRepository(I18N::translateContext('Repository', 'Name')),
diff --git a/app/Http/RequestHandlers/CreateSourceAction.php b/app/Http/RequestHandlers/CreateSourceAction.php
index c4ff922fc0..d5c6065986 100644
--- a/app/Http/RequestHandlers/CreateSourceAction.php
+++ b/app/Http/RequestHandlers/CreateSourceAction.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Process a form to create a new source.
*/
@@ -40,8 +38,7 @@ class CreateSourceAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$title = $params['source-title'];
diff --git a/app/Http/RequestHandlers/CreateSourceModal.php b/app/Http/RequestHandlers/CreateSourceModal.php
index 7a316e65be..3d6a90b9e5 100644
--- a/app/Http/RequestHandlers/CreateSourceModal.php
+++ b/app/Http/RequestHandlers/CreateSourceModal.php
@@ -19,12 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
use function view;
@@ -40,8 +39,7 @@ class CreateSourceModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return response(view('modals/create-source', [
'tree' => $tree,
diff --git a/app/Http/RequestHandlers/CreateSubmissionAction.php b/app/Http/RequestHandlers/CreateSubmissionAction.php
index a9d538221b..c7753ed7d5 100644
--- a/app/Http/RequestHandlers/CreateSubmissionAction.php
+++ b/app/Http/RequestHandlers/CreateSubmissionAction.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Process a form to create a new submission.
*/
@@ -40,9 +38,7 @@ class CreateSubmissionAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$submitter = $params['submitter'];
diff --git a/app/Http/RequestHandlers/CreateSubmissionModal.php b/app/Http/RequestHandlers/CreateSubmissionModal.php
index 65bb713514..8d1bfebc85 100644
--- a/app/Http/RequestHandlers/CreateSubmissionModal.php
+++ b/app/Http/RequestHandlers/CreateSubmissionModal.php
@@ -19,13 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Show a form to create a new submission.
*/
@@ -38,8 +36,7 @@ class CreateSubmissionModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return response(view('modals/create-submission', [
'tree' => $tree,
diff --git a/app/Http/RequestHandlers/CreateSubmitterAction.php b/app/Http/RequestHandlers/CreateSubmitterAction.php
index 89958b4e14..2615236ba8 100644
--- a/app/Http/RequestHandlers/CreateSubmitterAction.php
+++ b/app/Http/RequestHandlers/CreateSubmitterAction.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Process a form to create a new submitter.
*/
@@ -40,9 +38,7 @@ class CreateSubmitterAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$name = $params['submitter_name'];
$address = $params['submitter_address'];
diff --git a/app/Http/RequestHandlers/CreateSubmitterModal.php b/app/Http/RequestHandlers/CreateSubmitterModal.php
index 0b7a13daeb..1c32d35165 100644
--- a/app/Http/RequestHandlers/CreateSubmitterModal.php
+++ b/app/Http/RequestHandlers/CreateSubmitterModal.php
@@ -19,13 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Show a form to create a new submitter.
*/
@@ -38,8 +36,7 @@ class CreateSubmitterModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return response(view('modals/create-submitter', [
'tree' => $tree,
diff --git a/app/Http/RequestHandlers/DataFixChoose.php b/app/Http/RequestHandlers/DataFixChoose.php
index ef7e84f283..4c3b93a40d 100644
--- a/app/Http/RequestHandlers/DataFixChoose.php
+++ b/app/Http/RequestHandlers/DataFixChoose.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
/**
@@ -57,8 +56,7 @@ class DataFixChoose implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class, false, true);
diff --git a/app/Http/RequestHandlers/DataFixData.php b/app/Http/RequestHandlers/DataFixData.php
index d9c0afcbdb..04b68a5686 100644
--- a/app/Http/RequestHandlers/DataFixData.php
+++ b/app/Http/RequestHandlers/DataFixData.php
@@ -25,7 +25,7 @@ use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Services\DataFixService;
use Fisharebest\Webtrees\Services\DatatablesService;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -70,10 +70,8 @@ class DataFixData implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $data_fix = $request->getAttribute('data_fix') ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $data_fix = Validator::attributes($request)->string('data_fix', '');
$module = $this->module_service->findByName($data_fix);
assert($module instanceof ModuleDataFixInterface);
diff --git a/app/Http/RequestHandlers/DataFixPage.php b/app/Http/RequestHandlers/DataFixPage.php
index c79c7750a4..a91cbc6447 100644
--- a/app/Http/RequestHandlers/DataFixPage.php
+++ b/app/Http/RequestHandlers/DataFixPage.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function redirect;
use function route;
@@ -59,8 +58,7 @@ class DataFixPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class, false, true);
@@ -68,7 +66,7 @@ class DataFixPage implements RequestHandlerInterface
return redirect(route('control-panel'));
}
- $data_fix = $request->getAttribute('data_fix') ?? '';
+ $data_fix = Validator::attributes($request)->string('data_fix', '');
$module = $this->module_service->findByName($data_fix);
$this->layout = 'layouts/administration';
diff --git a/app/Http/RequestHandlers/DataFixPreview.php b/app/Http/RequestHandlers/DataFixPreview.php
index 5bcd235c1b..8fb919a4be 100644
--- a/app/Http/RequestHandlers/DataFixPreview.php
+++ b/app/Http/RequestHandlers/DataFixPreview.php
@@ -25,7 +25,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -58,10 +58,8 @@ class DataFixPreview implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $data_fix = $request->getAttribute('data_fix', '');
+ $tree = Validator::attributes($request)->tree();
+ $data_fix = Validator::attributes($request)->string('data_fix', '');
$module = $this->module_service->findByName($data_fix);
assert($module instanceof ModuleDataFixInterface);
diff --git a/app/Http/RequestHandlers/DataFixSelect.php b/app/Http/RequestHandlers/DataFixSelect.php
index 89f75f8dc4..62052e9417 100644
--- a/app/Http/RequestHandlers/DataFixSelect.php
+++ b/app/Http/RequestHandlers/DataFixSelect.php
@@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -54,9 +53,7 @@ class DataFixSelect implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$data_fixes = $this->module_service->findByInterface(ModuleDataFixInterface::class);
$data_fix = $request->getParsedBody()['data_fix'] ?? '';
diff --git a/app/Http/RequestHandlers/DataFixUpdate.php b/app/Http/RequestHandlers/DataFixUpdate.php
index 131e7ed84b..ef1ff857c8 100644
--- a/app/Http/RequestHandlers/DataFixUpdate.php
+++ b/app/Http/RequestHandlers/DataFixUpdate.php
@@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -55,10 +55,8 @@ class DataFixUpdate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $data_fix = $request->getAttribute('data_fix', '');
+ $tree = Validator::attributes($request)->tree();
+ $data_fix = Validator::attributes($request)->string('data_fix', '');
$module = $this->module_service->findByName($data_fix);
assert($module instanceof ModuleDataFixInterface);
diff --git a/app/Http/RequestHandlers/DataFixUpdateAll.php b/app/Http/RequestHandlers/DataFixUpdateAll.php
index 165ce2f8cd..ac865d1a50 100644
--- a/app/Http/RequestHandlers/DataFixUpdateAll.php
+++ b/app/Http/RequestHandlers/DataFixUpdateAll.php
@@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
use Fisharebest\Webtrees\Services\DataFixService;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -69,10 +70,8 @@ class DataFixUpdateAll implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $data_fix = $request->getAttribute('data_fix', '');
+ $tree = Validator::attributes($request)->tree();
+ $data_fix = Validator::attributes($request)->string('data_fix', '');
$module = $this->module_service->findByName($data_fix);
assert($module instanceof ModuleDataFixInterface);
diff --git a/app/Http/RequestHandlers/DeleteFact.php b/app/Http/RequestHandlers/DeleteFact.php
index 8c76ed96fe..f0708f1e5c 100644
--- a/app/Http/RequestHandlers/DeleteFact.php
+++ b/app/Http/RequestHandlers/DeleteFact.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function response;
/**
@@ -44,13 +42,9 @@ class DeleteFact implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $fact_id = $request->getAttribute('fact_id');
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
diff --git a/app/Http/RequestHandlers/DeleteRecord.php b/app/Http/RequestHandlers/DeleteRecord.php
index 10c57d1831..1eda700238 100644
--- a/app/Http/RequestHandlers/DeleteRecord.php
+++ b/app/Http/RequestHandlers/DeleteRecord.php
@@ -26,14 +26,12 @@ use Fisharebest\Webtrees\Gedcom;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
-use function is_string;
use function preg_match_all;
use function preg_replace;
use function response;
@@ -53,12 +51,8 @@ class DeleteRecord implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
diff --git a/app/Http/RequestHandlers/DeleteTreeAction.php b/app/Http/RequestHandlers/DeleteTreeAction.php
index 596c1d898d..036c1dcfbe 100644
--- a/app/Http/RequestHandlers/DeleteTreeAction.php
+++ b/app/Http/RequestHandlers/DeleteTreeAction.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\TreeService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function response;
@@ -55,8 +54,7 @@ class DeleteTreeAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$this->tree_service->delete($tree);
diff --git a/app/Http/RequestHandlers/EditFactAction.php b/app/Http/RequestHandlers/EditFactAction.php
index 6259322f35..d4df74d8b2 100644
--- a/app/Http/RequestHandlers/EditFactAction.php
+++ b/app/Http/RequestHandlers/EditFactAction.php
@@ -25,7 +25,6 @@ use Fisharebest\Webtrees\Module\CensusAssistantModule;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -63,14 +62,9 @@ class EditFactAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $fact_id = $request->getAttribute('fact_id') ?? '';
- assert(is_string($fact_id));
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
@@ -118,8 +112,8 @@ class EditFactAction implements RequestHandlerInterface
}
}
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $record->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $record->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/EditFactPage.php b/app/Http/RequestHandlers/EditFactPage.php
index c2eb556167..819ec24cef 100644
--- a/app/Http/RequestHandlers/EditFactPage.php
+++ b/app/Http/RequestHandlers/EditFactPage.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -59,15 +59,9 @@ class EditFactPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $fact_id = $request->getAttribute('fact_id');
- assert(is_string($fact_id));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
$include_hidden = (bool) ($request->getQueryParams()['include_hidden'] ?? false);
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
diff --git a/app/Http/RequestHandlers/EditMediaFileAction.php b/app/Http/RequestHandlers/EditMediaFileAction.php
index 32928c9ff2..b507e4542e 100644
--- a/app/Http/RequestHandlers/EditMediaFileAction.php
+++ b/app/Http/RequestHandlers/EditMediaFileAction.php
@@ -27,7 +27,7 @@ use Fisharebest\Webtrees\MediaFile;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MediaFileService;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use League\Flysystem\FilesystemException;
use League\Flysystem\UnableToMoveFile;
use League\Flysystem\UnableToRetrieveMetadata;
@@ -73,15 +73,9 @@ class EditMediaFileAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $fact_id = $request->getAttribute('fact_id');
- assert(is_string($fact_id));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
$data_filesystem = Registry::filesystem()->data();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/EditMediaFileModal.php b/app/Http/RequestHandlers/EditMediaFileModal.php
index 91e5dba7db..f7d1dfad6d 100644
--- a/app/Http/RequestHandlers/EditMediaFileModal.php
+++ b/app/Http/RequestHandlers/EditMediaFileModal.php
@@ -26,7 +26,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\MediaFileService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -62,15 +62,9 @@ class EditMediaFileModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $fact_id = $request->getAttribute('fact_id');
- assert(is_string($fact_id));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
$data_filesystem = Registry::filesystem()->data();
$media = Registry::mediaFactory()->make($xref, $tree);
diff --git a/app/Http/RequestHandlers/EditNoteAction.php b/app/Http/RequestHandlers/EditNoteAction.php
index 227807be17..db0e08f4e0 100644
--- a/app/Http/RequestHandlers/EditNoteAction.php
+++ b/app/Http/RequestHandlers/EditNoteAction.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Edit note objects.
*/
@@ -42,14 +40,10 @@ class EditNoteAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
-
- $note = Registry::noteFactory()->make($xref, $tree);
- $note = Auth::checkNoteAccess($note, true);
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $note = Registry::noteFactory()->make($xref, $tree);
+ $note = Auth::checkNoteAccess($note, true);
$params = (array) $request->getParsedBody();
$NOTE = $params['NOTE'];
diff --git a/app/Http/RequestHandlers/EditNotePage.php b/app/Http/RequestHandlers/EditNotePage.php
index 9e8b0fad41..4bd3b8570f 100644
--- a/app/Http/RequestHandlers/EditNotePage.php
+++ b/app/Http/RequestHandlers/EditNotePage.php
@@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Edit note objects.
*/
@@ -46,11 +44,8 @@ class EditNotePage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$note = Registry::noteFactory()->make($xref, $tree);
$note = Auth::checkNoteAccess($note, true);
diff --git a/app/Http/RequestHandlers/EditRawFactAction.php b/app/Http/RequestHandlers/EditRawFactAction.php
index 67c8bd7352..b5f347b3ff 100644
--- a/app/Http/RequestHandlers/EditRawFactAction.php
+++ b/app/Http/RequestHandlers/EditRawFactAction.php
@@ -21,14 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function preg_replace;
use function redirect;
use function trim;
@@ -45,21 +42,13 @@ class EditRawFactAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $record = Registry::gedcomRecordFactory()->make($xref, $tree);
- $record = Auth::checkRecordAccess($record, true);
-
- $fact_id = $request->getAttribute('fact_id');
- assert(is_string($fact_id));
-
- $params = (array) $request->getParsedBody();
-
- $gedcom = $params['gedcom'];
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $record = Registry::gedcomRecordFactory()->make($xref, $tree);
+ $record = Auth::checkRecordAccess($record, true);
+ $fact_id = Validator::attributes($request)->string('fact_id');
+ $params = (array) $request->getParsedBody();
+ $gedcom = $params['gedcom'];
// Cleanup the client’s bad editing?
$gedcom = preg_replace('/[\r\n]+/', "\n", $gedcom); // Empty lines
@@ -73,8 +62,8 @@ class EditRawFactAction implements RequestHandlerInterface
}
}
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $record->url();
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $record->url();
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/EditRawFactPage.php b/app/Http/RequestHandlers/EditRawFactPage.php
index 14258be92d..67aed2d3a0 100644
--- a/app/Http/RequestHandlers/EditRawFactPage.php
+++ b/app/Http/RequestHandlers/EditRawFactPage.php
@@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -47,18 +45,12 @@ class EditRawFactPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $record = Registry::gedcomRecordFactory()->make($xref, $tree);
- $record = Auth::checkRecordAccess($record, true);
-
- $fact_id = $request->getAttribute('fact_id');
-
- $title = I18N::translate('Edit the raw GEDCOM') . ' - ' . $record->fullName();
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $record = Registry::gedcomRecordFactory()->make($xref, $tree);
+ $record = Auth::checkRecordAccess($record, true);
+ $fact_id = Validator::attributes($request)->string('fact_id');
+ $title = I18N::translate('Edit the raw GEDCOM') . ' - ' . $record->fullName();
$fact = $record->facts([], false, null, true)
->first(static function (Fact $fact) use ($fact_id): bool {
diff --git a/app/Http/RequestHandlers/EditRawRecordAction.php b/app/Http/RequestHandlers/EditRawRecordAction.php
index f57f095a90..5c67ca5797 100644
--- a/app/Http/RequestHandlers/EditRawRecordAction.php
+++ b/app/Http/RequestHandlers/EditRawRecordAction.php
@@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\Header;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -44,15 +44,10 @@ class EditRawRecordAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
-
$params = (array) $request->getParsedBody();
$level0 = $params['level0'];
diff --git a/app/Http/RequestHandlers/EditRawRecordPage.php b/app/Http/RequestHandlers/EditRawRecordPage.php
index 21deda1954..dbf4368b45 100644
--- a/app/Http/RequestHandlers/EditRawRecordPage.php
+++ b/app/Http/RequestHandlers/EditRawRecordPage.php
@@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -46,12 +46,8 @@ class EditRawRecordPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
diff --git a/app/Http/RequestHandlers/EditRecordAction.php b/app/Http/RequestHandlers/EditRecordAction.php
index 40fabcf911..275293a8a0 100644
--- a/app/Http/RequestHandlers/EditRecordAction.php
+++ b/app/Http/RequestHandlers/EditRecordAction.php
@@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Header;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -56,15 +54,10 @@ class EditRecordAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $record = Registry::gedcomRecordFactory()->make($xref, $tree);
- $record = Auth::checkRecordAccess($record, true);
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $record = Registry::gedcomRecordFactory()->make($xref, $tree);
+ $record = Auth::checkRecordAccess($record, true);
$params = (array) $request->getParsedBody();
$keep_chan = (bool) ($params['keep_chan'] ?? false);
$levels = $params['levels'];
diff --git a/app/Http/RequestHandlers/EditRecordPage.php b/app/Http/RequestHandlers/EditRecordPage.php
index f12f424bb7..9e8ad920a1 100644
--- a/app/Http/RequestHandlers/EditRecordPage.php
+++ b/app/Http/RequestHandlers/EditRecordPage.php
@@ -23,13 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function route;
/**
@@ -58,12 +56,8 @@ class EditRecordPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
diff --git a/app/Http/RequestHandlers/EmailPreferencesAction.php b/app/Http/RequestHandlers/EmailPreferencesAction.php
index 2c09fc7278..ced2316aa8 100644
--- a/app/Http/RequestHandlers/EmailPreferencesAction.php
+++ b/app/Http/RequestHandlers/EmailPreferencesAction.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\EmailService;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\SiteUser;
-use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -57,9 +57,7 @@ class EmailPreferencesAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
- assert($user instanceof User);
-
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
Site::setPreference('SMTP_ACTIVE', $params['SMTP_ACTIVE']);
diff --git a/app/Http/RequestHandlers/EmptyClipboard.php b/app/Http/RequestHandlers/EmptyClipboard.php
index a49681cd15..78ec1ea2f6 100644
--- a/app/Http/RequestHandlers/EmptyClipboard.php
+++ b/app/Http/RequestHandlers/EmptyClipboard.php
@@ -55,9 +55,9 @@ class EmptyClipboard implements RequestHandlerInterface
{
$this->clipboard_service->emptyClipboard();
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
$default_url = $request->getHeaderLine('Referer');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $default_url;
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $default_url;
return redirect($url);
}
diff --git a/app/Http/RequestHandlers/ExportGedcomClient.php b/app/Http/RequestHandlers/ExportGedcomClient.php
index 9d42cbcd37..c284cd8517 100644
--- a/app/Http/RequestHandlers/ExportGedcomClient.php
+++ b/app/Http/RequestHandlers/ExportGedcomClient.php
@@ -29,7 +29,6 @@ use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomExportService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use League\Flysystem\Filesystem;
@@ -43,7 +42,6 @@ use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function addcslashes;
-use function assert;
use function fclose;
use function pathinfo;
use function strtolower;
@@ -89,16 +87,15 @@ class ExportGedcomClient implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_filesystem = Registry::filesystem()->data();
- $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->requiredString('format');
- $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->requiredString('privacy');
- $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->requiredString('encoding');
- $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->requiredString('line_endings');
- $media_path = Validator::parsedBody($request)->string('media_path') ?? '';
+ $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->string('format');
+ $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->string('privacy');
+ $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->string('encoding');
+ $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->string('line_endings');
+ $media_path = Validator::parsedBody($request)->optionalString('media_path') ?? '';
$access_levels = [
'gedadmin' => Auth::PRIV_NONE,
diff --git a/app/Http/RequestHandlers/ExportGedcomPage.php b/app/Http/RequestHandlers/ExportGedcomPage.php
index d97c1bd56e..d6c222f6e3 100644
--- a/app/Http/RequestHandlers/ExportGedcomPage.php
+++ b/app/Http/RequestHandlers/ExportGedcomPage.php
@@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function pathinfo;
use function strtolower;
@@ -47,9 +46,7 @@ class ExportGedcomPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$title = I18N::translate('Export a GEDCOM file') . ' — ' . e($tree->title());
$this->layout = 'layouts/administration';
diff --git a/app/Http/RequestHandlers/ExportGedcomServer.php b/app/Http/RequestHandlers/ExportGedcomServer.php
index 55a3fa4f4d..b4d6e43b79 100644
--- a/app/Http/RequestHandlers/ExportGedcomServer.php
+++ b/app/Http/RequestHandlers/ExportGedcomServer.php
@@ -25,14 +25,13 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomExportService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use League\Flysystem\FilesystemException;
use League\Flysystem\UnableToWriteFile;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function fclose;
use function pathinfo;
use function redirect;
@@ -67,8 +66,7 @@ class ExportGedcomServer implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_filesystem = Registry::filesystem()->data();
diff --git a/app/Http/RequestHandlers/FamilyPage.php b/app/Http/RequestHandlers/FamilyPage.php
index 7d9fd0a6d1..e48d9b9689 100644
--- a/app/Http/RequestHandlers/FamilyPage.php
+++ b/app/Http/RequestHandlers/FamilyPage.php
@@ -28,18 +28,16 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function array_map;
-use function assert;
use function e;
use function explode;
use function implode;
use function in_array;
-use function is_string;
use function redirect;
use function strip_tags;
use function trim;
@@ -70,19 +68,14 @@ class FamilyPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($family);
-
- if ($family->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($family->xref() !== $xref || Registry::slugFactory()->make($family) !== $slug) {
return redirect($family->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/FindDuplicateRecords.php b/app/Http/RequestHandlers/FindDuplicateRecords.php
index 0abd9a6adf..53d8225417 100644
--- a/app/Http/RequestHandlers/FindDuplicateRecords.php
+++ b/app/Http/RequestHandlers/FindDuplicateRecords.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\AdminService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
/**
@@ -56,8 +55,7 @@ class FindDuplicateRecords implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$duplicates = $this->admin_service->duplicateRecords($tree);
$title = I18N::translate('Find duplicates') . ' — ' . e($tree->title());
diff --git a/app/Http/RequestHandlers/GedcomLoad.php b/app/Http/RequestHandlers/GedcomLoad.php
index 1c8bbb279d..2c99ac9566 100644
--- a/app/Http/RequestHandlers/GedcomLoad.php
+++ b/app/Http/RequestHandlers/GedcomLoad.php
@@ -27,14 +27,13 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\GedcomImportService;
use Fisharebest\Webtrees\Services\TimeoutService;
use Fisharebest\Webtrees\Services\TreeService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\DetectsConcurrencyErrors;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function preg_split;
use function response;
use function str_replace;
@@ -83,8 +82,7 @@ class GedcomLoad implements RequestHandlerInterface
{
$this->layout = 'layouts/ajax';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
try {
// What is the current import status?
diff --git a/app/Http/RequestHandlers/GedcomRecordPage.php b/app/Http/RequestHandlers/GedcomRecordPage.php
index 22d052eb61..ec3a98754e 100644
--- a/app/Http/RequestHandlers/GedcomRecordPage.php
+++ b/app/Http/RequestHandlers/GedcomRecordPage.php
@@ -32,14 +32,12 @@ use Fisharebest\Webtrees\Repository;
use Fisharebest\Webtrees\Source;
use Fisharebest\Webtrees\Submission;
use Fisharebest\Webtrees\Submitter;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -72,12 +70,8 @@ class GedcomRecordPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record);
diff --git a/app/Http/RequestHandlers/HeaderPage.php b/app/Http/RequestHandlers/HeaderPage.php
index 59a6bca12d..ae32286eab 100644
--- a/app/Http/RequestHandlers/HeaderPage.php
+++ b/app/Http/RequestHandlers/HeaderPage.php
@@ -23,7 +23,7 @@ use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -47,19 +47,14 @@ class HeaderPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$header = Registry::headerFactory()->make($xref, $tree);
$header = Auth::checkHeaderAccess($header, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($header);
-
- if ($header->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($header->xref() !== $xref || Registry::slugFactory()->make($header) !== $slug) {
return redirect($header->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/HomePage.php b/app/Http/RequestHandlers/HomePage.php
index 1dafe20b91..d5b2e8e909 100644
--- a/app/Http/RequestHandlers/HomePage.php
+++ b/app/Http/RequestHandlers/HomePage.php
@@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -60,7 +61,7 @@ class HomePage implements RequestHandlerInterface
{
$default = Site::getPreference('DEFAULT_GEDCOM');
$tree = $this->tree_service->all()->get($default) ?? $this->tree_service->all()->first();
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
if ($tree instanceof Tree) {
if ($tree->getPreference('imported') === '1') {
diff --git a/app/Http/RequestHandlers/ImportGedcomAction.php b/app/Http/RequestHandlers/ImportGedcomAction.php
index 343888d290..fa91c5ca27 100644
--- a/app/Http/RequestHandlers/ImportGedcomAction.php
+++ b/app/Http/RequestHandlers/ImportGedcomAction.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\TreeService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use League\Flysystem\FilesystemException;
use League\Flysystem\UnableToReadFile;
use Psr\Http\Message\ResponseInterface;
@@ -32,7 +32,6 @@ use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function basename;
use function redirect;
use function route;
@@ -63,8 +62,7 @@ class ImportGedcomAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_filesystem = Registry::filesystem()->data();
diff --git a/app/Http/RequestHandlers/ImportGedcomPage.php b/app/Http/RequestHandlers/ImportGedcomPage.php
index c411700aaf..8409f2a8b5 100644
--- a/app/Http/RequestHandlers/ImportGedcomPage.php
+++ b/app/Http/RequestHandlers/ImportGedcomPage.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\AdminService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
/**
@@ -57,8 +56,7 @@ class ImportGedcomPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_filesystem = Registry::filesystem()->data();
$data_folder = Registry::filesystem()->dataName();
diff --git a/app/Http/RequestHandlers/IndividualPage.php b/app/Http/RequestHandlers/IndividualPage.php
index 86a236fd8c..37147bd440 100644
--- a/app/Http/RequestHandlers/IndividualPage.php
+++ b/app/Http/RequestHandlers/IndividualPage.php
@@ -35,7 +35,7 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\UserService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -90,19 +90,14 @@ class IndividualPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($individual);
-
- if ($individual->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($individual->xref() !== $xref || Registry::slugFactory()->make($individual) !== $slug) {
return redirect($individual->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/LinkChildToFamilyAction.php b/app/Http/RequestHandlers/LinkChildToFamilyAction.php
index e60e39bccf..5dfcb94774 100644
--- a/app/Http/RequestHandlers/LinkChildToFamilyAction.php
+++ b/app/Http/RequestHandlers/LinkChildToFamilyAction.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -42,12 +42,8 @@ class LinkChildToFamilyAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/LinkChildToFamilyPage.php b/app/Http/RequestHandlers/LinkChildToFamilyPage.php
index e76e0767f4..fd23c43c09 100644
--- a/app/Http/RequestHandlers/LinkChildToFamilyPage.php
+++ b/app/Http/RequestHandlers/LinkChildToFamilyPage.php
@@ -23,14 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
-
/**
* Link an existing individual as child in an existing family.
*/
@@ -45,16 +42,11 @@ class LinkChildToFamilyPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
-
- $title = I18N::translate('Link this individual to an existing family as a child');
+ $title = I18N::translate('Link this individual to an existing family as a child');
return $this->viewResponse('edit/link-child-to-family', [
'individual' => $individual,
diff --git a/app/Http/RequestHandlers/LinkMediaToFamilyModal.php b/app/Http/RequestHandlers/LinkMediaToFamilyModal.php
index ab6c9705ba..07d11a3a91 100644
--- a/app/Http/RequestHandlers/LinkMediaToFamilyModal.php
+++ b/app/Http/RequestHandlers/LinkMediaToFamilyModal.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,12 +41,8 @@ class LinkMediaToFamilyModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$media = Registry::mediaFactory()->make($xref, $tree);
$media = Auth::checkMediaAccess($media);
diff --git a/app/Http/RequestHandlers/LinkMediaToIndividualModal.php b/app/Http/RequestHandlers/LinkMediaToIndividualModal.php
index d34c3af77d..156c74a091 100644
--- a/app/Http/RequestHandlers/LinkMediaToIndividualModal.php
+++ b/app/Http/RequestHandlers/LinkMediaToIndividualModal.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,12 +41,8 @@ class LinkMediaToIndividualModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$media = Registry::mediaFactory()->make($xref, $tree);
$media = Auth::checkMediaAccess($media);
diff --git a/app/Http/RequestHandlers/LinkMediaToRecordAction.php b/app/Http/RequestHandlers/LinkMediaToRecordAction.php
index 124101af0c..4cdb4f0c8c 100644
--- a/app/Http/RequestHandlers/LinkMediaToRecordAction.php
+++ b/app/Http/RequestHandlers/LinkMediaToRecordAction.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,12 +41,8 @@ class LinkMediaToRecordAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$params = (array) $request->getParsedBody();
$link = $params['link'] ?? '';
diff --git a/app/Http/RequestHandlers/LinkMediaToSourceModal.php b/app/Http/RequestHandlers/LinkMediaToSourceModal.php
index 55fff0c5bb..0a5d18d03f 100644
--- a/app/Http/RequestHandlers/LinkMediaToSourceModal.php
+++ b/app/Http/RequestHandlers/LinkMediaToSourceModal.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,12 +41,8 @@ class LinkMediaToSourceModal implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$media = Registry::mediaFactory()->make($xref, $tree);
$media = Auth::checkMediaAccess($media);
diff --git a/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php b/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php
index d8c76b1f42..c059666ed0 100644
--- a/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php
+++ b/app/Http/RequestHandlers/LinkSpouseToIndividualAction.php
@@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -55,12 +55,8 @@ class LinkSpouseToIndividualAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php b/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php
index 375c753c8e..70b3ca1a58 100644
--- a/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php
+++ b/app/Http/RequestHandlers/LinkSpouseToIndividualPage.php
@@ -25,7 +25,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\GedcomEditService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -59,12 +59,8 @@ class LinkSpouseToIndividualPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/LocationPage.php b/app/Http/RequestHandlers/LocationPage.php
index 39ec3fb4e9..4f53815e84 100644
--- a/app/Http/RequestHandlers/LocationPage.php
+++ b/app/Http/RequestHandlers/LocationPage.php
@@ -23,7 +23,7 @@ use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -47,19 +47,14 @@ class LocationPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::locationFactory()->make($xref, $tree);
$record = Auth::checkLocationAccess($record, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/LoginAction.php b/app/Http/RequestHandlers/LoginAction.php
index 337dc59ff1..26aab30ba5 100644
--- a/app/Http/RequestHandlers/LoginAction.php
+++ b/app/Http/RequestHandlers/LoginAction.php
@@ -67,12 +67,12 @@ class LoginAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- $base_url = $request->getAttribute('base_url');
+ $tree = Validator::attributes($request)->treeOptional();
+ $base_url = Validator::attributes($request)->string('base_url');
$default_url = route(HomePage::class);
- $username = Validator::parsedBody($request)->string('username') ?? '';
- $password = Validator::parsedBody($request)->string('password') ?? '';
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $default_url;
+ $username = Validator::parsedBody($request)->optionalString('username') ?? '';
+ $password = Validator::parsedBody($request)->optionalString('password') ?? '';
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $default_url;
try {
$this->doLogin($username, $password);
diff --git a/app/Http/RequestHandlers/LoginPage.php b/app/Http/RequestHandlers/LoginPage.php
index 9976f3447c..b7a4dd48e2 100644
--- a/app/Http/RequestHandlers/LoginPage.php
+++ b/app/Http/RequestHandlers/LoginPage.php
@@ -25,6 +25,7 @@ use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -55,8 +56,8 @@ class LoginPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
// Already logged in?
if ($user instanceof User) {
diff --git a/app/Http/RequestHandlers/Logout.php b/app/Http/RequestHandlers/Logout.php
index de3f410016..74543400df 100644
--- a/app/Http/RequestHandlers/Logout.php
+++ b/app/Http/RequestHandlers/Logout.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Log;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -43,7 +44,7 @@ class Logout implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
if ($user instanceof User) {
Log::addAuthenticationLog('Logout: ' . Auth::user()->userName() . '/' . Auth::user()->realName());
diff --git a/app/Http/RequestHandlers/ManageTrees.php b/app/Http/RequestHandlers/ManageTrees.php
index b431e07355..0b1099b78d 100644
--- a/app/Http/RequestHandlers/ManageTrees.php
+++ b/app/Http/RequestHandlers/ManageTrees.php
@@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Services\AdminService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -60,7 +61,7 @@ class ManageTrees implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$multiple_tree_threshold = $this->admin_service->multipleTreeThreshold();
$gedcom_file_count = $this->admin_service->gedcomFiles(Registry::filesystem()->data())->count();
diff --git a/app/Http/RequestHandlers/Masquerade.php b/app/Http/RequestHandlers/Masquerade.php
index 7a226309be..3c6494ca18 100644
--- a/app/Http/RequestHandlers/Masquerade.php
+++ b/app/Http/RequestHandlers/Masquerade.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\Log;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Session;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -52,14 +53,14 @@ class Masquerade implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user_id = (int) $request->getAttribute('user_id');
+ $user_id = Validator::attributes($request)->integer('user_id');
$user = $this->user_service->find($user_id);
if ($user === null) {
throw new HttpNotFoundException('User ID ' . $user_id . ' not found');
}
- if ($request->getAttribute('user')->id() !== $user_id) {
+ if (Validator::attributes($request)->user()->id() !== $user_id) {
Log::addAuthenticationLog('Masquerade as user: ' . $user->userName());
Auth::login($user);
Session::put('masquerade', '1');
diff --git a/app/Http/RequestHandlers/MediaFileDownload.php b/app/Http/RequestHandlers/MediaFileDownload.php
index 1b4761d834..66557a992f 100644
--- a/app/Http/RequestHandlers/MediaFileDownload.php
+++ b/app/Http/RequestHandlers/MediaFileDownload.php
@@ -21,9 +21,8 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -45,11 +44,8 @@ class MediaFileDownload implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$image_factory = Registry::imageFactory();
diff --git a/app/Http/RequestHandlers/MediaFileThumbnail.php b/app/Http/RequestHandlers/MediaFileThumbnail.php
index 11a3f41424..c321261a4c 100644
--- a/app/Http/RequestHandlers/MediaFileThumbnail.php
+++ b/app/Http/RequestHandlers/MediaFileThumbnail.php
@@ -20,14 +20,12 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fig\Http\Message\StatusCodeInterface;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
/**
@@ -44,11 +42,8 @@ class MediaFileThumbnail implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = $request->getQueryParams();
$xref = $params['xref'] ?? '';
diff --git a/app/Http/RequestHandlers/MediaPage.php b/app/Http/RequestHandlers/MediaPage.php
index 2f4e616125..94c63f9e13 100644
--- a/app/Http/RequestHandlers/MediaPage.php
+++ b/app/Http/RequestHandlers/MediaPage.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -61,19 +61,14 @@ class MediaPage implements RequestHandlerInterface
{
$data_filesystem = Registry::filesystem()->data();
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::mediaFactory()->make($xref, $tree);
$record = Auth::checkMediaAccess($record);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/MergeFactsAction.php b/app/Http/RequestHandlers/MergeFactsAction.php
index dbd7274e8c..2c02774065 100644
--- a/app/Http/RequestHandlers/MergeFactsAction.php
+++ b/app/Http/RequestHandlers/MergeFactsAction.php
@@ -24,14 +24,13 @@ use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function in_array;
use function preg_replace;
@@ -51,8 +50,7 @@ class MergeFactsAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/MergeFactsPage.php b/app/Http/RequestHandlers/MergeFactsPage.php
index ebc410348d..875b8ff067 100644
--- a/app/Http/RequestHandlers/MergeFactsPage.php
+++ b/app/Http/RequestHandlers/MergeFactsPage.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
/**
@@ -48,8 +47,7 @@ class MergeFactsPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref1 = $request->getQueryParams()['xref1'] ?? '';
$xref2 = $request->getQueryParams()['xref2'] ?? '';
diff --git a/app/Http/RequestHandlers/MergeRecordsAction.php b/app/Http/RequestHandlers/MergeRecordsAction.php
index d33e62d703..82dae6e3cd 100644
--- a/app/Http/RequestHandlers/MergeRecordsAction.php
+++ b/app/Http/RequestHandlers/MergeRecordsAction.php
@@ -20,12 +20,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -41,8 +40,7 @@ class MergeRecordsAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/MergeRecordsPage.php b/app/Http/RequestHandlers/MergeRecordsPage.php
index ea73093757..99521c5ae3 100644
--- a/app/Http/RequestHandlers/MergeRecordsPage.php
+++ b/app/Http/RequestHandlers/MergeRecordsPage.php
@@ -30,12 +30,11 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Repository;
use Fisharebest\Webtrees\Source;
use Fisharebest\Webtrees\Submitter;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
/**
@@ -56,9 +55,7 @@ class MergeRecordsPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$xref1 = $request->getQueryParams()['xref1'] ?? '';
$xref2 = $request->getQueryParams()['xref2'] ?? '';
diff --git a/app/Http/RequestHandlers/MessageAction.php b/app/Http/RequestHandlers/MessageAction.php
index b5e5bba60d..fe3709cce2 100644
--- a/app/Http/RequestHandlers/MessageAction.php
+++ b/app/Http/RequestHandlers/MessageAction.php
@@ -26,13 +26,11 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\MessageService;
use Fisharebest\Webtrees\Services\UserService;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function redirect;
use function route;
@@ -67,18 +65,16 @@ class MessageAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
$body = $params['body'];
$subject = $params['subject'];
$to = $params['to'];
$to_user = $this->user_service->findByUserName($to);
- $ip = $request->getAttribute('client-ip');
- $base_url = $request->getAttribute('base_url');
- $url = Validator::parsedBody($request)->isLocalUrl($base_url)->string('url') ?? $base_url;
+ $ip = Validator::attributes($request)->string('client-ip');
+ $base_url = Validator::attributes($request)->string('base_url');
+ $url = Validator::parsedBody($request)->isLocalUrl($base_url)->optionalString('url') ?? $base_url;
if ($to_user === null || $to_user->getPreference(UserInterface::PREF_CONTACT_METHOD) === 'none') {
throw new HttpAccessDeniedException('Invalid contact user id');
diff --git a/app/Http/RequestHandlers/MessagePage.php b/app/Http/RequestHandlers/MessagePage.php
index f16e0f123c..cf93885df1 100644
--- a/app/Http/RequestHandlers/MessagePage.php
+++ b/app/Http/RequestHandlers/MessagePage.php
@@ -24,12 +24,11 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\UserService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -58,10 +57,8 @@ class MessagePage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$body = $request->getQueryParams()['body'] ?? '';
$subject = $request->getQueryParams()['subject'] ?? '';
$to = $request->getQueryParams()['to'] ?? '';
diff --git a/app/Http/RequestHandlers/MessageSelect.php b/app/Http/RequestHandlers/MessageSelect.php
index d314823692..2bb74efef3 100644
--- a/app/Http/RequestHandlers/MessageSelect.php
+++ b/app/Http/RequestHandlers/MessageSelect.php
@@ -19,7 +19,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -36,9 +36,7 @@ class MessageSelect implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
return redirect(route(MessagePage::class, [
diff --git a/app/Http/RequestHandlers/ModuleAction.php b/app/Http/RequestHandlers/ModuleAction.php
index 7bc6de28bb..58f38676db 100644
--- a/app/Http/RequestHandlers/ModuleAction.php
+++ b/app/Http/RequestHandlers/ModuleAction.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\Services\ModuleService;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -59,8 +60,7 @@ class ModuleAction implements RequestHandlerInterface
{
$module_name = $request->getAttribute('module');
$action = $request->getAttribute('action');
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $user = Validator::attributes($request)->user();
// Check that the module is enabled.
// The module itself will need to check any tree-level access,
diff --git a/app/Http/RequestHandlers/NotePage.php b/app/Http/RequestHandlers/NotePage.php
index 62f3c4b8a3..024eb7a002 100644
--- a/app/Http/RequestHandlers/NotePage.php
+++ b/app/Http/RequestHandlers/NotePage.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -59,19 +59,14 @@ class NotePage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::noteFactory()->make($xref, $tree);
$record = Auth::checkNoteAccess($record, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/PasswordRequestAction.php b/app/Http/RequestHandlers/PasswordRequestAction.php
index 2960362fd3..8c99b6ce0e 100644
--- a/app/Http/RequestHandlers/PasswordRequestAction.php
+++ b/app/Http/RequestHandlers/PasswordRequestAction.php
@@ -29,6 +29,7 @@ use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\SiteUser;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -83,7 +84,7 @@ class PasswordRequestAction implements RequestHandlerInterface, StatusCodeInterf
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/PasswordRequestPage.php b/app/Http/RequestHandlers/PasswordRequestPage.php
index 4d19a8daf8..9152174571 100644
--- a/app/Http/RequestHandlers/PasswordRequestPage.php
+++ b/app/Http/RequestHandlers/PasswordRequestPage.php
@@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -44,8 +45,8 @@ class PasswordRequestPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
// Already logged in?
if ($user instanceof User) {
diff --git a/app/Http/RequestHandlers/PasswordResetAction.php b/app/Http/RequestHandlers/PasswordResetAction.php
index b60b63bc46..67804a4db5 100644
--- a/app/Http/RequestHandlers/PasswordResetAction.php
+++ b/app/Http/RequestHandlers/PasswordResetAction.php
@@ -27,6 +27,7 @@ use Fisharebest\Webtrees\Log;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -55,7 +56,7 @@ class PasswordResetAction implements RequestHandlerInterface, StatusCodeInterfac
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$token = $request->getAttribute('token');
$user = $this->user_service->findByToken($token);
diff --git a/app/Http/RequestHandlers/PasswordResetPage.php b/app/Http/RequestHandlers/PasswordResetPage.php
index 575de5fea6..20afa8af31 100644
--- a/app/Http/RequestHandlers/PasswordResetPage.php
+++ b/app/Http/RequestHandlers/PasswordResetPage.php
@@ -26,6 +26,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -58,7 +59,7 @@ class PasswordResetPage implements RequestHandlerInterface, StatusCodeInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$token = $request->getAttribute('token');
$title = I18N::translate('Set a new password');
$user = $this->user_service->findByToken($token);
diff --git a/app/Http/RequestHandlers/PasteFact.php b/app/Http/RequestHandlers/PasteFact.php
index a45b7dc77d..9c2fdad0c5 100644
--- a/app/Http/RequestHandlers/PasteFact.php
+++ b/app/Http/RequestHandlers/PasteFact.php
@@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -57,14 +57,9 @@ class PasteFact implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $params = (array) $request->getParsedBody();
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $params = (array) $request->getParsedBody();
$fact_id = $params['fact_id'];
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$record = Auth::checkRecordAccess($record, true);
diff --git a/app/Http/RequestHandlers/PendingChanges.php b/app/Http/RequestHandlers/PendingChanges.php
index bacdc2ac33..2ed1d1677d 100644
--- a/app/Http/RequestHandlers/PendingChanges.php
+++ b/app/Http/RequestHandlers/PendingChanges.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -59,8 +58,7 @@ class PendingChanges implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$n = (int) ($request->getQueryParams()['n'] ?? self::MAX_CHANGES);
diff --git a/app/Http/RequestHandlers/PendingChangesAcceptChange.php b/app/Http/RequestHandlers/PendingChangesAcceptChange.php
index bdf2b0710e..542436ee8a 100644
--- a/app/Http/RequestHandlers/PendingChangesAcceptChange.php
+++ b/app/Http/RequestHandlers/PendingChangesAcceptChange.php
@@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -53,12 +53,8 @@ class PendingChangesAcceptChange implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$change = $request->getAttribute('change');
diff --git a/app/Http/RequestHandlers/PendingChangesAcceptRecord.php b/app/Http/RequestHandlers/PendingChangesAcceptRecord.php
index e624dd27dc..2074cba16c 100644
--- a/app/Http/RequestHandlers/PendingChangesAcceptRecord.php
+++ b/app/Http/RequestHandlers/PendingChangesAcceptRecord.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
/**
@@ -53,10 +52,8 @@ class PendingChangesAcceptRecord implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref') ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
if ($record) {
diff --git a/app/Http/RequestHandlers/PendingChangesAcceptTree.php b/app/Http/RequestHandlers/PendingChangesAcceptTree.php
index 96fe760cd8..62294be4b1 100644
--- a/app/Http/RequestHandlers/PendingChangesAcceptTree.php
+++ b/app/Http/RequestHandlers/PendingChangesAcceptTree.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function response;
@@ -55,8 +54,7 @@ class PendingChangesAcceptTree implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$n = (int) ($request->getQueryParams()['n'] ?? PHP_INT_MAX);
diff --git a/app/Http/RequestHandlers/PendingChangesLogData.php b/app/Http/RequestHandlers/PendingChangesLogData.php
index 4bbbe9566a..bff8f232e3 100644
--- a/app/Http/RequestHandlers/PendingChangesLogData.php
+++ b/app/Http/RequestHandlers/PendingChangesLogData.php
@@ -25,7 +25,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\DatatablesService;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -68,9 +68,7 @@ class PendingChangesLogData implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
$params['tree'] = $tree->name();
diff --git a/app/Http/RequestHandlers/PendingChangesLogDelete.php b/app/Http/RequestHandlers/PendingChangesLogDelete.php
index 3f12d53051..af75b0c105 100644
--- a/app/Http/RequestHandlers/PendingChangesLogDelete.php
+++ b/app/Http/RequestHandlers/PendingChangesLogDelete.php
@@ -20,12 +20,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
/**
@@ -50,9 +49,7 @@ class PendingChangesLogDelete implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
$params['tree'] = $tree->name();
diff --git a/app/Http/RequestHandlers/PendingChangesLogDownload.php b/app/Http/RequestHandlers/PendingChangesLogDownload.php
index cf5c4b7df8..f3676cf14e 100644
--- a/app/Http/RequestHandlers/PendingChangesLogDownload.php
+++ b/app/Http/RequestHandlers/PendingChangesLogDownload.php
@@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
/**
@@ -51,9 +50,7 @@ class PendingChangesLogDownload implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
$params['tree'] = $tree->name();
diff --git a/app/Http/RequestHandlers/PendingChangesLogPage.php b/app/Http/RequestHandlers/PendingChangesLogPage.php
index e852d6b2f4..5d0af5c717 100644
--- a/app/Http/RequestHandlers/PendingChangesLogPage.php
+++ b/app/Http/RequestHandlers/PendingChangesLogPage.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Services\UserService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -60,12 +60,10 @@ class PendingChangesLogPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$trees = $this->tree_service->titles();
-
$users = ['' => ''];
+
foreach ($this->user_service->all() as $user) {
$user_name = $user->userName();
$users[$user_name] = $user_name;
diff --git a/app/Http/RequestHandlers/PendingChangesRejectChange.php b/app/Http/RequestHandlers/PendingChangesRejectChange.php
index 1c594b9366..4732a7929a 100644
--- a/app/Http/RequestHandlers/PendingChangesRejectChange.php
+++ b/app/Http/RequestHandlers/PendingChangesRejectChange.php
@@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -53,12 +53,8 @@ class PendingChangesRejectChange implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
$change = $request->getAttribute('change');
diff --git a/app/Http/RequestHandlers/PendingChangesRejectRecord.php b/app/Http/RequestHandlers/PendingChangesRejectRecord.php
index bbdfc93fb7..dd412f46ab 100644
--- a/app/Http/RequestHandlers/PendingChangesRejectRecord.php
+++ b/app/Http/RequestHandlers/PendingChangesRejectRecord.php
@@ -24,12 +24,11 @@ use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
/**
@@ -54,10 +53,8 @@ class PendingChangesRejectRecord implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref') ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
$record = Registry::gedcomRecordFactory()->make($xref, $tree);
if ($record instanceof GedcomRecord) {
diff --git a/app/Http/RequestHandlers/PendingChangesRejectTree.php b/app/Http/RequestHandlers/PendingChangesRejectTree.php
index e55b0d7cba..de19547ca2 100644
--- a/app/Http/RequestHandlers/PendingChangesRejectTree.php
+++ b/app/Http/RequestHandlers/PendingChangesRejectTree.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\PendingChangesService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function response;
@@ -53,8 +52,7 @@ class PendingChangesRejectTree implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$this->pending_changes_service->rejectTree($tree);
diff --git a/app/Http/RequestHandlers/RedirectDescendencyPhp.php b/app/Http/RequestHandlers/RedirectDescendencyPhp.php
index e81899957d..bd18fb9691 100644
--- a/app/Http/RequestHandlers/RedirectDescendencyPhp.php
+++ b/app/Http/RequestHandlers/RedirectDescendencyPhp.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
-use Fisharebest\Webtrees\Module\AncestorsChartModule;
use Fisharebest\Webtrees\Module\DescendancyChartModule;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
diff --git a/app/Http/RequestHandlers/RedirectFamilyPhp.php b/app/Http/RequestHandlers/RedirectFamilyPhp.php
index bafe1db2ea..188d0e936f 100644
--- a/app/Http/RequestHandlers/RedirectFamilyPhp.php
+++ b/app/Http/RequestHandlers/RedirectFamilyPhp.php
@@ -56,8 +56,8 @@ class RedirectFamilyPhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $famid = Validator::queryParams($request)->isXref()->requiredString('famid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $famid = Validator::queryParams($request)->isXref()->string('famid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RedirectGedRecordPhp.php b/app/Http/RequestHandlers/RedirectGedRecordPhp.php
index a7a6ee541e..8d92abd503 100644
--- a/app/Http/RequestHandlers/RedirectGedRecordPhp.php
+++ b/app/Http/RequestHandlers/RedirectGedRecordPhp.php
@@ -56,8 +56,8 @@ class RedirectGedRecordPhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $pid = Validator::queryParams($request)->isXref()->requiredString('pid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $pid = Validator::queryParams($request)->isXref()->string('pid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RedirectIndividualPhp.php b/app/Http/RequestHandlers/RedirectIndividualPhp.php
index 0c1c96a370..a2d55a6dd9 100644
--- a/app/Http/RequestHandlers/RedirectIndividualPhp.php
+++ b/app/Http/RequestHandlers/RedirectIndividualPhp.php
@@ -56,8 +56,8 @@ class RedirectIndividualPhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $pid = Validator::queryParams($request)->isXref()->requiredString('pid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $pid = Validator::queryParams($request)->isXref()->string('pid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RedirectMediaViewerPhp.php b/app/Http/RequestHandlers/RedirectMediaViewerPhp.php
index 65eb223370..b52d46bac6 100644
--- a/app/Http/RequestHandlers/RedirectMediaViewerPhp.php
+++ b/app/Http/RequestHandlers/RedirectMediaViewerPhp.php
@@ -56,8 +56,8 @@ class RedirectMediaViewerPhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $mid = Validator::queryParams($request)->isXref()->requiredString('mid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $mid = Validator::queryParams($request)->isXref()->string('mid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RedirectModulePhp.php b/app/Http/RequestHandlers/RedirectModulePhp.php
index 87f003fc42..f906f128d7 100644
--- a/app/Http/RequestHandlers/RedirectModulePhp.php
+++ b/app/Http/RequestHandlers/RedirectModulePhp.php
@@ -34,7 +34,6 @@ use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function redirect;
-use function route;
/**
* Redirect URLs created by webtrees 1.x (and PhpGedView).
diff --git a/app/Http/RequestHandlers/RedirectNotePhp.php b/app/Http/RequestHandlers/RedirectNotePhp.php
index 7006e60dcb..8117e9e73c 100644
--- a/app/Http/RequestHandlers/RedirectNotePhp.php
+++ b/app/Http/RequestHandlers/RedirectNotePhp.php
@@ -56,8 +56,8 @@ class RedirectNotePhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $nid = Validator::queryParams($request)->isXref()->requiredString('nid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $nid = Validator::queryParams($request)->isXref()->string('nid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RedirectRelationshipPhp.php b/app/Http/RequestHandlers/RedirectRelationshipPhp.php
index f88324a69c..fcd047bffb 100644
--- a/app/Http/RequestHandlers/RedirectRelationshipPhp.php
+++ b/app/Http/RequestHandlers/RedirectRelationshipPhp.php
@@ -22,7 +22,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
-use Fisharebest\Webtrees\Module\PedigreeChartModule;
use Fisharebest\Webtrees\Module\RelationshipsChartModule;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
diff --git a/app/Http/RequestHandlers/RedirectRepositoryPhp.php b/app/Http/RequestHandlers/RedirectRepositoryPhp.php
index be94daeff0..e7e1ae4a59 100644
--- a/app/Http/RequestHandlers/RedirectRepositoryPhp.php
+++ b/app/Http/RequestHandlers/RedirectRepositoryPhp.php
@@ -56,8 +56,8 @@ class RedirectRepositoryPhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $rid = Validator::queryParams($request)->isXref()->requiredString('rid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $rid = Validator::queryParams($request)->isXref()->string('rid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RedirectSourcePhp.php b/app/Http/RequestHandlers/RedirectSourcePhp.php
index e4a7410d41..29b8acfc15 100644
--- a/app/Http/RequestHandlers/RedirectSourcePhp.php
+++ b/app/Http/RequestHandlers/RedirectSourcePhp.php
@@ -56,8 +56,8 @@ class RedirectSourcePhp implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $ged = Validator::queryParams($request)->requiredString('ged');
- $sid = Validator::queryParams($request)->isXref()->requiredString('sid');
+ $ged = Validator::queryParams($request)->string('ged');
+ $sid = Validator::queryParams($request)->isXref()->string('sid');
$tree = $this->tree_service->all()->get($ged);
if ($tree instanceof Tree) {
diff --git a/app/Http/RequestHandlers/RegisterAction.php b/app/Http/RequestHandlers/RegisterAction.php
index 8da9f51591..210771e602 100644
--- a/app/Http/RequestHandlers/RegisterAction.php
+++ b/app/Http/RequestHandlers/RegisterAction.php
@@ -36,6 +36,7 @@ use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\SiteUser;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\TreeUser;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
@@ -88,7 +89,7 @@ class RegisterAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$this->checkRegistrationAllowed();
@@ -142,7 +143,7 @@ class RegisterAction implements RequestHandlerInterface
$user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '');
$user->setPreference(UserInterface::PREF_TIMESTAMP_ACTIVE, '0');
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
$reply_to = $tree instanceof Tree ? new TreeUser($tree) : new SiteUser();
$verify_url = route(VerifyEmail::class, [
@@ -258,7 +259,7 @@ class RegisterAction implements RequestHandlerInterface
throw new Exception(I18N::translate('Duplicate email address. A user with that email already exists.'));
}
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
// No external links
if (preg_match('/(?!' . preg_quote($base_url, '/') . ')(((?:http|https):\/\/)[a-zA-Z0-9.-]+)/', $comments, $match)) {
diff --git a/app/Http/RequestHandlers/RegisterPage.php b/app/Http/RequestHandlers/RegisterPage.php
index c77e2796d9..cffcae3d78 100644
--- a/app/Http/RequestHandlers/RegisterPage.php
+++ b/app/Http/RequestHandlers/RegisterPage.php
@@ -25,6 +25,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\CaptchaService;
use Fisharebest\Webtrees\Session;
use Fisharebest\Webtrees\Site;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -59,7 +60,7 @@ class RegisterPage implements RequestHandlerInterface
{
$this->checkRegistrationAllowed();
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$comments = Session::get('register_comments');
$comments = is_string($comments) ? $comments : '';
diff --git a/app/Http/RequestHandlers/RenumberTreeAction.php b/app/Http/RequestHandlers/RenumberTreeAction.php
index 24c31e094f..df3b1c3186 100644
--- a/app/Http/RequestHandlers/RenumberTreeAction.php
+++ b/app/Http/RequestHandlers/RenumberTreeAction.php
@@ -31,7 +31,7 @@ use Fisharebest\Webtrees\Repository;
use Fisharebest\Webtrees\Services\AdminService;
use Fisharebest\Webtrees\Services\TimeoutService;
use Fisharebest\Webtrees\Source;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Illuminate\Database\Query\JoinClause;
@@ -39,7 +39,6 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -69,9 +68,7 @@ class RenumberTreeAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$xrefs = $this->admin_service->duplicateXrefs($tree);
foreach ($xrefs as $old_xref => $type) {
diff --git a/app/Http/RequestHandlers/RenumberTreePage.php b/app/Http/RequestHandlers/RenumberTreePage.php
index 51929a33d8..291065be54 100644
--- a/app/Http/RequestHandlers/RenumberTreePage.php
+++ b/app/Http/RequestHandlers/RenumberTreePage.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\AdminService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
/**
@@ -56,9 +55,7 @@ class RenumberTreePage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$xrefs = $this->admin_service->duplicateXrefs($tree);
/* I18N: Renumber the records in a family tree */
diff --git a/app/Http/RequestHandlers/ReorderChildrenAction.php b/app/Http/RequestHandlers/ReorderChildrenAction.php
index ae820340af..89eecb1f29 100644
--- a/app/Http/RequestHandlers/ReorderChildrenAction.php
+++ b/app/Http/RequestHandlers/ReorderChildrenAction.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -47,12 +47,8 @@ class ReorderChildrenAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
diff --git a/app/Http/RequestHandlers/ReorderChildrenPage.php b/app/Http/RequestHandlers/ReorderChildrenPage.php
index ec0f2db19f..ff6a7b5b9b 100644
--- a/app/Http/RequestHandlers/ReorderChildrenPage.php
+++ b/app/Http/RequestHandlers/ReorderChildrenPage.php
@@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -45,12 +45,8 @@ class ReorderChildrenPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$family = Registry::familyFactory()->make($xref, $tree);
$family = Auth::checkFamilyAccess($family, true);
diff --git a/app/Http/RequestHandlers/ReorderFamiliesAction.php b/app/Http/RequestHandlers/ReorderFamiliesAction.php
index 1124285437..2efd089871 100644
--- a/app/Http/RequestHandlers/ReorderFamiliesAction.php
+++ b/app/Http/RequestHandlers/ReorderFamiliesAction.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -47,12 +47,8 @@ class ReorderFamiliesAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/ReorderFamiliesPage.php b/app/Http/RequestHandlers/ReorderFamiliesPage.php
index c8efdf3195..63633f7697 100644
--- a/app/Http/RequestHandlers/ReorderFamiliesPage.php
+++ b/app/Http/RequestHandlers/ReorderFamiliesPage.php
@@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -45,16 +45,11 @@ class ReorderFamiliesPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
-
- $title = $individual->fullName() . ' — ' . I18N::translate('Re-order families');
+ $title = $individual->fullName() . ' — ' . I18N::translate('Re-order families');
return $this->viewResponse('edit/reorder-families', [
'famc_facts' => $individual->facts(['FAMC']),
diff --git a/app/Http/RequestHandlers/ReorderMediaAction.php b/app/Http/RequestHandlers/ReorderMediaAction.php
index 5afbfb6cc6..f0546c70a4 100644
--- a/app/Http/RequestHandlers/ReorderMediaAction.php
+++ b/app/Http/RequestHandlers/ReorderMediaAction.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -31,7 +31,6 @@ use function array_search;
use function assert;
use function implode;
use function is_array;
-use function is_string;
use function redirect;
use function uksort;
@@ -47,16 +46,11 @@ class ReorderMediaAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
-
- $params = (array) $request->getParsedBody();
+ $params = (array) $request->getParsedBody();
$order = $params['order'];
assert(is_array($order));
diff --git a/app/Http/RequestHandlers/ReorderMediaPage.php b/app/Http/RequestHandlers/ReorderMediaPage.php
index 01c005a92d..aae6779e23 100644
--- a/app/Http/RequestHandlers/ReorderMediaPage.php
+++ b/app/Http/RequestHandlers/ReorderMediaPage.php
@@ -23,14 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
-
/**
* Reorder the media of an individual.
*/
@@ -45,16 +42,11 @@ class ReorderMediaPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
-
- $title = $individual->fullName() . ' — ' . I18N::translate('Re-order media');
+ $title = $individual->fullName() . ' — ' . I18N::translate('Re-order media');
return $this->viewResponse('edit/reorder-media', [
'individual' => $individual,
diff --git a/app/Http/RequestHandlers/ReorderNamesAction.php b/app/Http/RequestHandlers/ReorderNamesAction.php
index 285e30721b..39623aa5c1 100644
--- a/app/Http/RequestHandlers/ReorderNamesAction.php
+++ b/app/Http/RequestHandlers/ReorderNamesAction.php
@@ -21,7 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -47,12 +47,8 @@ class ReorderNamesAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
diff --git a/app/Http/RequestHandlers/ReorderNamesPage.php b/app/Http/RequestHandlers/ReorderNamesPage.php
index f89815f42e..b795490004 100644
--- a/app/Http/RequestHandlers/ReorderNamesPage.php
+++ b/app/Http/RequestHandlers/ReorderNamesPage.php
@@ -23,14 +23,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
-
/**
* Reorder the names of an individual.
*/
@@ -45,16 +42,11 @@ class ReorderNamesPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, true);
-
- $title = $individual->fullName() . ' — ' . I18N::translate('Re-order names');
+ $title = $individual->fullName() . ' — ' . I18N::translate('Re-order names');
return $this->viewResponse('edit/reorder-names', [
'individual' => $individual,
diff --git a/app/Http/RequestHandlers/ReportGenerate.php b/app/Http/RequestHandlers/ReportGenerate.php
index 0d7a52e457..652cd6ac84 100644
--- a/app/Http/RequestHandlers/ReportGenerate.php
+++ b/app/Http/RequestHandlers/ReportGenerate.php
@@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
@@ -30,13 +29,12 @@ use Fisharebest\Webtrees\Report\HtmlRenderer;
use Fisharebest\Webtrees\Report\PdfRenderer;
use Fisharebest\Webtrees\Report\ReportParserGenerate;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function addcslashes;
-use function assert;
use function ob_get_clean;
use function ob_start;
use function redirect;
@@ -71,15 +69,12 @@ class ReportGenerate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$data_filesystem = Registry::filesystem()->data();
- $report = $request->getAttribute('report');
+ $report = Validator::attributes($request)->string('report');
$module = $this->module_service->findByName($report);
if (!$module instanceof ModuleReportInterface) {
diff --git a/app/Http/RequestHandlers/ReportListAction.php b/app/Http/RequestHandlers/ReportListAction.php
index 4e39aae663..cc2fe86b2e 100644
--- a/app/Http/RequestHandlers/ReportListAction.php
+++ b/app/Http/RequestHandlers/ReportListAction.php
@@ -20,15 +20,13 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -58,11 +56,8 @@ class ReportListAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/ReportListPage.php b/app/Http/RequestHandlers/ReportListPage.php
index 5c6c834815..d47327e009 100644
--- a/app/Http/RequestHandlers/ReportListPage.php
+++ b/app/Http/RequestHandlers/ReportListPage.php
@@ -19,18 +19,15 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Show all available reports.
*/
@@ -59,11 +56,8 @@ class ReportListPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$reports = $this->module_service
->findByComponent(ModuleReportInterface::class, $tree, $user);
diff --git a/app/Http/RequestHandlers/ReportSetupAction.php b/app/Http/RequestHandlers/ReportSetupAction.php
index 33f1f77fbf..2a2342f0a5 100644
--- a/app/Http/RequestHandlers/ReportSetupAction.php
+++ b/app/Http/RequestHandlers/ReportSetupAction.php
@@ -20,16 +20,14 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -59,13 +57,10 @@ class ReportSetupAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
-
- $report = $request->getAttribute('report');
+ $report = Validator::attributes($request)->string('report');
$module = $this->module_service->findByName($report);
if (!$module instanceof ModuleReportInterface) {
diff --git a/app/Http/RequestHandlers/ReportSetupPage.php b/app/Http/RequestHandlers/ReportSetupPage.php
index 0890abc838..88d0bb9a23 100644
--- a/app/Http/RequestHandlers/ReportSetupPage.php
+++ b/app/Http/RequestHandlers/ReportSetupPage.php
@@ -20,7 +20,6 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Html;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
@@ -29,12 +28,11 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Report\ReportParserSetup;
use Fisharebest\Webtrees\Services\LocalizationService;
use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -68,13 +66,10 @@ class ReportSetupPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
-
- $report = $request->getAttribute('report');
+ $report = Validator::attributes($request)->string('report');
$module = $this->module_service->findByName($report);
if (!$module instanceof ModuleReportInterface) {
diff --git a/app/Http/RequestHandlers/RepositoryPage.php b/app/Http/RequestHandlers/RepositoryPage.php
index 886c8b287b..ef919ac534 100644
--- a/app/Http/RequestHandlers/RepositoryPage.php
+++ b/app/Http/RequestHandlers/RepositoryPage.php
@@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -59,19 +57,14 @@ class RepositoryPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::repositoryFactory()->make($xref, $tree);
$record = Auth::checkRepositoryAccess($record, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/RobotsTxt.php b/app/Http/RequestHandlers/RobotsTxt.php
index 71f01eed4c..318e4e125d 100644
--- a/app/Http/RequestHandlers/RobotsTxt.php
+++ b/app/Http/RequestHandlers/RobotsTxt.php
@@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\Middleware\BadBotBlocker;
use Fisharebest\Webtrees\Module\SiteMapModule;
use Fisharebest\Webtrees\Services\ModuleService;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -62,7 +63,7 @@ class RobotsTxt implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
$data = [
'bad_user_agents' => BadBotBlocker::BAD_ROBOTS,
diff --git a/app/Http/RequestHandlers/SearchAdvancedAction.php b/app/Http/RequestHandlers/SearchAdvancedAction.php
index 20c4213f2f..ed36a74803 100644
--- a/app/Http/RequestHandlers/SearchAdvancedAction.php
+++ b/app/Http/RequestHandlers/SearchAdvancedAction.php
@@ -19,13 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Search for genealogy data
*/
@@ -40,11 +38,8 @@ class SearchAdvancedAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $params = (array) $request->getParsedBody();
-
+ $tree = Validator::attributes($request)->tree();
+ $params = (array) $request->getParsedBody();
$fields = $params['fields'] ?? [];
$modifiers = $params['modifiers'] ?? [];
$other_field = $params['other_field'] ?? '';
diff --git a/app/Http/RequestHandlers/SearchAdvancedPage.php b/app/Http/RequestHandlers/SearchAdvancedPage.php
index d563570536..e24a0e7cdd 100644
--- a/app/Http/RequestHandlers/SearchAdvancedPage.php
+++ b/app/Http/RequestHandlers/SearchAdvancedPage.php
@@ -23,7 +23,7 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\SearchService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -33,7 +33,6 @@ use function array_fill_keys;
use function array_filter;
use function array_key_exists;
use function array_merge;
-use function assert;
use function strtr;
/**
@@ -142,8 +141,7 @@ class SearchAdvancedPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$default_fields = array_fill_keys(self::DEFAULT_ADVANCED_FIELDS, '');
diff --git a/app/Http/RequestHandlers/SearchGeneralAction.php b/app/Http/RequestHandlers/SearchGeneralAction.php
index 3bd0d7af95..c0769ed7a1 100644
--- a/app/Http/RequestHandlers/SearchGeneralAction.php
+++ b/app/Http/RequestHandlers/SearchGeneralAction.php
@@ -19,13 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Search for genealogy data
*/
@@ -40,8 +38,7 @@ class SearchGeneralAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/SearchGeneralPage.php b/app/Http/RequestHandlers/SearchGeneralPage.php
index b5606357e2..b45b5b7381 100644
--- a/app/Http/RequestHandlers/SearchGeneralPage.php
+++ b/app/Http/RequestHandlers/SearchGeneralPage.php
@@ -29,13 +29,13 @@ use Fisharebest\Webtrees\Services\SearchService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function preg_replace;
use function redirect;
use function trim;
@@ -74,8 +74,7 @@ class SearchGeneralPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
$query = $params['query'] ?? '';
diff --git a/app/Http/RequestHandlers/SearchPhoneticAction.php b/app/Http/RequestHandlers/SearchPhoneticAction.php
index e3f14e4b26..6c0125a169 100644
--- a/app/Http/RequestHandlers/SearchPhoneticAction.php
+++ b/app/Http/RequestHandlers/SearchPhoneticAction.php
@@ -19,13 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Search for genealogy data
*/
@@ -40,8 +38,7 @@ class SearchPhoneticAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/SearchPhoneticPage.php b/app/Http/RequestHandlers/SearchPhoneticPage.php
index 9f34382507..33036a29a3 100644
--- a/app/Http/RequestHandlers/SearchPhoneticPage.php
+++ b/app/Http/RequestHandlers/SearchPhoneticPage.php
@@ -25,13 +25,12 @@ use Fisharebest\Webtrees\Services\SearchService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Search for (and optionally replace) genealogy data
*/
@@ -64,8 +63,7 @@ class SearchPhoneticPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
$firstname = $params['firstname'] ?? '';
diff --git a/app/Http/RequestHandlers/SearchQuickAction.php b/app/Http/RequestHandlers/SearchQuickAction.php
index 8c2c271dac..dd76d25e58 100644
--- a/app/Http/RequestHandlers/SearchQuickAction.php
+++ b/app/Http/RequestHandlers/SearchQuickAction.php
@@ -21,12 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -44,8 +43,7 @@ class SearchQuickAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/SearchReplaceAction.php b/app/Http/RequestHandlers/SearchReplaceAction.php
index a063590b5f..6221cb3b6c 100644
--- a/app/Http/RequestHandlers/SearchReplaceAction.php
+++ b/app/Http/RequestHandlers/SearchReplaceAction.php
@@ -25,14 +25,12 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\SearchService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Search and replace genealogy data
*/
@@ -61,9 +59,7 @@ class SearchReplaceAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$search = $params['search'] ?? '';
$replace = $params['replace'] ?? '';
diff --git a/app/Http/RequestHandlers/SearchReplacePage.php b/app/Http/RequestHandlers/SearchReplacePage.php
index 6d5e305dd4..62322b4836 100644
--- a/app/Http/RequestHandlers/SearchReplacePage.php
+++ b/app/Http/RequestHandlers/SearchReplacePage.php
@@ -21,13 +21,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Search and replace genealogy data
*/
@@ -44,12 +42,9 @@ class SearchReplacePage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = $request->getQueryParams();
-
- $title = I18N::translate('Search and replace');
+ $title = I18N::translate('Search and replace');
return $this->viewResponse('search-replace-page', [
'context' => $params['context'] ?? 'all',
diff --git a/app/Http/RequestHandlers/SelectDefaultTree.php b/app/Http/RequestHandlers/SelectDefaultTree.php
index 3c68d2a55e..f0062f215d 100644
--- a/app/Http/RequestHandlers/SelectDefaultTree.php
+++ b/app/Http/RequestHandlers/SelectDefaultTree.php
@@ -23,12 +23,11 @@ use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Site;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function redirect;
use function route;
@@ -45,8 +44,7 @@ class SelectDefaultTree implements RequestHandlerInterface, StatusCodeInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
Site::setPreference('DEFAULT_GEDCOM', $tree->name());
diff --git a/app/Http/RequestHandlers/SelectLanguage.php b/app/Http/RequestHandlers/SelectLanguage.php
index af6f88326b..0eaa361266 100644
--- a/app/Http/RequestHandlers/SelectLanguage.php
+++ b/app/Http/RequestHandlers/SelectLanguage.php
@@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Session;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,8 +42,7 @@ class SelectLanguage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $user = Validator::attributes($request)->user();
$language = $request->getAttribute('language');
assert(is_string($language));
diff --git a/app/Http/RequestHandlers/SelectNewFact.php b/app/Http/RequestHandlers/SelectNewFact.php
index 449cada6a5..be2590a298 100644
--- a/app/Http/RequestHandlers/SelectNewFact.php
+++ b/app/Http/RequestHandlers/SelectNewFact.php
@@ -19,7 +19,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -40,12 +40,8 @@ class SelectNewFact implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$params = (array) $request->getParsedBody();
$fact = $params['fact'];
diff --git a/app/Http/RequestHandlers/SelectTheme.php b/app/Http/RequestHandlers/SelectTheme.php
index 9ca1b35bd7..88ba9dbf1b 100644
--- a/app/Http/RequestHandlers/SelectTheme.php
+++ b/app/Http/RequestHandlers/SelectTheme.php
@@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Session;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,8 +42,7 @@ class SelectTheme implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $user = Validator::attributes($request)->user();
$theme = $request->getAttribute('theme');
assert(is_string($theme));
diff --git a/app/Http/RequestHandlers/SetupWizard.php b/app/Http/RequestHandlers/SetupWizard.php
index 25136cebac..2da653ebc4 100644
--- a/app/Http/RequestHandlers/SetupWizard.php
+++ b/app/Http/RequestHandlers/SetupWizard.php
@@ -35,6 +35,7 @@ use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\ServerCheckService;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Session;
+use Fisharebest\Webtrees\Validator;
use Fisharebest\Webtrees\Webtrees;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
@@ -130,15 +131,14 @@ class SetupWizard implements RequestHandlerInterface
Registry::cache(new CacheFactory());
// We will need an IP address for the logs.
- $ip_address = $request->getServerParams()['REMOTE_ADDR'] ?? '127.0.0.1';
- $request = $request->withAttribute('client-ip', $ip_address);
+ $ip_address = Validator::serverParams($request)->string('REMOTE_ADDR', '127.0.0.1');
+ $request = $request->withAttribute('client-ip', $ip_address);
app()->instance(ServerRequestInterface::class, $request);
$data = $this->userData($request);
- $params = (array) $request->getParsedBody();
- $step = (int) ($params['step'] ?? '1');
+ $step = Validator::parsedBody($request)->integer('step', 1);
$locales = $this->module_service
->setupLanguages()
diff --git a/app/Http/RequestHandlers/SourcePage.php b/app/Http/RequestHandlers/SourcePage.php
index 11fcacc09d..4349a22af2 100644
--- a/app/Http/RequestHandlers/SourcePage.php
+++ b/app/Http/RequestHandlers/SourcePage.php
@@ -24,13 +24,11 @@ use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ClipboardService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -59,19 +57,14 @@ class SourcePage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::sourceFactory()->make($xref, $tree);
$record = Auth::checkSourceAccess($record, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/SubmissionPage.php b/app/Http/RequestHandlers/SubmissionPage.php
index 3d90a651ea..146b4bff62 100644
--- a/app/Http/RequestHandlers/SubmissionPage.php
+++ b/app/Http/RequestHandlers/SubmissionPage.php
@@ -23,7 +23,7 @@ use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -47,19 +47,14 @@ class SubmissionPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::submissionFactory()->make($xref, $tree);
$record = Auth::checkSubmissionAccess($record, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/SubmitterPage.php b/app/Http/RequestHandlers/SubmitterPage.php
index b778e93352..1287b4d758 100644
--- a/app/Http/RequestHandlers/SubmitterPage.php
+++ b/app/Http/RequestHandlers/SubmitterPage.php
@@ -23,14 +23,12 @@ use Fig\Http\Message\StatusCodeInterface;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-use function is_string;
use function redirect;
/**
@@ -47,19 +45,14 @@ class SubmitterPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $slug = Validator::attributes($request)->string('slug', '');
$record = Registry::submitterFactory()->make($xref, $tree);
$record = Auth::checkSubmitterAccess($record, false);
// Redirect to correct xref/slug
- $slug = Registry::slugFactory()->make($record);
-
- if ($record->xref() !== $xref || $request->getAttribute('slug') !== $slug) {
+ if ($record->xref() !== $xref || Registry::slugFactory()->make($record) !== $slug) {
return redirect($record->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY);
}
diff --git a/app/Http/RequestHandlers/SynchronizeTrees.php b/app/Http/RequestHandlers/SynchronizeTrees.php
index df22977b5c..bd1c2fd506 100644
--- a/app/Http/RequestHandlers/SynchronizeTrees.php
+++ b/app/Http/RequestHandlers/SynchronizeTrees.php
@@ -45,6 +45,8 @@ class SynchronizeTrees implements RequestHandlerInterface
{
private AdminService $admin_service;
+ private StreamFactoryInterface $stream_factory;
+
private TimeoutService $timeout_service;
private TreeService $tree_service;
@@ -53,15 +55,18 @@ class SynchronizeTrees implements RequestHandlerInterface
* AdminTreesController constructor.
*
* @param AdminService $admin_service
+ * @param StreamFactoryInterface $stream_factory
* @param TimeoutService $timeout_service
* @param TreeService $tree_service
*/
public function __construct(
AdminService $admin_service,
+ StreamFactoryInterface $stream_factory,
TimeoutService $timeout_service,
TreeService $tree_service
) {
$this->admin_service = $admin_service;
+ $this->stream_factory = $stream_factory;
$this->timeout_service = $timeout_service;
$this->tree_service = $tree_service;
}
@@ -86,7 +91,7 @@ class SynchronizeTrees implements RequestHandlerInterface
if ($tree->getPreference('filemtime') !== $filemtime) {
$resource = $data_filesystem->readStream($gedcom_file);
- $stream = app(StreamFactoryInterface::class)->createStreamFromResource($resource);
+ $stream = $this->stream_factory->createStreamFromResource($resource);
$this->tree_service->importGedcomFile($tree, $stream, $gedcom_file, '');
$stream->close();
$tree->setPreference('filemtime', $filemtime);
diff --git a/app/Http/RequestHandlers/TreePage.php b/app/Http/RequestHandlers/TreePage.php
index ebcb5b81a2..59fac2bda8 100644
--- a/app/Http/RequestHandlers/TreePage.php
+++ b/app/Http/RequestHandlers/TreePage.php
@@ -19,11 +19,10 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\Expression;
@@ -31,7 +30,6 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
/**
@@ -58,11 +56,8 @@ class TreePage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$has_blocks = DB::table('block')
->where('gedcom_id', '=', $tree->id())
diff --git a/app/Http/RequestHandlers/TreePageBlock.php b/app/Http/RequestHandlers/TreePageBlock.php
index cf12db600a..56d190fcf4 100644
--- a/app/Http/RequestHandlers/TreePageBlock.php
+++ b/app/Http/RequestHandlers/TreePageBlock.php
@@ -21,13 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
use function view;
@@ -53,9 +52,7 @@ class TreePageBlock implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$block_id = $request->getQueryParams()['block_id'];
$block_id = (int) DB::table('block')
diff --git a/app/Http/RequestHandlers/TreePageBlockEdit.php b/app/Http/RequestHandlers/TreePageBlockEdit.php
index 79cf8086eb..256b796210 100644
--- a/app/Http/RequestHandlers/TreePageBlockEdit.php
+++ b/app/Http/RequestHandlers/TreePageBlockEdit.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -54,17 +53,17 @@ class TreePageBlockEdit implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $block_id = Validator::attributes($request)->integer('block_id');
- $block_id = (int) $request->getQueryParams()['block_id'];
- $block = $this->home_page_service->treeBlock($request);
- $title = $block->title() . ' — ' . I18N::translate('Preferences');
+ $block = $this->home_page_service->treeBlock($request);
+ $title = $block->title() . ' — ' . I18N::translate('Preferences');
return $this->viewResponse('modules/edit-block-config', [
'block' => $block,
'block_id' => $block_id,
'cancel_url' => route(TreePage::class, ['tree' => $tree->name()]),
+ 'save_url' => route(TreePageBlockUpdate::class, ['tree' => $tree->name(), 'block_id' => $block_id]),
'title' => $title,
'tree' => $tree,
]);
diff --git a/app/Http/RequestHandlers/TreePageBlockUpdate.php b/app/Http/RequestHandlers/TreePageBlockUpdate.php
index 5973f8fda6..0839ddfdcc 100644
--- a/app/Http/RequestHandlers/TreePageBlockUpdate.php
+++ b/app/Http/RequestHandlers/TreePageBlockUpdate.php
@@ -20,12 +20,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -51,11 +50,10 @@ class TreePageBlockUpdate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $block_id = Validator::attributes($request)->integer('block_id');
- $block = $this->home_page_service->treeBlock($request);
- $block_id = (int) $request->getQueryParams()['block_id'];
+ $block = $this->home_page_service->treeBlock($request);
$block->saveBlockConfiguration($request, $block_id);
diff --git a/app/Http/RequestHandlers/TreePageEdit.php b/app/Http/RequestHandlers/TreePageEdit.php
index 5bfd2ef106..8fd3d0d58b 100644
--- a/app/Http/RequestHandlers/TreePageEdit.php
+++ b/app/Http/RequestHandlers/TreePageEdit.php
@@ -19,17 +19,15 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -56,11 +54,8 @@ class TreePageEdit implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$main_blocks = $this->home_page_service->treeBlocks($tree, $user, ModuleBlockInterface::MAIN_BLOCKS);
$side_blocks = $this->home_page_service->treeBlocks($tree, $user, ModuleBlockInterface::SIDE_BLOCKS);
diff --git a/app/Http/RequestHandlers/TreePageUpdate.php b/app/Http/RequestHandlers/TreePageUpdate.php
index 1717c9ec3a..03ef0c8c1c 100644
--- a/app/Http/RequestHandlers/TreePageUpdate.php
+++ b/app/Http/RequestHandlers/TreePageUpdate.php
@@ -19,16 +19,15 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -54,11 +53,8 @@ class TreePageUpdate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/TreePreferencesAction.php b/app/Http/RequestHandlers/TreePreferencesAction.php
index ff2d2fc662..7ba0237a2d 100644
--- a/app/Http/RequestHandlers/TreePreferencesAction.php
+++ b/app/Http/RequestHandlers/TreePreferencesAction.php
@@ -22,7 +22,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use PDOException;
use Psr\Http\Message\ResponseInterface;
@@ -30,7 +30,6 @@ use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function array_unique;
-use function assert;
use function e;
use function implode;
use function preg_replace;
@@ -50,9 +49,7 @@ class TreePreferencesAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
// For backwards compatibility with webtrees 1.x we store the two calendar formats in one variable
diff --git a/app/Http/RequestHandlers/TreePreferencesPage.php b/app/Http/RequestHandlers/TreePreferencesPage.php
index 7448a87e78..1a9fb0226f 100644
--- a/app/Http/RequestHandlers/TreePreferencesPage.php
+++ b/app/Http/RequestHandlers/TreePreferencesPage.php
@@ -32,14 +32,13 @@ use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\SurnameTradition;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function app;
-use function assert;
use function e;
use function explode;
use function in_array;
@@ -76,9 +75,7 @@ class TreePreferencesPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$data_folder = Registry::filesystem()->dataName();
$french_calendar_start = new Date('22 SEP 1792');
@@ -161,7 +158,7 @@ class TreePreferencesPage implements RequestHandlerInterface
$title = I18N::translate('Preferences') . ' — ' . e($tree->title());
- $base_url = app(ServerRequestInterface::class)->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
return $this->viewResponse('admin/trees-preferences', [
'all_family_facts' => $all_family_facts,
diff --git a/app/Http/RequestHandlers/TreePrivacyAction.php b/app/Http/RequestHandlers/TreePrivacyAction.php
index 680e26e154..2d599497d1 100644
--- a/app/Http/RequestHandlers/TreePrivacyAction.php
+++ b/app/Http/RequestHandlers/TreePrivacyAction.php
@@ -21,13 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function e;
use function redirect;
use function route;
@@ -44,9 +43,7 @@ class TreePrivacyAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$delete_default_resn_id = $params['delete'] ?? [];
diff --git a/app/Http/RequestHandlers/TreePrivacyPage.php b/app/Http/RequestHandlers/TreePrivacyPage.php
index 5c514bfcaa..6867d0f4dc 100644
--- a/app/Http/RequestHandlers/TreePrivacyPage.php
+++ b/app/Http/RequestHandlers/TreePrivacyPage.php
@@ -27,13 +27,13 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function array_merge;
-use function assert;
use function e;
use function in_array;
use function uasort;
@@ -61,9 +61,7 @@ class TreePrivacyPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$title = e($tree->name()) . ' — ' . I18N::translate('Privacy');
$all_tags = $this->tagsForPrivacy();
$privacy_constants = $this->privacyConstants();
diff --git a/app/Http/RequestHandlers/UnconnectedAction.php b/app/Http/RequestHandlers/UnconnectedAction.php
index 762e9c574c..fef5e37a33 100644
--- a/app/Http/RequestHandlers/UnconnectedAction.php
+++ b/app/Http/RequestHandlers/UnconnectedAction.php
@@ -19,13 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Find groups of unrelated individuals.
*/
@@ -40,8 +38,7 @@ class UnconnectedAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
diff --git a/app/Http/RequestHandlers/UnconnectedPage.php b/app/Http/RequestHandlers/UnconnectedPage.php
index 15832fc198..26b680c71d 100644
--- a/app/Http/RequestHandlers/UnconnectedPage.php
+++ b/app/Http/RequestHandlers/UnconnectedPage.php
@@ -24,14 +24,12 @@ use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
-use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function strtolower;
/**
@@ -48,12 +46,8 @@ class UnconnectedPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof User);
-
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$aliases = (bool) ($request->getQueryParams()['aliases'] ?? false);
$associates = (bool) ($request->getQueryParams()['associates'] ?? false);
diff --git a/app/Http/RequestHandlers/UserEditAction.php b/app/Http/RequestHandlers/UserEditAction.php
index 10792e6483..2341fbe981 100644
--- a/app/Http/RequestHandlers/UserEditAction.php
+++ b/app/Http/RequestHandlers/UserEditAction.php
@@ -29,6 +29,7 @@ use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\SiteUser;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -70,7 +71,7 @@ class UserEditAction implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
@@ -100,7 +101,7 @@ class UserEditAction implements RequestHandlerInterface
if ($approved && $edit_user->getPreference(UserInterface::PREF_IS_ACCOUNT_APPROVED) !== '1') {
I18N::init($edit_user->getPreference(UserInterface::PREF_LANGUAGE));
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
$this->email_service->send(
new SiteUser(),
diff --git a/app/Http/RequestHandlers/UserListData.php b/app/Http/RequestHandlers/UserListData.php
index a4a3691dc1..ec1307630e 100644
--- a/app/Http/RequestHandlers/UserListData.php
+++ b/app/Http/RequestHandlers/UserListData.php
@@ -26,6 +26,7 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\DatatablesService;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\UserService;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\JoinClause;
use Psr\Http\Message\ResponseInterface;
@@ -69,7 +70,7 @@ class UserListData implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
$languages = $this->module_service->findByInterface(ModuleLanguageInterface::class, true)
->mapWithKeys(static function (ModuleLanguageInterface $module): array {
diff --git a/app/Http/RequestHandlers/UserListPage.php b/app/Http/RequestHandlers/UserListPage.php
index 5868b3bf32..caa28c9230 100644
--- a/app/Http/RequestHandlers/UserListPage.php
+++ b/app/Http/RequestHandlers/UserListPage.php
@@ -21,6 +21,7 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -41,7 +42,7 @@ class UserListPage implements RequestHandlerInterface
{
$this->layout = 'layouts/administration';
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
$params = $request->getQueryParams();
$filter = $params['filter'] ?? '';
diff --git a/app/Http/RequestHandlers/UserPage.php b/app/Http/RequestHandlers/UserPage.php
index 45ba45323d..b82eebe31b 100644
--- a/app/Http/RequestHandlers/UserPage.php
+++ b/app/Http/RequestHandlers/UserPage.php
@@ -19,12 +19,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\Expression;
@@ -32,8 +31,6 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
-
/**
* Show a user's page.
*/
@@ -58,11 +55,8 @@ class UserPage implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$has_blocks = DB::table('block')
->where('user_id', '=', $user->id())
diff --git a/app/Http/RequestHandlers/UserPageBlock.php b/app/Http/RequestHandlers/UserPageBlock.php
index 5ee708e1cb..ad3fa9cbf5 100644
--- a/app/Http/RequestHandlers/UserPageBlock.php
+++ b/app/Http/RequestHandlers/UserPageBlock.php
@@ -21,13 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function response;
use function view;
@@ -54,10 +53,8 @@ class UserPageBlock implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$block_id = $request->getQueryParams()['block_id'];
$block_id = (int) DB::table('block')
diff --git a/app/Http/RequestHandlers/UserPageBlockEdit.php b/app/Http/RequestHandlers/UserPageBlockEdit.php
index 4cb6712e54..d526bd7c82 100644
--- a/app/Http/RequestHandlers/UserPageBlockEdit.php
+++ b/app/Http/RequestHandlers/UserPageBlockEdit.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -54,18 +53,18 @@ class UserPageBlockEdit implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $block_id = Validator::attributes($request)->integer('block_id');
- $user = $request->getAttribute('user');
- $block_id = (int) $request->getQueryParams()['block_id'];
- $block = $this->home_page_service->userBlock($request, $user);
- $title = $block->title() . ' — ' . I18N::translate('Preferences');
+ $block = $this->home_page_service->userBlock($request, $user);
+ $title = $block->title() . ' — ' . I18N::translate('Preferences');
return $this->viewResponse('modules/edit-block-config', [
'block' => $block,
'block_id' => $block_id,
'cancel_url' => route(UserPage::class, ['tree' => $tree->name()]),
+ 'save_url' => route(UserPageBlockUpdate::class, ['tree' => $tree->name(), 'block_id' => $block_id]),
'title' => $title,
'tree' => $tree,
]);
diff --git a/app/Http/RequestHandlers/UserPageBlockUpdate.php b/app/Http/RequestHandlers/UserPageBlockUpdate.php
index 8c42280a08..8878cb10f3 100644
--- a/app/Http/RequestHandlers/UserPageBlockUpdate.php
+++ b/app/Http/RequestHandlers/UserPageBlockUpdate.php
@@ -20,12 +20,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -51,13 +50,11 @@ class UserPageBlockUpdate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- $block = $this->home_page_service->userBlock($request, $user);
- $block_id = (int) $request->getQueryParams()['block_id'];
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $block_id = Validator::attributes($request)->integer('block_id');
+ $block = $this->home_page_service->userBlock($request, $user);
$block->saveBlockConfiguration($request, $block_id);
return redirect(route(UserPage::class, ['tree' => $tree->name()]));
diff --git a/app/Http/RequestHandlers/UserPageEdit.php b/app/Http/RequestHandlers/UserPageEdit.php
index f7378c16ae..bf468cb82d 100644
--- a/app/Http/RequestHandlers/UserPageEdit.php
+++ b/app/Http/RequestHandlers/UserPageEdit.php
@@ -19,17 +19,15 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function route;
/**
@@ -56,13 +54,8 @@ class UserPageEdit implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$main_blocks = $this->home_page_service->userBlocks($tree, $user, ModuleBlockInterface::MAIN_BLOCKS);
$side_blocks = $this->home_page_service->userBlocks($tree, $user, ModuleBlockInterface::SIDE_BLOCKS);
$all_blocks = $this->home_page_service->availableUserBlocks($tree, $user);
diff --git a/app/Http/RequestHandlers/UserPageUpdate.php b/app/Http/RequestHandlers/UserPageUpdate.php
index 73b30a2ab7..815d4fb1a8 100644
--- a/app/Http/RequestHandlers/UserPageUpdate.php
+++ b/app/Http/RequestHandlers/UserPageUpdate.php
@@ -19,16 +19,15 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\RequestHandlers;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Services\HomePageService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
-use function assert;
use function redirect;
use function route;
@@ -54,11 +53,8 @@ class UserPageUpdate implements RequestHandlerInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
$defaults = (bool) ($params['defaults'] ?? false);
diff --git a/app/Http/RequestHandlers/VerifyEmail.php b/app/Http/RequestHandlers/VerifyEmail.php
index f0a9900078..0257842ad1 100644
--- a/app/Http/RequestHandlers/VerifyEmail.php
+++ b/app/Http/RequestHandlers/VerifyEmail.php
@@ -28,6 +28,7 @@ use Fisharebest\Webtrees\Services\EmailService;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\SiteUser;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -66,7 +67,7 @@ class VerifyEmail implements RequestHandlerInterface
public function handle(ServerRequestInterface $request): ResponseInterface
{
$token = $request->getAttribute('token');
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
$username = $request->getAttribute('username');
$title = I18N::translate('User verification');
@@ -80,7 +81,7 @@ class VerifyEmail implements RequestHandlerInterface
// switch language to administrator settings
I18N::init($administrator->getPreference(UserInterface::PREF_LANGUAGE));
- $base_url = $request->getAttribute('base_url');
+ $base_url = Validator::attributes($request)->string('base_url');
/* I18N: %s is a server name/URL */
$subject = I18N::translate('New user at %s', $base_url);
diff --git a/app/Http/Routes/WebRoutes.php b/app/Http/Routes/WebRoutes.php
index 86d45cd8d4..3e3033ff55 100644
--- a/app/Http/Routes/WebRoutes.php
+++ b/app/Http/Routes/WebRoutes.php
@@ -505,8 +505,8 @@ class WebRoutes
$router->get(TreePageEdit::class, '/tree-page-edit');
$router->post(GedcomLoad::class, '/load');
$router->post(TreePageUpdate::class, '/tree-page-update');
- $router->get(TreePageBlockEdit::class, '/tree-page-block-edit');
- $router->post(TreePageBlockUpdate::class, '/tree-page-block-edit');
+ $router->get(TreePageBlockEdit::class, '/tree-page-block-edit/{block_id}');
+ $router->post(TreePageBlockUpdate::class, '/tree-page-block-update/{block_id}');
$router->get(TreePrivacyPage::class, '/privacy');
$router->post(TreePrivacyAction::class, '/privacy');
$router->get(UnconnectedPage::class, '/unconnected');
@@ -624,8 +624,8 @@ class WebRoutes
$router->get(UserPageBlock::class, '/my-page-block');
$router->get(UserPageEdit::class, '/my-page-edit');
$router->post(UserPageUpdate::class, '/my-page-edit');
- $router->get(UserPageBlockEdit::class, '/my-page-block-edit');
- $router->post(UserPageBlockUpdate::class, '/my-page-block-edit');
+ $router->get(UserPageBlockEdit::class, '/my-page-block-edit/{block_id}');
+ $router->post(UserPageBlockUpdate::class, '/my-page-block-edit/{block_id}');
});
// User routes without a tree.
diff --git a/app/Log.php b/app/Log.php
index bcf4cef50b..4da3c8dde5 100644
--- a/app/Log.php
+++ b/app/Log.php
@@ -59,8 +59,10 @@ class Log
private static function addLog(string $message, string $log_type, Tree $tree = null): void
{
if (app()->has(ServerRequestInterface::class)) {
- $request = app(ServerRequestInterface::class);
- $ip_address = $request->getAttribute('client-ip');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $ip_address = Validator::attributes($request)->string('client-ip');
} else {
$ip_address = '127.0.0.1';
}
diff --git a/app/Module/AncestorsChartModule.php b/app/Module/AncestorsChartModule.php
index 2954f38fc1..facbd0c9d2 100644
--- a/app/Module/AncestorsChartModule.php
+++ b/app/Module/AncestorsChartModule.php
@@ -22,21 +22,18 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
+use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ChartService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
-use function max;
-use function min;
use function route;
/**
@@ -53,6 +50,12 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac
public const CHART_STYLE_INDIVIDUALS = 'individuals';
public const CHART_STYLE_FAMILIES = 'families';
+ private const CHART_STYLES = [
+ self::CHART_STYLE_TREE,
+ self::CHART_STYLE_INDIVIDUALS,
+ self::CHART_STYLE_FAMILIES,
+ ];
+
// Defaults
protected const DEFAULT_GENERATIONS = '4';
protected const DEFAULT_STYLE = self::CHART_STYLE_TREE;
@@ -176,39 +179,29 @@ class AncestorsChartModule extends AbstractModule implements ModuleChartInterfac
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $ajax = $request->getQueryParams()['ajax'] ?? '';
- $generations = (int) $request->getAttribute('generations');
- $style = $request->getAttribute('style');
- $user = $request->getAttribute('user');
-
- Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
-
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $style = Validator::attributes($request)->isInArray(self::CHART_STYLES)->string('style');
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'style' => $params['style'],
- 'generations' => $params['generations'],
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ 'style' => Validator::parsedBody($request)->string('style', ''),
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
]));
}
- $generations = min($generations, self::MAXIMUM_GENERATIONS);
- $generations = max($generations, self::MINIMUM_GENERATIONS);
+ Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
+
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
$ancestors = $this->chart_service->sosaStradonitzAncestors($individual, $generations);
diff --git a/app/Module/BranchesListModule.php b/app/Module/BranchesListModule.php
index 588dc301d8..e6f822de9c 100644
--- a/app/Module/BranchesListModule.php
+++ b/app/Module/BranchesListModule.php
@@ -31,6 +31,7 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Soundex;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\JoinClause;
@@ -132,7 +133,10 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface,
*/
public function listUrl(Tree $tree, array $parameters = []): string
{
- $xref = app(ServerRequestInterface::class)->getAttribute('xref', '');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
if ($xref !== '') {
$individual = Registry::individualFactory()->make($xref, $tree);
@@ -164,7 +168,9 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface,
*/
public function getPageAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -174,11 +180,8 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface,
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
@@ -190,11 +193,11 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface,
$surname = (string) $request->getAttribute('surname');
$params = $request->getQueryParams();
- $ajax = $params['ajax'] ?? '';
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
$soundex_std = (bool) ($params['soundex_std'] ?? false);
$soundex_dm = (bool) ($params['soundex_dm'] ?? false);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
// Highlight direct-line ancestors of this individual.
diff --git a/app/Module/CensusAssistantModule.php b/app/Module/CensusAssistantModule.php
index d0384b12e9..d0b24e4b46 100644
--- a/app/Module/CensusAssistantModule.php
+++ b/app/Module/CensusAssistantModule.php
@@ -23,12 +23,11 @@ use Fisharebest\Webtrees\Census\CensusInterface;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use function array_keys;
-use function assert;
use function count;
use function e;
use function response;
@@ -86,8 +85,7 @@ class CensusAssistantModule extends AbstractModule
*/
public function postCensusIndividualAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
$individual = Registry::individualFactory()->make($params['xref'], $tree);
diff --git a/app/Module/ChartsMenuModule.php b/app/Module/ChartsMenuModule.php
index 6343102abc..03780f91ce 100644
--- a/app/Module/ChartsMenuModule.php
+++ b/app/Module/ChartsMenuModule.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
/**
@@ -86,8 +87,10 @@ class ChartsMenuModule extends AbstractModule implements ModuleMenuInterface
*/
public function getMenu(Tree $tree): ?Menu
{
- $request = app(ServerRequestInterface::class);
- $xref = $request->getAttribute('xref', '');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
$individual = $tree->significantIndividual(Auth::user(), $xref);
$submenus = $this->module_service->findByComponent(ModuleChartInterface::class, $tree, Auth::user())
->map(static function (ModuleChartInterface $module) use ($individual): Menu {
diff --git a/app/Module/ClippingsCartModule.php b/app/Module/ClippingsCartModule.php
index 4c05b16373..c860d03950 100644
--- a/app/Module/ClippingsCartModule.php
+++ b/app/Module/ClippingsCartModule.php
@@ -167,12 +167,10 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getMenu(Tree $tree): ?Menu
{
- /** @var ServerRequestInterface $request */
$request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
- $route = $request->getAttribute('route');
- assert($route instanceof Route);
-
+ $route = Validator::attributes($request)->route();
$cart = Session::get('cart');
$cart = is_array($cart) ? $cart : [];
$count = count($cart[$tree->name()] ?? []);
@@ -250,8 +248,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getDownloadFormAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$title = I18N::translate('Family tree clippings cart') . ' — ' . I18N::translate('Download');
@@ -270,15 +267,14 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postDownloadAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_filesystem = Registry::filesystem()->data();
- $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->requiredString('format');
- $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->requiredString('privacy');
- $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->requiredString('encoding');
- $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->requiredString('line_endings');
+ $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->string('format');
+ $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->string('privacy');
+ $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->string('encoding');
+ $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->string('line_endings');
if ($privacy === 'none' && !Auth::isManager($tree)) {
$privacy = 'member';
@@ -399,8 +395,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getEmptyAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$cart = Session::get('cart');
$cart = is_array($cart) ? $cart : [];
@@ -424,8 +419,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postRemoveAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -451,8 +445,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getShowAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return $this->viewResponse('modules/clippings/show', [
'module' => $this->name(),
@@ -500,8 +493,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddFamilyAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -534,8 +526,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddFamilyAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
@@ -600,8 +591,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddIndividualAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -646,8 +636,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddIndividualAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
@@ -733,8 +722,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddLocationAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -763,8 +751,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddLocationAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -783,8 +770,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddMediaAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -813,8 +799,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddMediaAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -833,8 +818,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddNoteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -863,8 +847,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddNoteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -883,8 +866,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddRepositoryAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -913,8 +895,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddRepositoryAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -937,8 +918,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddSourceAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -968,8 +948,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddSourceAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
@@ -1000,8 +979,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function getAddSubmitterAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -1030,8 +1008,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface
*/
public function postAddSubmitterAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
diff --git a/app/Module/ColorsTheme.php b/app/Module/ColorsTheme.php
index 315c7f8a12..c71c54bc56 100644
--- a/app/Module/ColorsTheme.php
+++ b/app/Module/ColorsTheme.php
@@ -20,12 +20,12 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Session;
use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -83,8 +83,7 @@ class ColorsTheme extends CloudsTheme
*/
public function postPaletteAction(ServerRequestInterface $request): ResponseInterface
{
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $user = Validator::attributes($request)->user();
$palette = $request->getQueryParams()['palette'];
assert(array_key_exists($palette, $this->palettes()));
diff --git a/app/Module/CompactTreeChartModule.php b/app/Module/CompactTreeChartModule.php
index c6dd1b1cad..5772f2b865 100644
--- a/app/Module/CompactTreeChartModule.php
+++ b/app/Module/CompactTreeChartModule.php
@@ -22,19 +22,18 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
+use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ChartService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
use function route;
/**
@@ -153,31 +152,25 @@ class CompactTreeChartModule extends AbstractModule implements ModuleChartInterf
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $user = $request->getAttribute('user');
- $ajax = $request->getQueryParams()['ajax'] ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
]));
}
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- if ($ajax === '1') {
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
+
+ if ($ajax) {
$this->layout = 'layouts/ajax';
return $this->viewResponse('modules/compact-chart/chart', [
diff --git a/app/Module/ContactsFooterModule.php b/app/Module/ContactsFooterModule.php
index 1fff5ff0f8..d5e0d3aedf 100644
--- a/app/Module/ContactsFooterModule.php
+++ b/app/Module/ContactsFooterModule.php
@@ -22,6 +22,7 @@ namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
/**
@@ -84,7 +85,7 @@ class ContactsFooterModule extends AbstractModule implements ModuleFooterInterfa
*/
public function getFooter(ServerRequestInterface $request): string
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
if ($tree === null) {
return '';
diff --git a/app/Module/DescendancyChartModule.php b/app/Module/DescendancyChartModule.php
index 7f975bd6d9..07b1d44320 100644
--- a/app/Module/DescendancyChartModule.php
+++ b/app/Module/DescendancyChartModule.php
@@ -27,14 +27,13 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ChartService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
use function max;
use function min;
use function route;
@@ -176,38 +175,29 @@ class DescendancyChartModule extends AbstractModule implements ModuleChartInterf
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $user = $request->getAttribute('user');
- $style = $request->getAttribute('style');
- $generations = (int) $request->getAttribute('generations');
- $ajax = $request->getQueryParams()['ajax'] ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $style = Validator::attributes($request)->string('style');
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $ajax = Validator::queryParams($request)->boolean('style', false);
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'style' => $params['style'],
- 'generations' => $params['generations'],
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
+ 'style' => Validator::parsedBody($request)->string('style', ''),
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
]));
}
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- $generations = min($generations, self::MAXIMUM_GENERATIONS);
- $generations = max($generations, self::MINIMUM_GENERATIONS);
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
switch ($style) {
diff --git a/app/Module/DescendancyModule.php b/app/Module/DescendancyModule.php
index 848a3d601d..281af1520b 100644
--- a/app/Module/DescendancyModule.php
+++ b/app/Module/DescendancyModule.php
@@ -24,11 +24,10 @@ use Fisharebest\Webtrees\Family;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Services\SearchService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function view;
/**
@@ -89,9 +88,7 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface
*/
public function getSearchAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$search = $request->getQueryParams()['search'];
$html = '';
@@ -119,9 +116,7 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface
*/
public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
$individual = Registry::individualFactory()->make($xref, $tree);
diff --git a/app/Module/FamilyBookChartModule.php b/app/Module/FamilyBookChartModule.php
index 8de562b6e4..aa7ba2d7d3 100644
--- a/app/Module/FamilyBookChartModule.php
+++ b/app/Module/FamilyBookChartModule.php
@@ -26,16 +26,13 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
-use function max;
-use function min;
use function route;
/**
@@ -50,7 +47,6 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa
// Defaults
public const DEFAULT_GENERATIONS = '2';
public const DEFAULT_DESCENDANT_GENERATIONS = '5';
- public const DEFAULT_MAXIMUM_GENERATIONS = '9';
protected const DEFAULT_PARAMETERS = [
'book_size' => self::DEFAULT_GENERATIONS,
'generations' => self::DEFAULT_DESCENDANT_GENERATIONS,
@@ -58,6 +54,9 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa
];
// Limits
+ protected const MINIMUM_BOOK_SIZE = 2;
+ protected const MAXIMUM_BOOK_SIZE = 5;
+
protected const MINIMUM_GENERATIONS = 2;
protected const MAXIMUM_GENERATIONS = 10;
@@ -161,44 +160,31 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $user = $request->getAttribute('user');
- $book_size = (int) $request->getAttribute('book_size');
- $generations = (int) $request->getAttribute('generations');
- $spouses = (bool) $request->getAttribute('spouses');
- $ajax = $request->getQueryParams()['ajax'] ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $book_size = Validator::attributes($request)->isBetween(self::MINIMUM_BOOK_SIZE, self::MAXIMUM_BOOK_SIZE)->integer('book_size');
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $spouses = Validator::attributes($request)->boolean('spouses');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'book_size' => $params['book_size'],
- 'generations' => $params['generations'],
- 'spouses' => $params['spouses'] ?? false,
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ 'book_size' => Validator::parsedBody($request)->string('book_size', ''),
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
+ 'spouses' => Validator::parsedBody($request)->string('spouses', ''),
]));
}
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- $generations = min($generations, self::MAXIMUM_GENERATIONS);
- $generations = max($generations, self::MINIMUM_GENERATIONS);
-
- // Generations of ancestors/descendants in each mini-tree.
- $book_size = min($book_size, 5);
- $book_size = max($book_size, 2);
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
return $this->viewResponse('modules/family-book-chart/chart', [
@@ -221,6 +207,8 @@ class FamilyBookChartModule extends AbstractModule implements ModuleChartInterfa
'book_size' => $book_size,
'generations' => $generations,
'individual' => $individual,
+ 'maximum_book_size' => self::MAXIMUM_BOOK_SIZE,
+ 'minimum_book_size' => self::MINIMUM_BOOK_SIZE,
'maximum_generations' => self::MAXIMUM_GENERATIONS,
'minimum_generations' => self::MINIMUM_GENERATIONS,
'module' => $this->name(),
diff --git a/app/Module/FamilyListModule.php b/app/Module/FamilyListModule.php
index 5f872223d1..e46b03efb9 100644
--- a/app/Module/FamilyListModule.php
+++ b/app/Module/FamilyListModule.php
@@ -20,14 +20,11 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Class FamilyListModule
*/
@@ -74,11 +71,8 @@ class FamilyListModule extends IndividualListModule
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/FamilyTreeFavoritesModule.php b/app/Module/FamilyTreeFavoritesModule.php
index 7b82955fc7..74f40e3b72 100644
--- a/app/Module/FamilyTreeFavoritesModule.php
+++ b/app/Module/FamilyTreeFavoritesModule.php
@@ -25,13 +25,12 @@ use Fisharebest\Webtrees\Http\RequestHandlers\TreePage;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Class FamilyTreeFavoritesModule
*/
@@ -162,10 +161,8 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt
*/
public function postAddFavoriteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
$note = $params['note'];
@@ -198,10 +195,8 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleBlockInt
*/
public function postDeleteFavoriteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$favorite_id = $request->getQueryParams()['favorite_id'];
if (Auth::isManager($tree, $user)) {
diff --git a/app/Module/FamilyTreeNewsModule.php b/app/Module/FamilyTreeNewsModule.php
index fe4901e535..cec1d4833e 100644
--- a/app/Module/FamilyTreeNewsModule.php
+++ b/app/Module/FamilyTreeNewsModule.php
@@ -27,14 +27,13 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\HtmlService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Class FamilyTreeNewsModule
*/
@@ -157,8 +156,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac
*/
public function getEditNewsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
if (!Auth::isManager($tree)) {
throw new HttpAccessDeniedException();
@@ -201,8 +199,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac
*/
public function postEditNewsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
if (!Auth::isManager($tree)) {
throw new HttpAccessDeniedException();
@@ -247,8 +244,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac
*/
public function postDeleteNewsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$news_id = $request->getQueryParams()['news_id'];
diff --git a/app/Module/FamilyTreeStatisticsModule.php b/app/Module/FamilyTreeStatisticsModule.php
index f489693e78..ad0a45ed46 100644
--- a/app/Module/FamilyTreeStatisticsModule.php
+++ b/app/Module/FamilyTreeStatisticsModule.php
@@ -47,6 +47,16 @@ class FamilyTreeStatisticsModule extends AbstractModule implements ModuleBlockIn
/** Show this number of surnames by default */
private const DEFAULT_NUMBER_OF_SURNAMES = '10';
+ private ModuleService $module_service;
+
+ /**
+ * @param ModuleService $module_service
+ */
+ public function __construct(ModuleService $module_service)
+ {
+ $this->module_service = $module_service;
+ }
+
/**
* How should this module be identified in the control panel, etc.?
*
@@ -132,10 +142,10 @@ class FamilyTreeStatisticsModule extends AbstractModule implements ModuleBlockIn
uksort($all_surnames, I18N::comparator());
- //find a module providing individual lists
- $module = app(ModuleService::class)->findByComponent(ModuleListInterface::class, $tree, Auth::user())->first(static function (ModuleInterface $module) {
- return $module instanceof IndividualListModule;
- });
+ // Find a module providing individual lists
+ $module = $this->module_service
+ ->findByComponent(ModuleListInterface::class, $tree, Auth::user())
+ ->first(static fn (ModuleInterface $module): bool => $module instanceof IndividualListModule);
$surnames = view('lists/surnames-compact-list', [
'module' => $module,
diff --git a/app/Module/FanChartModule.php b/app/Module/FanChartModule.php
index 62aee6902f..d3975ee474 100644
--- a/app/Module/FanChartModule.php
+++ b/app/Module/FanChartModule.php
@@ -27,7 +27,7 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ChartService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Fisharebest\Webtrees\Webtrees;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -54,7 +54,6 @@ use function imagettfbbox;
use function imagettftext;
use function implode;
use function intdiv;
-use function is_string;
use function max;
use function mb_substr;
use function min;
@@ -221,44 +220,31 @@ class FanChartModule extends AbstractModule implements ModuleChartInterface, Req
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $style = $request->getAttribute('style');
- $generations = (int) $request->getAttribute('generations');
- $width = (int) $request->getAttribute('width');
- $ajax = $request->getQueryParams()['ajax'] ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $style = Validator::attributes($request)->string('style');
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $width = Validator::attributes($request)->isBetween(self::MINIMUM_WIDTH, self::MAXIMUM_WIDTH)->integer('width');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'style' => $params['style'],
- 'generations' => $params['generations'],
- 'width' => $params['width'],
- ]));
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
+ 'style' => Validator::parsedBody($request)->string('style', ''),
+ 'width' => Validator::parsedBody($request)->string('width', ''),
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ ]));
}
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- $width = min($width, self::MAXIMUM_WIDTH);
- $width = max($width, self::MINIMUM_WIDTH);
-
- $generations = min($generations, self::MAXIMUM_GENERATIONS);
- $generations = max($generations, self::MINIMUM_GENERATIONS);
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
- if ($ajax === '1') {
+ if ($ajax) {
return $this->chart($individual, $style, $width, $generations);
}
diff --git a/app/Module/FrequentlyAskedQuestionsModule.php b/app/Module/FrequentlyAskedQuestionsModule.php
index bbdc473d34..a15ad3a249 100644
--- a/app/Module/FrequentlyAskedQuestionsModule.php
+++ b/app/Module/FrequentlyAskedQuestionsModule.php
@@ -25,13 +25,13 @@ use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Services\HtmlService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function redirect;
use function route;
@@ -121,7 +121,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon
$this->layout = 'layouts/administration';
// This module can't run without a tree
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
if (!$tree instanceof Tree) {
$tree = $this->tree_service->all()->first();
@@ -388,8 +388,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon
*/
public function getShowAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
// Filter foreign languages.
$faqs = $this->faqsForTree($tree)
diff --git a/app/Module/GoogleAnalyticsModule.php b/app/Module/GoogleAnalyticsModule.php
index 0dda4e271e..6a54a95aae 100644
--- a/app/Module/GoogleAnalyticsModule.php
+++ b/app/Module/GoogleAnalyticsModule.php
@@ -22,8 +22,11 @@ namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
+use function assert;
+
/**
* Class GoogleAnalyticsModule - add support for Google analytics.
*/
@@ -96,10 +99,11 @@ class GoogleAnalyticsModule extends AbstractModule implements ModuleAnalyticsInt
public function analyticsSnippet(array $parameters): string
{
$request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
// Add extra dimensions (i.e. filtering categories)
- $tree = $request->getAttribute('tree');
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
$parameters['dimensions'] = (object) [
'dimension1' => $tree instanceof Tree ? $tree->name() : '-',
diff --git a/app/Module/HitCountFooterModule.php b/app/Module/HitCountFooterModule.php
index 202ea974e4..96250827cc 100644
--- a/app/Module/HitCountFooterModule.php
+++ b/app/Module/HitCountFooterModule.php
@@ -32,6 +32,7 @@ use Fisharebest\Webtrees\Http\RequestHandlers\UserPage;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Session;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -124,11 +125,9 @@ class HitCountFooterModule extends AbstractModule implements ModuleFooterInterfa
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
- $route = $request->getAttribute('route');
- assert($route instanceof Route);
-
- $tree = $request->getAttribute('tree');
- $user = $request->getAttribute('user');
+ $route = Validator::attributes($request)->route();
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
if ($tree instanceof Tree && $tree->getPreference('SHOW_COUNTER')) {
$page_name = self::PAGE_NAMES[$route->name] ?? '';
@@ -141,7 +140,8 @@ class HitCountFooterModule extends AbstractModule implements ModuleFooterInterfa
case RepositoryPage::class:
case SourcePage::class:
case SubmitterPage::class:
- $this->page_hits = $this->countHit($tree, $page_name, $request->getAttribute('xref', ''));
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $this->page_hits = $this->countHit($tree, $page_name, $xref);
break;
case TreePage::class:
diff --git a/app/Module/HourglassChartModule.php b/app/Module/HourglassChartModule.php
index 1f38c0f7aa..4a5c6c92d1 100644
--- a/app/Module/HourglassChartModule.php
+++ b/app/Module/HourglassChartModule.php
@@ -22,12 +22,12 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Family;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Registry;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -35,7 +35,6 @@ use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
use function response;
use function view;
@@ -159,38 +158,29 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $user = $request->getAttribute('user');
- $generations = (int) $request->getAttribute('generations');
- $spouses = (bool) $request->getAttribute('spouses');
- $ajax = $request->getQueryParams()['ajax'] ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $user = Validator::attributes($request)->user();
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $spouses = Validator::attributes($request)->boolean('spouses');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'generations' => $params['generations'],
- 'spouses' => $params['spouses'] ?? false,
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
+ 'spouses' => Validator::parsedBody($request)->string('spouses', ''),
]));
}
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- $generations = min($generations, self::MAXIMUM_GENERATIONS);
- $generations = max($generations, self::MINIMUM_GENERATIONS);
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
return $this->viewResponse('modules/hourglass-chart/chart', [
@@ -228,8 +218,7 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac
*/
public function getAncestorsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
@@ -251,8 +240,7 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac
*/
public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$xref = $request->getQueryParams()['xref'] ?? '';
diff --git a/app/Module/IndividualListModule.php b/app/Module/IndividualListModule.php
index 05feaea0bf..7290f16f44 100644
--- a/app/Module/IndividualListModule.php
+++ b/app/Module/IndividualListModule.php
@@ -31,6 +31,7 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\LocalizationService;
use Fisharebest\Webtrees\Session;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\Expression;
@@ -127,7 +128,10 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface
*/
public function listUrl(Tree $tree, array $parameters = []): string
{
- $xref = app(ServerRequestInterface::class)->getAttribute('xref', '');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
if ($xref !== '') {
$individual = Registry::individualFactory()->make($xref, $tree);
@@ -161,7 +165,9 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -171,11 +177,8 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/InteractiveTreeModule.php b/app/Module/InteractiveTreeModule.php
index 7834d34a4e..82c871be20 100644
--- a/app/Module/InteractiveTreeModule.php
+++ b/app/Module/InteractiveTreeModule.php
@@ -25,13 +25,10 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Module\InteractiveTree\TreeView;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Class InteractiveTreeModule
* Tip : you could change the number of generations loaded before ajax calls both in individual page and in treeview page to optimize speed and server load
@@ -187,18 +184,15 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa
*/
public function getChartAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $xref = Validator::queryParams($request)->isXref()->string('xref');
- $xref = Validator::queryParams($request)->isXref()->requiredString('xref');
+ Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
$individual = Registry::individualFactory()->make($xref, $tree);
$individual = Auth::checkIndividualAccess($individual, false, true);
- $user = $request->getAttribute('user');
-
- Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
-
$tv = new TreeView('tv');
[$html, $js] = $tv->drawViewport($individual, 4);
@@ -221,8 +215,7 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa
*/
public function postChartAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$params = (array) $request->getParsedBody();
@@ -241,8 +234,7 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa
*/
public function getDetailsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$pid = $request->getQueryParams()['pid'];
$individual = Registry::individualFactory()->make($pid, $tree);
@@ -262,8 +254,7 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa
*/
public function getIndividualsAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$q = $request->getQueryParams()['q'];
$instance = $request->getQueryParams()['instance'];
diff --git a/app/Module/LifespansChartModule.php b/app/Module/LifespansChartModule.php
index 2222aeb434..742b7b1712 100644
--- a/app/Module/LifespansChartModule.php
+++ b/app/Module/LifespansChartModule.php
@@ -30,6 +30,7 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Place;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\JoinClause;
use Psr\Http\Message\ResponseInterface;
@@ -153,17 +154,10 @@ class LifespansChartModule extends AbstractModule implements ModuleChartInterfac
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- $xrefs = $request->getQueryParams()['xrefs'] ?? [];
- $ajax = $request->getQueryParams()['ajax'] ?? '';
-
- // URLs created by older versions may already contain an array.
- if (!is_array($xrefs)) {
- $xrefs = explode(self::SEPARATOR, $xrefs);
- }
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $xrefs = Validator::queryParams($request)->array('xrefs');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
$params = (array) $request->getParsedBody();
@@ -217,7 +211,7 @@ class LifespansChartModule extends AbstractModule implements ModuleChartInterfac
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
return $this->chart($tree, $xrefs);
diff --git a/app/Module/LocationListModule.php b/app/Module/LocationListModule.php
index 6a0b95ce11..bc72e53921 100644
--- a/app/Module/LocationListModule.php
+++ b/app/Module/LocationListModule.php
@@ -21,12 +21,12 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Location;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -124,7 +124,9 @@ class LocationListModule extends AbstractModule implements ModuleListInterface,
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -147,11 +149,8 @@ class LocationListModule extends AbstractModule implements ModuleListInterface,
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/MediaListModule.php b/app/Module/MediaListModule.php
index 3dc1833841..b1da1b2419 100644
--- a/app/Module/MediaListModule.php
+++ b/app/Module/MediaListModule.php
@@ -22,12 +22,12 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fig\Http\Message\RequestMethodInterface;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Media;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\JoinClause;
@@ -145,7 +145,9 @@ class MediaListModule extends AbstractModule implements ModuleListInterface, Req
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -155,11 +157,8 @@ class MediaListModule extends AbstractModule implements ModuleListInterface, Req
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$data_filesystem = Registry::filesystem()->data();
diff --git a/app/Module/ModuleAnalyticsTrait.php b/app/Module/ModuleAnalyticsTrait.php
index 0def02ed67..3524d0a599 100644
--- a/app/Module/ModuleAnalyticsTrait.php
+++ b/app/Module/ModuleAnalyticsTrait.php
@@ -22,10 +22,12 @@ namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAnalyticsPage;
use Fisharebest\Webtrees\Http\ViewResponseTrait;
use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use function app;
+use function assert;
/**
* Trait ModuleAnalyticsTrait - default implementation of ModuleAnalyticsInterface
@@ -42,11 +44,10 @@ trait ModuleAnalyticsTrait
public function analyticsCanShow(): bool
{
$request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
// If the browser sets the DNT header, then we won't use analytics.
- $dnt = $request->getServerParams()['HTTP_DNT'] ?? '';
-
- if ($dnt === '1') {
+ if (Validator::serverParams($request)->boolean('HTTP_DNT', false)) {
return false;
}
diff --git a/app/Module/ModuleTabTrait.php b/app/Module/ModuleTabTrait.php
index 4c5020a370..00581c9f77 100644
--- a/app/Module/ModuleTabTrait.php
+++ b/app/Module/ModuleTabTrait.php
@@ -22,12 +22,11 @@ namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function response;
use function view;
@@ -98,16 +97,14 @@ trait ModuleTabTrait
*/
public function getTabAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$xref = $request->getQueryParams()['xref'];
$record = Registry::individualFactory()->make($xref, $tree);
$record = Auth::checkIndividualAccess($record);
- $user = $request->getAttribute('user');
-
if ($this->accessLevel($tree, ModuleTabInterface::class) < Auth::accessLevel($tree, $user)) {
throw new HttpAccessDeniedException();
}
diff --git a/app/Module/ModuleThemeTrait.php b/app/Module/ModuleThemeTrait.php
index c15e1f9a3a..6c99c7222e 100644
--- a/app/Module/ModuleThemeTrait.php
+++ b/app/Module/ModuleThemeTrait.php
@@ -43,6 +43,8 @@ use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
+use PhpParser\Node\Expr\AssignOp\Mod;
use Psr\Http\Message\ServerRequestInterface;
use function app;
@@ -144,7 +146,11 @@ trait ModuleThemeTrait
public function individualBoxMenuCharts(Individual $individual): array
{
$menus = [];
- foreach (app(ModuleService::class)->findByComponent(ModuleChartInterface::class, $individual->tree(), Auth::user()) as $chart) {
+
+ $module_service = app(ModuleService::class);
+ assert($module_service instanceof ModuleService);
+
+ foreach ($module_service->findByComponent(ModuleChartInterface::class, $individual->tree(), Auth::user()) as $chart) {
$menu = $chart->chartBoxMenu($individual);
if ($menu) {
$menus[] = $menu;
@@ -194,11 +200,10 @@ trait ModuleThemeTrait
*/
public function menuChangeBlocks(Tree $tree): ?Menu
{
- /** @var ServerRequestInterface $request */
$request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
- $route = $request->getAttribute('route');
- assert($route instanceof Route);
+ $route = Validator::attributes($request)->route();
if (Auth::check() && $route->name === UserPage::class) {
return new Menu(I18N::translate('Customize this page'), route(UserPageEdit::class, ['tree' => $tree->name()]), 'menu-change-blocks');
@@ -267,13 +272,13 @@ trait ModuleThemeTrait
}
$request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
// Return to this page after login...
$redirect = $request->getQueryParams()['url'] ?? (string) $request->getUri();
- $tree = $request->getAttribute('tree');
- $route = $request->getAttribute('route');
- assert($route instanceof Route);
+ $tree = Validator::attributes($request)->treeOptional();
+ $route = Validator::attributes($request)->route();
// ...but switch from the tree-page to the user-page
if ($route->name === TreePage::class) {
@@ -387,10 +392,12 @@ trait ModuleThemeTrait
{
$my_xref = $tree->getUserPreference(Auth::user(), UserInterface::PREF_TREE_ACCOUNT_XREF);
- $pedigree_chart = app(ModuleService::class)->findByComponent(ModuleChartInterface::class, $tree, Auth::user())
- ->first(static function (ModuleInterface $module): bool {
- return $module instanceof PedigreeChartModule;
- });
+ $module_service = app(ModuleService::class);
+ assert($module_service instanceof ModuleService);
+
+ $pedigree_chart = $module_service
+ ->findByComponent(ModuleChartInterface::class, $tree, Auth::user())
+ ->first(static fn (ModuleInterface $module): bool => $module instanceof PedigreeChartModule);
if ($my_xref !== '' && $pedigree_chart instanceof PedigreeChartModule) {
$individual = Registry::individualFactory()->make($my_xref, $tree);
@@ -417,9 +424,12 @@ trait ModuleThemeTrait
public function menuPendingChanges(?Tree $tree): ?Menu
{
if ($tree instanceof Tree && $tree->hasPendingEdit() && Auth::isModerator($tree)) {
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
$url = route(PendingChanges::class, [
'tree' => $tree->name(),
- 'url' => (string) app(ServerRequestInterface::class)->getUri(),
+ 'url' => (string) $request->getUri(),
]);
return new Menu(I18N::translate('Pending changes'), $url, 'menu-pending');
@@ -435,7 +445,10 @@ trait ModuleThemeTrait
*/
public function menuThemes(): ?Menu
{
- $themes = app(ModuleService::class)->findByInterface(ModuleThemeInterface::class, false, true);
+ $module_service = app(ModuleService::class);
+ assert($module_service instanceof ModuleService);
+
+ $themes = $module_service->findByInterface(ModuleThemeInterface::class, false, true);
$current_theme = app(ModuleThemeInterface::class);
@@ -468,10 +481,12 @@ trait ModuleThemeTrait
return [];
}
- return app(ModuleService::class)->findByComponent(ModuleMenuInterface::class, $tree, Auth::user())
- ->map(static function (ModuleMenuInterface $menu) use ($tree): ?Menu {
- return $menu->getMenu($tree);
- })
+ $module_service = app(ModuleService::class);
+ assert($module_service instanceof ModuleService);
+
+ return $module_service
+ ->findByComponent(ModuleMenuInterface::class, $tree, Auth::user())
+ ->map(static fn (ModuleMenuInterface $menu): ?Menu => $menu->getMenu($tree))
->filter()
->all();
}
diff --git a/app/Module/NoteListModule.php b/app/Module/NoteListModule.php
index d2e2c02d74..5cc440842f 100644
--- a/app/Module/NoteListModule.php
+++ b/app/Module/NoteListModule.php
@@ -21,12 +21,12 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Note;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -134,7 +134,9 @@ class NoteListModule extends AbstractModule implements ModuleListInterface, Requ
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -144,11 +146,8 @@ class NoteListModule extends AbstractModule implements ModuleListInterface, Requ
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/OpenStreetMap.php b/app/Module/OpenStreetMap.php
index 32760c8eed..9c7f0f5a0d 100644
--- a/app/Module/OpenStreetMap.php
+++ b/app/Module/OpenStreetMap.php
@@ -20,7 +20,6 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\I18N;
-use Psr\Http\Message\ResponseInterface;
/**
* Class OpenStreetMap - use maps within webtrees
diff --git a/app/Module/PedigreeChartModule.php b/app/Module/PedigreeChartModule.php
index bbe6a71b1d..bbad65c000 100644
--- a/app/Module/PedigreeChartModule.php
+++ b/app/Module/PedigreeChartModule.php
@@ -27,14 +27,13 @@ use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ChartService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
use function max;
use function min;
use function route;
@@ -186,38 +185,29 @@ class PedigreeChartModule extends AbstractModule implements ModuleChartInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $ajax = $request->getQueryParams()['ajax'] ?? '';
- $generations = (int) $request->getAttribute('generations');
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
$style = $request->getAttribute('style');
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(self::class, [
- 'tree' => $request->getAttribute('tree')->name(),
- 'xref' => $params['xref'],
- 'style' => $params['style'],
- 'generations' => $params['generations'],
+ 'tree' => $tree->name(),
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ 'style' => Validator::parsedBody($request)->string('style', ''),
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
]));
}
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
- $generations = min($generations, self::MAXIMUM_GENERATIONS);
- $generations = max($generations, self::MINIMUM_GENERATIONS);
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
$ancestors = $this->chart_service->sosaStradonitzAncestors($individual, $generations);
diff --git a/app/Module/PedigreeMapModule.php b/app/Module/PedigreeMapModule.php
index 1ea5013cf9..4780bd7539 100644
--- a/app/Module/PedigreeMapModule.php
+++ b/app/Module/PedigreeMapModule.php
@@ -32,7 +32,7 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\ChartService;
use Fisharebest\Webtrees\Services\LeafletJsService;
use Fisharebest\Webtrees\Services\RelationshipService;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
@@ -40,9 +40,7 @@ use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function array_key_exists;
use function assert;
-use function count;
use function intdiv;
-use function is_string;
use function redirect;
use function route;
use function ucfirst;
@@ -64,6 +62,7 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface,
];
// Limits
+ public const MINIMUM_GENERATIONS = 1;
public const MAXIMUM_GENERATIONS = 10;
// CSS colors defined for each generation
@@ -183,30 +182,25 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface,
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $individual = Registry::individualFactory()->make($xref, $tree);
- $individual = Auth::checkIndividualAccess($individual, false, true);
-
- $user = $request->getAttribute('user');
- $generations = (int) $request->getAttribute('generations');
- Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $xref = Validator::attributes($request)->isXref()->string('xref');
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'generations' => $params['generations'],
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ 'generations' => Validator::parsedBody($request)->string('generations', ''),
]));
}
+ Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
+
+ $individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
+
$map = view('modules/pedigree-map/chart', [
'data' => $this->getMapData($request),
'leaflet_config' => $this->leaflet_js_service->config(),
@@ -231,9 +225,6 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface,
*/
private function getMapData(ServerRequestInterface $request): array
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
$facts = $this->getPedigreeMapFacts($request, $this->chart_service);
$geojson = [
@@ -308,14 +299,14 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface,
*/
private function getPedigreeMapFacts(ServerRequestInterface $request, ChartService $chart_service): array
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $generations = (int) $request->getAttribute('generations');
- $xref = $request->getAttribute('xref');
+ $tree = Validator::attributes($request)->tree();
+ $generations = Validator::attributes($request)->isBetween(self::MINIMUM_GENERATIONS, self::MAXIMUM_GENERATIONS)->integer('generations');
+ $xref = Validator::attributes($request)->isXref()->string('xref');
$individual = Registry::individualFactory()->make($xref, $tree);
+ $individual = Auth::checkIndividualAccess($individual, false, true);
$ancestors = $chart_service->sosaStradonitzAncestors($individual, $generations);
$facts = [];
+
foreach ($ancestors as $sosa => $person) {
if ($person->canShow()) {
$birth = $person->facts(Gedcom::BIRTH_EVENTS, true)
@@ -352,6 +343,9 @@ class PedigreeMapModule extends AbstractModule implements ModuleChartInterface,
$sosa = intdiv($sosa, 2);
}
- return app(RelationshipService::class)->legacyNameAlgorithm($path);
+ $relationship_service = app(RelationshipService::class);
+ assert($relationship_service instanceof RelationshipService);
+
+ return $relationship_service->legacyNameAlgorithm($path);
}
}
diff --git a/app/Module/PlaceHierarchyListModule.php b/app/Module/PlaceHierarchyListModule.php
index 901a863c2a..8a7fba443a 100644
--- a/app/Module/PlaceHierarchyListModule.php
+++ b/app/Module/PlaceHierarchyListModule.php
@@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Family;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
@@ -33,6 +32,7 @@ use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\SearchService;
use Fisharebest\Webtrees\Statistics;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -156,7 +156,9 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -179,11 +181,8 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/PrivacyPolicy.php b/app/Module/PrivacyPolicy.php
index 54d7805b78..a8f73173be 100644
--- a/app/Module/PrivacyPolicy.php
+++ b/app/Module/PrivacyPolicy.php
@@ -24,11 +24,11 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function view;
/**
@@ -95,15 +95,13 @@ class PrivacyPolicy extends AbstractModule implements ModuleFooterInterface
*/
public function getFooter(ServerRequestInterface $request): string
{
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
+ $user = Validator::attributes($request)->user();
if ($tree === null) {
return '';
}
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
-
return view('modules/privacy-policy/footer', [
'tree' => $tree,
'uses_analytics' => $this->analyticsModules($tree, $user)->isNotEmpty(),
@@ -117,11 +115,8 @@ class PrivacyPolicy extends AbstractModule implements ModuleFooterInterface
*/
public function getPageAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$title = I18N::translate('Privacy policy');
diff --git a/app/Module/RelationshipsChartModule.php b/app/Module/RelationshipsChartModule.php
index a3c684e30b..48938bf988 100644
--- a/app/Module/RelationshipsChartModule.php
+++ b/app/Module/RelationshipsChartModule.php
@@ -35,6 +35,7 @@ use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Services\RelationshipService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\JoinClause;
use Illuminate\Support\Collection;
@@ -44,7 +45,6 @@ use Psr\Http\Server\RequestHandlerInterface;
use function app;
use function assert;
-use function is_string;
use function redirect;
use function route;
use function view;
@@ -72,16 +72,20 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
'recursion' => self::DEFAULT_RECURSION,
];
+ private ModuleService $module_service;
+
private TreeService $tree_service;
private RelationshipService $relationship_service;
/**
+ * @param ModuleService $module_service
* @param RelationshipService $relationship_service
* @param TreeService $tree_service
*/
- public function __construct(RelationshipService $relationship_service, TreeService $tree_service)
+ public function __construct(ModuleService $module_service, RelationshipService $relationship_service, TreeService $tree_service)
{
+ $this->module_service = $module_service;
$this->relationship_service = $relationship_service;
$this->tree_service = $tree_service;
}
@@ -204,29 +208,22 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- assert(is_string($xref));
-
- $xref2 = $request->getAttribute('xref2') ?? '';
-
- $ajax = $request->getQueryParams()['ajax'] ?? '';
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $xref2 = Validator::attributes($request)->isXref()->string('xref2', '');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
$ancestors = (int) $request->getAttribute('ancestors');
$recursion = (int) $request->getAttribute('recursion');
- $user = $request->getAttribute('user');
+ $user = Validator::attributes($request)->user();
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
- $params = (array) $request->getParsedBody();
-
return redirect(route(static::class, [
- 'ancestors' => $params['ancestors'],
- 'recursion' => $params['recursion'],
'tree' => $tree->name(),
- 'xref' => $params['xref'],
- 'xref2' => $params['xref2'],
+ 'ancestors' => Validator::parsedBody($request)->string('ancestors', ''),
+ 'recursion' => Validator::parsedBody($request)->string('recursion', ''),
+ 'xref' => Validator::parsedBody($request)->string('xref', ''),
+ 'xref2' => Validator::parsedBody($request)->string('xref2', ''),
]));
}
@@ -238,6 +235,8 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
$recursion = min($recursion, $max_recursion);
+ Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
+
if ($individual1 instanceof Individual) {
$individual1 = Auth::checkIndividualAccess($individual1, false, true);
}
@@ -246,10 +245,8 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
$individual2 = Auth::checkIndividualAccess($individual2, false, true);
}
- Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
-
if ($individual1 instanceof Individual && $individual2 instanceof Individual) {
- if ($ajax === '1') {
+ if ($ajax) {
return $this->chart($individual1, $individual2, $recursion, $ancestors);
}
@@ -327,12 +324,10 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
return Registry::familyFactory()->make($xref, $tree);
});
- $language = app(ModuleService::class)
+ $language = $this->module_service
->findByInterface(ModuleLanguageInterface::class, true)
->first(fn (ModuleLanguageInterface $language): bool => $language->locale()->languageTag() === I18N::languageTag());
-
-
echo '<h3>', I18N::translate('Relationship: %s', $this->relationship_service->nameFromPath($nodes->all(), $language)), '</h3>';
$num_paths++;
@@ -355,17 +350,17 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
case 'bro':
case 'sis':
case 'sib':
- $table[$x + 1][$y] = '<div style="background:url(' . e(asset('css/images/hline.png')) . ') repeat-x center; width: 94px; text-align: center"><div class="hline-text" style="height: 32px;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px;">' . view('icons/arrow-right') . '</div></div>';
+ $table[$x + 1][$y] = '<div style="background:url(' . e(asset('css/images/hline.png')) . ') repeat-x center; width: 94px; text-align: center"><div class="hline-text" style="height: 32px;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px;">' . view('icons/arrow-right') . '</div></div>';
$x += 2;
break;
case 'son':
case 'dau':
case 'chi':
if ($n > 2 && preg_match('/fat|mot|par/', $relationships[$n - 2])) {
- $table[$x + 1][$y - 1] = '<div style="background:url(' . $diagonal2 . '); width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: end;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: start;">' . view('icons/arrow-down') . '</div></div>';
+ $table[$x + 1][$y - 1] = '<div style="background:url(' . $diagonal2 . '); width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: end;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: start;">' . view('icons/arrow-down') . '</div></div>';
$x += 2;
} else {
- $table[$x][$y - 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align: center;"><div class="vline-text" style="display: inline-block; width:50%; line-height: 64px;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width:50%; line-height: 64px;">' . view('icons/arrow-down') . '</div></div>';
+ $table[$x][$y - 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align: center;"><div class="vline-text" style="display: inline-block; width:50%; line-height: 64px;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width:50%; line-height: 64px;">' . view('icons/arrow-down') . '</div></div>';
}
$y -= 2;
break;
@@ -373,10 +368,10 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
case 'mot':
case 'par':
if ($n > 2 && preg_match('/son|dau|chi/', $relationships[$n - 2])) {
- $table[$x + 1][$y + 1] = '<div style="background:url(' . $diagonal1 . '); background-position: top right; width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: start;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: end;">' . view('icons/arrow-down') . '</div></div>';
+ $table[$x + 1][$y + 1] = '<div style="background:url(' . $diagonal1 . '); background-position: top right; width: 64px; height: 64px; text-align: center;"><div style="height: 32px; text-align: start;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="height: 32px; text-align: end;">' . view('icons/arrow-down') . '</div></div>';
$x += 2;
} else {
- $table[$x][$y + 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align:center; "><div class="vline-text" style="display: inline-block; width: 50%; line-height: 64px;">' . app(RelationshipService::class)->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width: 50%; line-height: 32px">' . view('icons/arrow-up') . '</div></div>';
+ $table[$x][$y + 1] = '<div style="background:url(' . e('"' . asset('css/images/vline.png') . '"') . ') repeat-y center; height: 64px; text-align:center; "><div class="vline-text" style="display: inline-block; width: 50%; line-height: 64px;">' . $this->relationship_service->legacyNameAlgorithm($relationships[$n], Registry::individualFactory()->make($path[$n - 1], $tree), Registry::individualFactory()->make($path[$n + 1], $tree)) . '</div><div style="display: inline-block; width: 50%; line-height: 32px">' . view('icons/arrow-up') . '</div></div>';
}
$y += 2;
break;
diff --git a/app/Module/ReportsMenuModule.php b/app/Module/ReportsMenuModule.php
index 03a6c61592..c3e256f8fa 100644
--- a/app/Module/ReportsMenuModule.php
+++ b/app/Module/ReportsMenuModule.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Services\ModuleService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
use function app;
@@ -88,8 +89,10 @@ class ReportsMenuModule extends AbstractModule implements ModuleMenuInterface
*/
public function getMenu(Tree $tree): ?Menu
{
- $request = app(ServerRequestInterface::class);
- $xref = $request->getAttribute('xref', '');
+ $request = app(ServerRequestInterface::class);
+ assert($request instanceof ServerRequestInterface);
+
+ $xref = Validator::attributes($request)->isXref()->string('xref', '');
$individual = $tree->significantIndividual(Auth::user(), $xref);
$submenus = $this->module_service->findByComponent(ModuleReportInterface::class, $tree, Auth::user())
->map(static function (ModuleReportInterface $module) use ($individual): Menu {
diff --git a/app/Module/RepositoryListModule.php b/app/Module/RepositoryListModule.php
index c55eb5a397..c98974f315 100644
--- a/app/Module/RepositoryListModule.php
+++ b/app/Module/RepositoryListModule.php
@@ -20,13 +20,13 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Repository;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\Auth;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -137,7 +137,9 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -147,11 +149,8 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/ShareAnniversaryModule.php b/app/Module/ShareAnniversaryModule.php
index b766fb8ee9..af6115bc68 100644
--- a/app/Module/ShareAnniversaryModule.php
+++ b/app/Module/ShareAnniversaryModule.php
@@ -29,7 +29,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -139,14 +139,11 @@ class ShareAnniversaryModule extends AbstractModule implements ModuleShareInterf
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $xref = $request->getAttribute('xref');
- $fact_id = $request->getAttribute('fact_id');
-
- $record = Registry::gedcomRecordFactory()->make($xref, $tree);
- $record = Auth::checkRecordAccess($record);
+ $tree = Validator::attributes($request)->tree();
+ $xref = Validator::attributes($request)->isXref()->string('xref');
+ $fact_id = Validator::attributes($request)->string('fact_id');
+ $record = Registry::gedcomRecordFactory()->make($xref, $tree);
+ $record = Auth::checkRecordAccess($record);
$fact = $record->facts()
->filter(fn (Fact $fact): bool => $fact->id() === $fact_id)
diff --git a/app/Module/SiteMapModule.php b/app/Module/SiteMapModule.php
index 3c2101431d..e1fa8617f4 100644
--- a/app/Module/SiteMapModule.php
+++ b/app/Module/SiteMapModule.php
@@ -38,6 +38,7 @@ use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Source;
use Fisharebest\Webtrees\Submitter;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Collection;
@@ -188,8 +189,7 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface, Req
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $route = $request->getAttribute('route');
- assert($route instanceof Route);
+ $route = Validator::attributes($request)->route();
if ($route->name === 'sitemap-style') {
$content = view('modules/sitemap/sitemap-xsl');
@@ -305,11 +305,9 @@ class SiteMapModule extends AbstractModule implements ModuleConfigInterface, Req
*/
private function siteMapFile(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $type = $request->getAttribute('type');
- $page = (int) $request->getAttribute('page');
+ $tree = Validator::attributes($request)->tree('tree');
+ $type = Validator::attributes($request)->string('type');
+ $page = Validator::attributes($request)->integer('page');
if ($tree->getPreference('include_in_sitemap') !== '1') {
throw new HttpNotFoundException();
diff --git a/app/Module/SourceListModule.php b/app/Module/SourceListModule.php
index a8e3a5834f..d2ea8ef01b 100644
--- a/app/Module/SourceListModule.php
+++ b/app/Module/SourceListModule.php
@@ -21,11 +21,11 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -135,7 +135,9 @@ class SourceListModule extends AbstractModule implements ModuleListInterface, Re
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -145,11 +147,8 @@ class SourceListModule extends AbstractModule implements ModuleListInterface, Re
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/StatisticsChartModule.php b/app/Module/StatisticsChartModule.php
index 5d50addf88..327e037981 100644
--- a/app/Module/StatisticsChartModule.php
+++ b/app/Module/StatisticsChartModule.php
@@ -24,7 +24,7 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Statistics;
-use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -134,10 +134,8 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa
*/
public function getChartAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
@@ -224,8 +222,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa
{
$this->layout = 'layouts/ajax';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
return $this->viewResponse('modules/statistics-chart/custom', [
'module' => $this,
diff --git a/app/Module/StoriesModule.php b/app/Module/StoriesModule.php
index 88a714e66c..ae4088f7ab 100644
--- a/app/Module/StoriesModule.php
+++ b/app/Module/StoriesModule.php
@@ -20,7 +20,6 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel;
use Fisharebest\Webtrees\I18N;
@@ -29,12 +28,11 @@ use Fisharebest\Webtrees\Menu;
use Fisharebest\Webtrees\Services\HtmlService;
use Fisharebest\Webtrees\Services\TreeService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-use function is_string;
use function redirect;
use function route;
@@ -217,7 +215,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod
$this->layout = 'layouts/administration';
// This module can't run without a tree
- $tree = $request->getAttribute('tree');
+ $tree = Validator::attributes($request)->treeOptional();
if (!$tree instanceof Tree) {
$tree = $this->tree_service->all()->first();
@@ -281,12 +279,9 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod
{
$this->layout = 'layouts/administration';
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$block_id = (int) ($request->getQueryParams()['block_id'] ?? 0);
-
- $url = $request->getQueryParams()['url'] ?? '';
+ $url = $request->getQueryParams()['url'] ?? '';
if ($block_id === 0) {
// Creating a new story
@@ -328,12 +323,9 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod
*/
public function postAdminEditAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$block_id = (int) ($request->getQueryParams()['block_id'] ?? 0);
-
- $params = (array) $request->getParsedBody();
+ $params = (array) $request->getParsedBody();
$xref = $params['xref'];
$story_body = $params['story_body'];
@@ -381,9 +373,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod
*/
public function postAdminDeleteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$block_id = $request->getQueryParams()['block_id'];
DB::table('block_setting')
@@ -410,8 +400,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod
*/
public function getShowListAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$stories = DB::table('block')
->where('module_name', '=', $this->name())
diff --git a/app/Module/SubmitterListModule.php b/app/Module/SubmitterListModule.php
index 7140130a66..60b9e43ed2 100644
--- a/app/Module/SubmitterListModule.php
+++ b/app/Module/SubmitterListModule.php
@@ -21,12 +21,12 @@ namespace Fisharebest\Webtrees\Module;
use Aura\Router\RouterContainer;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\GedcomRecord;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Submitter;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -147,7 +147,9 @@ class SubmitterListModule extends AbstractModule implements ModuleListInterface,
*/
public function getListAction(ServerRequestInterface $request): ResponseInterface
{
- return redirect($this->listUrl($request->getAttribute('tree'), $request->getQueryParams()));
+ $tree = Validator::attributes($request)->tree();
+
+ return redirect($this->listUrl($tree, $request->getQueryParams()));
}
/**
@@ -157,11 +159,8 @@ class SubmitterListModule extends AbstractModule implements ModuleListInterface,
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- assert($user instanceof UserInterface);
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user);
diff --git a/app/Module/ThemeSelectModule.php b/app/Module/ThemeSelectModule.php
index 14106aa048..4f709a4e63 100644
--- a/app/Module/ThemeSelectModule.php
+++ b/app/Module/ThemeSelectModule.php
@@ -68,7 +68,10 @@ class ThemeSelectModule extends AbstractModule implements ModuleBlockInterface
*/
public function getBlock(Tree $tree, int $block_id, string $context, array $config = []): string
{
- $menu = app(ModuleThemeInterface::class)->menuThemes();
+ $theme = app(ModuleThemeInterface::class);
+ assert($theme instanceof ModuleThemeInterface);
+
+ $menu = $theme->menuThemes();
if ($menu instanceof Menu) {
$content = '<ul class="nav text-justify" role="menu">' . view('components/menu-item', ['menu' => $menu]) . '</ul>';
diff --git a/app/Module/TimelineChartModule.php b/app/Module/TimelineChartModule.php
index becc6f8040..57a509e206 100644
--- a/app/Module/TimelineChartModule.php
+++ b/app/Module/TimelineChartModule.php
@@ -29,6 +29,7 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Individual;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
@@ -141,36 +142,28 @@ class TimelineChartModule extends AbstractModule implements ModuleChartInterface
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- $scale = (int) $request->getAttribute('scale');
- $xrefs = $request->getQueryParams()['xrefs'] ?? [];
- $ajax = $request->getQueryParams()['ajax'] ?? '';
-
-
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $scale = Validator::attributes($request)->isBetween(self::MINIMUM_SCALE, self::MAXIMUM_SCALE)->integer('scale');
+ $xrefs = Validator::queryParams($request)->array('xrefs');
+ $ajax = Validator::queryParams($request)->boolean('ajax', false);
$params = (array) $request->getParsedBody();
-
$add = $params['add'] ?? '';
- Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
-
- $scale = min($scale, self::MAXIMUM_SCALE);
- $scale = max($scale, self::MINIMUM_SCALE);
-
$xrefs[] = $add;
$xrefs = array_filter(array_unique($xrefs));
// Convert POST requests into GET requests for pretty URLs.
if ($request->getMethod() === RequestMethodInterface::METHOD_POST) {
return redirect(route(static::class, [
- 'scale' => $scale,
'tree' => $tree->name(),
+ 'scale' => $scale,
'xrefs' => $xrefs,
]));
}
+ Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
+
// Find the requested individuals.
$individuals = (new Collection($xrefs))
->uniqueStrict()
@@ -207,9 +200,7 @@ class TimelineChartModule extends AbstractModule implements ModuleChartInterface
return $individual instanceof Individual && $individual->canShow();
});
- Auth::checkComponentAccess($this, ModuleChartInterface::class, $tree, $user);
-
- if ($ajax === '1') {
+ if ($ajax) {
$this->layout = 'layouts/ajax';
return $this->chart($tree, $xrefs, $scale);
diff --git a/app/Module/UserFavoritesModule.php b/app/Module/UserFavoritesModule.php
index caffb0b1ef..1a59b2d016 100644
--- a/app/Module/UserFavoritesModule.php
+++ b/app/Module/UserFavoritesModule.php
@@ -26,13 +26,12 @@ use Fisharebest\Webtrees\Http\RequestHandlers\UserPage;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
-
/**
* Class UserFavoritesModule
*/
@@ -164,10 +163,8 @@ class UserFavoritesModule extends AbstractModule implements ModuleBlockInterface
*/
public function postAddFavoriteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
$params = (array) $request->getParsedBody();
$note = $params['note'];
@@ -200,11 +197,9 @@ class UserFavoritesModule extends AbstractModule implements ModuleBlockInterface
*/
public function postDeleteFavoriteAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
- $favorite_id = $request->getQueryParams()['favorite_id'];
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
+ $favorite_id = Validator::queryParams($request)->integer('favorite_id');
if (Auth::check()) {
DB::table('favorite')
diff --git a/app/Module/UserJournalModule.php b/app/Module/UserJournalModule.php
index 65b384aa99..2ec8db52cb 100644
--- a/app/Module/UserJournalModule.php
+++ b/app/Module/UserJournalModule.php
@@ -27,13 +27,13 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\HtmlService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function redirect;
/**
@@ -158,8 +158,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface
*/
public function getEditJournalAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
if (!Auth::check()) {
throw new HttpAccessDeniedException();
@@ -199,8 +198,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface
*/
public function postEditJournalAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
if (!Auth::check()) {
throw new HttpAccessDeniedException();
@@ -244,9 +242,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface
*/
public function postDeleteJournalAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
+ $tree = Validator::attributes($request)->tree();
$news_id = $request->getQueryParams()['news_id'];
DB::table('news')
diff --git a/app/Module/UserMessagesModule.php b/app/Module/UserMessagesModule.php
index d336c23b82..b4bdbd00e8 100644
--- a/app/Module/UserMessagesModule.php
+++ b/app/Module/UserMessagesModule.php
@@ -27,12 +27,12 @@ use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Services\UserService;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Str;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function route;
use function view;
@@ -86,19 +86,16 @@ class UserMessagesModule extends AbstractModule implements ModuleBlockInterface
*/
public function postDeleteMessageAction(ServerRequestInterface $request): ResponseInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $params = (array) $request->getParsedBody();
-
- $message_ids = $params['message_id'] ?? [];
+ $tree = Validator::attributes($request)->tree();
+ $context = Validator::queryParams($request)->string('context');
+ $message_ids = Validator::parsedBody($request)->array('message_ids');
DB::table('message')
->where('user_id', '=', Auth::id())
->whereIn('message_id', $message_ids)
->delete();
- if ($request->getQueryParams()['context'] === ModuleBlockInterface::CONTEXT_USER_PAGE) {
+ if ($context === ModuleBlockInterface::CONTEXT_USER_PAGE) {
$url = route(UserPage::class, ['tree' => $tree->name()]);
} else {
$url = route(TreePage::class, ['tree' => $tree->name()]);
diff --git a/app/Report/ReportParserBase.php b/app/Report/ReportParserBase.php
index f3d1d87395..94d501f4a6 100644
--- a/app/Report/ReportParserBase.php
+++ b/app/Report/ReportParserBase.php
@@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Report;
use DomainException;
use Exception;
-use Fisharebest\Webtrees\Registry;
use XMLParser;
use function call_user_func;
diff --git a/app/Services/CaptchaService.php b/app/Services/CaptchaService.php
index 942af11010..dc0c363648 100644
--- a/app/Services/CaptchaService.php
+++ b/app/Services/CaptchaService.php
@@ -20,6 +20,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Services;
use Fisharebest\Webtrees\Session;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
use Ramsey\Uuid\Uuid;
@@ -69,9 +70,14 @@ class CaptchaService
$x = Session::pull('captcha-x');
$y = Session::pull('captcha-y');
$z = Session::pull('captcha-z');
+
+ assert(is_int($t));
+ assert(is_string($x));
+ assert(is_string($y));
+ assert(is_string($z));
- $value_x = $request->getParsedBody()[$x] ?? '';
- $value_y = $request->getParsedBody()[$y] ?? '';
+ $value_x = Validator::parsedBody($request)->string($x, '');
+ $value_y = Validator::parsedBody($request)->string($y, '');
// The captcha uses javascript to copy value z from field y to field x.
// Expect it in both fields.
diff --git a/app/Services/EmailService.php b/app/Services/EmailService.php
index c4699aa05e..e2df35181a 100644
--- a/app/Services/EmailService.php
+++ b/app/Services/EmailService.php
@@ -23,6 +23,7 @@ use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Log;
use Fisharebest\Webtrees\Site;
+use Fisharebest\Webtrees\Validator;
use Psr\Http\Message\ServerRequestInterface;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\Mailer;
@@ -135,7 +136,7 @@ class EmailService
$request = app(ServerRequestInterface::class);
assert($request instanceof ServerRequestInterface);
- $sendmail_command = $request->getAttribute('sendmail_command', '/usr/sbin/sendmail -bs');
+ $sendmail_command = Validator::attributes($request)->string('sendmail_command', '/usr/sbin/sendmail -bs');
return new SendmailTransport($sendmail_command);
diff --git a/app/Services/HomePageService.php b/app/Services/HomePageService.php
index 267a2b8db0..dd91842953 100644
--- a/app/Services/HomePageService.php
+++ b/app/Services/HomePageService.php
@@ -25,11 +25,11 @@ use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Module\ModuleInterface;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Collection;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function is_numeric;
use function is_object;
@@ -59,10 +59,8 @@ class HomePageService
*/
public function treeBlock(ServerRequestInterface $request): ModuleBlockInterface
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $block_id = (int) $request->getQueryParams()['block_id'];
+ $tree = Validator::attributes($request)->tree();
+ $block_id = Validator::attributes($request)->integer('block_id');
$block = DB::table('block')
->where('block_id', '=', $block_id)
@@ -91,7 +89,7 @@ class HomePageService
*/
public function userBlock(ServerRequestInterface $request, UserInterface $user): ModuleBlockInterface
{
- $block_id = (int) $request->getQueryParams()['block_id'];
+ $block_id = Validator::attributes($request)->integer('block_id');
$block = DB::table('block')
->where('block_id', '=', $block_id)
diff --git a/app/Services/MediaFileService.php b/app/Services/MediaFileService.php
index 13789fcb9d..ba34994f2c 100644
--- a/app/Services/MediaFileService.php
+++ b/app/Services/MediaFileService.php
@@ -24,6 +24,7 @@ use Fisharebest\Webtrees\FlashMessages;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Expression;
use Illuminate\Database\Query\JoinClause;
@@ -39,7 +40,6 @@ use RuntimeException;
use function array_combine;
use function array_diff;
use function array_intersect;
-use function assert;
use function dirname;
use function explode;
use function ini_get;
@@ -156,8 +156,7 @@ class MediaFileService
*/
public function uploadFile(ServerRequestInterface $request): string
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
+ $tree = Validator::attributes($request)->tree();
$data_filesystem = Registry::filesystem()->data();
diff --git a/app/Services/UserService.php b/app/Services/UserService.php
index c660689da1..592a0e9ecc 100644
--- a/app/Services/UserService.php
+++ b/app/Services/UserService.php
@@ -26,15 +26,14 @@ use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Http\RequestHandlers\ContactPage;
use Fisharebest\Webtrees\Http\RequestHandlers\MessagePage;
use Fisharebest\Webtrees\Individual;
-use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
+use Fisharebest\Webtrees\Validator;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\JoinClause;
use Illuminate\Support\Collection;
use Psr\Http\Message\ServerRequestInterface;
-use function assert;
use function max;
use function time;
@@ -393,10 +392,8 @@ class UserService
*/
public function contactLink(User $contact_user, ServerRequestInterface $request): string
{
- $tree = $request->getAttribute('tree');
- assert($tree instanceof Tree);
-
- $user = $request->getAttribute('user');
+ $tree = Validator::attributes($request)->tree();
+ $user = Validator::attributes($request)->user();
if ($contact_user->getPreference(UserInterface::PREF_CONTACT_METHOD) === 'mailto') {
$url = 'mailto:' . $contact_user->email();
diff --git a/app/Session.php b/app/Session.php
index e796d26f20..67dfc86c18 100644
--- a/app/Session.php
+++ b/app/Session.php
@@ -63,7 +63,7 @@ class Session
// Store sessions in the database
session_set_save_handler(new SessionDatabaseHandler($request));
- $url = $request->getAttribute('base_url');
+ $url = Validator::attributes($request)->string('base_url');
$secure = parse_url($url, PHP_URL_SCHEME) === 'https';
$domain = (string) parse_url($url, PHP_URL_HOST);
$path = (string) parse_url($url, PHP_URL_PATH);
diff --git a/app/SessionDatabaseHandler.php b/app/SessionDatabaseHandler.php
index 3dbda3a9ea..8b514c2ffd 100644
--- a/app/SessionDatabaseHandler.php
+++ b/app/SessionDatabaseHandler.php
@@ -87,7 +87,7 @@ class SessionDatabaseHandler implements SessionHandlerInterface
*/
public function write($id, $data): bool
{
- $ip_address = $this->request->getAttribute('client-ip');
+ $ip_address = Validator::attributes($this->request)->string('client-ip');
$session_time = time();
$user_id = (int) Auth::id();
diff --git a/app/Statistics/Repository/IndividualRepository.php b/app/Statistics/Repository/IndividualRepository.php
index cc62465d2d..ef6b9f3b52 100644
--- a/app/Statistics/Repository/IndividualRepository.php
+++ b/app/Statistics/Repository/IndividualRepository.php
@@ -582,10 +582,13 @@ class IndividualRepository implements IndividualRepositoryInterface
break;
}
- //find a module providing individual lists
- $module = app(ModuleService::class)->findByComponent(ModuleListInterface::class, $this->tree, Auth::user())->first(static function (ModuleInterface $module): bool {
- return $module instanceof IndividualListModule;
- });
+ // find a module providing individual lists
+ $module_service = app(ModuleService::class);
+ assert($module_service instanceof ModuleService);
+
+ $module = $module_service
+ ->findByComponent(ModuleListInterface::class, $this->tree, Auth::user())
+ ->first(static fn (ModuleInterface $module): bool => $module instanceof IndividualListModule);
if ($type === 'list') {
return view('lists/surnames-bullet-list', [
diff --git a/app/Statistics/Repository/ServerRepository.php b/app/Statistics/Repository/ServerRepository.php
index 19be90ed93..c29df81dbb 100644
--- a/app/Statistics/Repository/ServerRepository.php
+++ b/app/Statistics/Repository/ServerRepository.php
@@ -21,7 +21,6 @@ namespace Fisharebest\Webtrees\Statistics\Repository;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
-use Fisharebest\Webtrees\Site;
use Fisharebest\Webtrees\SiteUser;
use Fisharebest\Webtrees\Statistics\Repository\Interfaces\ServerRepositoryInterface;
diff --git a/app/Tree.php b/app/Tree.php
index ddc6a605d6..80fa5e6d12 100644
--- a/app/Tree.php
+++ b/app/Tree.php
@@ -30,7 +30,9 @@ use League\Flysystem\FilesystemOperator;
use function app;
use function array_key_exists;
+use function assert;
use function date;
+use function is_string;
use function str_starts_with;
use function strtoupper;
use function substr_replace;
@@ -389,7 +391,10 @@ class Tree
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
$record = Registry::gedcomRecordFactory()->new($xref, $gedcom, null, $this);
- app(PendingChangesService::class)->acceptRecord($record);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($record);
return $record;
}
@@ -432,7 +437,10 @@ class Tree
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
$record = Registry::familyFactory()->new($xref, $gedcom, null, $this);
- app(PendingChangesService::class)->acceptRecord($record);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($record);
return $record;
}
@@ -475,7 +483,10 @@ class Tree
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
$record = Registry::individualFactory()->new($xref, $gedcom, null, $this);
- app(PendingChangesService::class)->acceptRecord($record);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($record);
return $record;
}
@@ -518,7 +529,10 @@ class Tree
if (Auth::user()->getPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS) === '1') {
$record = Registry::mediaFactory()->new($xref, $gedcom, null, $this);
- app(PendingChangesService::class)->acceptRecord($record);
+ $pending_changes_service = app(PendingChangesService::class);
+ assert($pending_changes_service instanceof PendingChangesService);
+
+ $pending_changes_service->acceptRecord($record);
return $record;
}
@@ -562,11 +576,13 @@ class Tree
$individual = Registry::individualFactory()->make($this->getPreference('PEDIGREE_ROOT_ID'), $this);
}
if ($individual === null) {
- $xref = (string) DB::table('individuals')
+ $xref = DB::table('individuals')
->where('i_file', '=', $this->id())
->min('i_id');
- $individual = Registry::individualFactory()->make($xref, $this);
+ if (is_string($xref)) {
+ $individual = Registry::individualFactory()->make($xref, $this);
+ }
}
if ($individual === null) {
// always return a record
diff --git a/app/TreeUser.php b/app/TreeUser.php
index c268e0f8ba..de2b7ab723 100644
--- a/app/TreeUser.php
+++ b/app/TreeUser.php
@@ -22,6 +22,8 @@ namespace Fisharebest\Webtrees;
use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Services\UserService;
+use function assert;
+
/**
* A tree can act as a user, for example to send email.
*/
@@ -57,6 +59,8 @@ class TreeUser implements UserInterface
public function email(): string
{
$user_service = app(UserService::class);
+ assert($user_service instanceof UserService);
+
$contact_id = (int) $this->getPreference('CONTACT_USER_ID');
if ($contact_id !== 0) {
diff --git a/app/User.php b/app/User.php
index c091297863..ada09e242c 100644
--- a/app/User.php
+++ b/app/User.php
@@ -23,6 +23,8 @@ use Closure;
use Fisharebest\Webtrees\Contracts\UserInterface;
use Illuminate\Database\Capsule\Manager as DB;
+use function is_string;
+
/**
* Provide an interface to the wt_user table.
*/
@@ -235,7 +237,7 @@ class User implements UserInterface
->where('user_id', '=', $this->id())
->value('password');
- if ($password_hash !== null && password_verify($password, $password_hash)) {
+ if (is_string($password_hash) && password_verify($password, $password_hash)) {
if (password_needs_rehash($password_hash, PASSWORD_DEFAULT)) {
$this->setPassword($password);
}
diff --git a/app/Validator.php b/app/Validator.php
index 3423cb6db3..c71674c8b8 100644
--- a/app/Validator.php
+++ b/app/Validator.php
@@ -19,7 +19,9 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees;
+use Aura\Router\Route;
use Closure;
+use Fisharebest\Webtrees\Contracts\UserInterface;
use Fisharebest\Webtrees\Http\Exceptions\HttpBadRequestException;
use LogicException;
use Psr\Http\Message\ServerRequestInterface;
@@ -38,7 +40,7 @@ use function str_starts_with;
*/
class Validator
{
- /** @var array<string|array<string>> */
+ /** @var array<string|Tree|UserInterface|array<string>> */
private array $parameters;
/** @var array<Closure> */
@@ -57,6 +59,16 @@ class Validator
*
* @return self
*/
+ public static function attributes(ServerRequestInterface $request): self
+ {
+ return new self($request->getAttributes());
+ }
+
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return self
+ */
public static function parsedBody(ServerRequestInterface $request): self
{
return new self((array) $request->getParsedBody());
@@ -73,6 +85,16 @@ class Validator
}
/**
+ * @param ServerRequestInterface $request
+ *
+ * @return self
+ */
+ public static function serverParams(ServerRequestInterface $request): self
+ {
+ return new self($request->getServerParams());
+ }
+
+ /**
* @param int $minimum
* @param int $maximum
*
@@ -140,6 +162,22 @@ class Validator
/**
* @return $this
*/
+ public function isTag(): self
+ {
+ $this->rules[] = static function (?string $value): ?string {
+ if (is_string($value) && preg_match('/^' . Gedcom::REGEX_TAG . '$/', $value) === 1) {
+ return $value;
+ }
+
+ return null;
+ };
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
public function isXref(): self
{
$this->rules[] = static function (?string $value): ?string {
@@ -158,7 +196,7 @@ class Validator
*
* @return array<string>|null
*/
- public function array(string $parameter): ?array
+ public function optionalArray(string $parameter): ?array
{
$value = $this->parameters[$parameter] ?? null;
@@ -176,7 +214,7 @@ class Validator
*
* @return int|null
*/
- public function integer(string $parameter): ?int
+ public function optionalInteger(string $parameter): ?int
{
$value = $this->parameters[$parameter] ?? null;
@@ -196,7 +234,7 @@ class Validator
*
* @return string|null
*/
- public function string(string $parameter): ?string
+ public function optionalString(string $parameter): ?string
{
$value = $this->parameters[$parameter] ?? null;
@@ -210,29 +248,80 @@ class Validator
}
/**
+ * @param string $parameter
+ * @param bool|null $default
+ *
+ * @return bool
+ */
+ public function boolean(string $parameter, bool $default = null): bool
+ {
+ $value = $this->parameters[$parameter] ?? null;
+
+ if (in_array($value, ['1', true], true)) {
+ return true;
+ }
+
+ if (in_array($value, ['0', '', false], true)) {
+ return false;
+ }
+
+ if ($default === null) {
+ throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ }
+
+ return $default;
+ }
+
+ /**
* @param string $parameter
*
* @return array<string>
*/
- public function requiredArray(string $parameter): array
+ public function array(string $parameter): array
{
- $value = $this->array($parameter);
+ $value = $this->parameters[$parameter] ?? null;
- if ($value === null) {
- throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ if (!is_array($value)) {
+ $value = null;
}
+ $callback = static fn (?array $value, Closure $rule): ?array => $rule($value);
+
+ $value = array_reduce($this->rules, $callback, $value);
+ $value ??= [];
+
+ $check_utf8 = static function($v, $k) use ($parameter) {
+ if (is_string($k) && !preg_match('//u', $k) || is_string($v) && !preg_match('//u', $v)) {
+ throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ }
+ };
+
+ array_walk_recursive($value, $check_utf8);
+
return $value;
}
/**
- * @param string $parameter
+ * @param string $parameter
+ * @param int|null $default
*
* @return int
*/
- public function requiredInteger(string $parameter): int
+ public function integer(string $parameter, int $default = null): int
{
- $value = $this->integer($parameter);
+ $value = $this->parameters[$parameter] ?? null;
+
+ if (is_string($value) && ctype_digit($value)) {
+ $value = (int) $value;
+ } else {
+ $value = null;
+ }
+
+ $callback = static fn (?int $value, Closure $rule): ?int => $rule($value);
+
+ $value = array_reduce($this->rules, $callback, $value);
+
+ $value ??= $default;
if ($value === null) {
throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
@@ -244,16 +333,90 @@ class Validator
/**
* @param string $parameter
*
+ * @return Route
+ */
+ public function route(string $parameter = 'route'): Route
+ {
+ $value = $this->parameters[$parameter] ?? null;
+
+ if ($value instanceof Route) {
+ return $value;
+ }
+
+ throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ }
+
+ /**
+ * @param string $parameter
+ * @param string|null $default
+ *
* @return string
*/
- public function requiredString(string $parameter): string
+ public function string(string $parameter, string $default = null): string
{
- $value = $this->string($parameter);
+ $value = $this->parameters[$parameter] ?? null;
- if ($value === null) {
+ if (!is_string($value)) {
+ $value = null;
+ }
+
+ $callback = static fn (?string $value, Closure $rule): ?string => $rule($value);
+
+ $value = array_reduce($this->rules, $callback, $value);
+ $value ??= $default;
+
+ if ($value === null || preg_match('//u', $value) !== 1) {
throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
}
return $value;
}
+
+ /**
+ * @param string $parameter
+ *
+ * @return Tree
+ */
+ public function tree(string $parameter = 'tree'): Tree
+ {
+ $value = $this->parameters[$parameter] ?? null;
+
+ if ($value instanceof Tree) {
+ return $value;
+ }
+
+ throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ }
+
+ /**
+ * @param string $parameter
+ *
+ * @return Tree|null
+ */
+ public function treeOptional(string $parameter = 'tree'): ?Tree
+ {
+ $value = $this->parameters[$parameter] ?? null;
+
+ if ($value === null || $value instanceof Tree) {
+ return $value;
+ }
+
+ throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ }
+
+ /**
+ * @param string $parameter
+ *
+ * @return UserInterface
+ */
+ public function user(string $parameter = 'user'): UserInterface
+ {
+ $value = $this->parameters[$parameter] ?? null;
+
+ if ($value instanceof UserInterface) {
+ return $value;
+ }
+
+ throw new HttpBadRequestException(I18N::translate('The parameter “%s” is missing.', $parameter));
+ }
}