Aangepaste notificatiekanalen in een package en verificatie van de bezorging
Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.
Pagina voorlezenongeveer 7 min
Wanneer je vanuit een package extra manieren wilt bieden om notificaties te bezorgen, ontwerp je de keuze van het kanaal en het bepalen van de bestemming los van elkaar. Op deze pagina gebruiken we een klein kanaal dat operationele gebeurtenissen naar de log schrijft als voorbeeld, en leggen we uit via welk pad de klassen uit je package worden geresolved en welke verificatie nodig is bij updates. Ook als je dit vervangt door verzending naar een externe dienst, blijft de verdeling van verantwoordelijkheden tussen kanaal en notificatie hetzelfde.Deze pagina is gecontroleerd aan de hand van de implementatie van Laravel Framework v13.38.0. Zie Notificaties voor de basisbewerkingen van notificaties en Packages testen voor de testomgeving van een package.
De klassenaam is de bezorgwijze, de route is de bestemming
De kanaalklassenaam die je uit via() teruggeeft, bepaalt van welk object send() wordt aangeroepen. De waarde die je uit routeNotificationFor() ophaalt, is daarentegen de bestemming die dat kanaal gebruikt. De twee hoeven niet dezelfde naam te hebben.
Plaats
Voorbeeld op deze pagina
Rol
via() van de notificatie
OperationsLogChannel::class
Resolven van het kanaal en bezorgen
Route van het notifiable object
operationsLog → operations
Bestemming die binnen het kanaal wordt gebruikt
viaQueues() van de notificatie
OperationsLogChannel::class → operations-log
Bestemming van de job wanneer je in de wachtrij plaatst
NotificationSender geeft de kanaalnaam die via() heeft gekozen door aan ChannelManager::driver(). Als ChannelManager de naam niet vindt bij de ingebouwde of geregistreerde namen en de naam een bestaande klasse is, resolvet hij die klasse via de container. Als je het kanaal alleen via de klassenaam gebruikt, heb je geen Notification::extend() of service provider in je package nodig. Zorg er wel voor dat de klasse via de autoload van Composer gevonden wordt en dat de container de afhankelijkheden van de constructor kan resolven.
Het voorbeeldpackage Acme\OperationsLog legt gebeurtenisnamen zonder gevoelige informatie vast, samen met de naam van het operationele team dat de notificatie ontvangt. In een Laravel-applicatie is Psr\Log\LoggerInterface gekoppeld aan de logservice, dus je kunt deze via de constructor ontvangen.
<?phpnamespace Acme\OperationsLog;use Illuminate\Notifications\Notification;use InvalidArgumentException;use Psr\Log\LoggerInterface;final class OperationsLogChannel{ public function __construct(private readonly LoggerInterface $logger) { } public function send(object $notifiable, Notification $notification): void { $destination = $notifiable->routeNotificationFor('operationsLog', $notification); if (! is_string($destination) || $destination === '') { throw new InvalidArgumentException('Operations log destination is required.'); } $this->logger->info('Operations notification', [ 'destination' => $destination, 'event' => $notification->toOperationsLog($notifiable), ]); }}
Het ontvangen object is naar verwachting een model dat de trait Notifiable gebruikt, of een on-demand bestemming die Notification::route() aanmaakt. In het eerste geval wordt de waarde van routeNotificationForOperationsLog() teruggegeven, in het tweede geval de waarde die met route('operationsLog', ...) is geregistreerd. Om te voorkomen dat een notificatie zonder bestemming als bezorgd wordt behandeld, gooit dit voorbeeld een exception. Ook als je dit vervangt door echte externe bezorging, controleer je de bestemming en het verzendresultaat, en ontwerp je het zo dat fouten niet stilletjes als succes worden behandeld.
Neem geen toegangstokens of persoonsgegevens op in de gebeurtenisnamen of bestemmingen die je naar de log schrijft. Dit voorbeeld is een logverzending om het resolven van kanalen en het testen te laten zien, en geen implementatie van bezorging naar een externe dienst.
Notificatie en bestemming definiëren aan de kant van de gebruiker
De notificatie in de applicatie geeft de kanaalklasse terug en definieert alleen het bericht dat aan het kanaal wordt doorgegeven. Met ShouldQueue en Queueable loopt een gewone aanroep van notify() via de wachtrij.
<?phpnamespace App\Notifications;use Acme\OperationsLog\OperationsLogChannel;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Notifications\Notification;class HealthCheckPassed extends Notification implements ShouldQueue{ use Queueable; public function via(object $notifiable): array { return [OperationsLogChannel::class]; } public function toOperationsLog(object $notifiable): string { return 'health-check-passed'; } public function viaQueues(): array { return [OperationsLogChannel::class => 'operations-log']; }}
Als je de bestemming ter plekke opgeeft, is de sleutel van Notification::route()niet de kanaalklassenaam, maar de sleutel van routeNotificationFor('operationsLog', ...) die binnen het kanaal wordt aangeroepen.
use App\Notifications\HealthCheckPassed;use Illuminate\Support\Facades\Notification;Notification::route('operationsLog', 'operations') ->notify(new HealthCheckPassed());
Wil je vanuit een model in de applicatie verzenden, voeg dan de volgende methode toe aan het model dat Notifiable gebruikt.
use Illuminate\Notifications\Notification;public function routeNotificationForOperationsLog(Notification $notification): string{ return 'operations';}
Ook met $user->notify(new HealthCheckPassed()) op dit model wordt hetzelfde kanaal gekozen. Configureer een wachtrijverbinding en start een worker die de wachtrij operations-log verwerkt.
php artisan queue:work --queue=operations-log
OperationsLogChannel zelf wordt per kanaal in de Manager vastgehouden. Sla de bestemming of de inhoud van de notificatie daarom niet op in properties van het kanaal, maar haal ze bij elke aanroep uit de argumenten van send(). Zo neemt ook een langlopende queue worker geen gegevens van een vorige notificatie mee.
Alleen als je gebruikers in via() een korte naam wilt laten opgeven in plaats van een klassenaam, gebruik je Notification::extend() in de gewone service provider van je package.
<?phpnamespace Acme\OperationsLog;use Illuminate\Support\Facades\Notification;use Illuminate\Support\ServiceProvider;class OperationsLogServiceProvider extends ServiceProvider{ public function boot(): void { Notification::extend( 'acme-operations-log', fn ($app) => $app->make(OperationsLogChannel::class), ); }}
Laat de provider laden voordat de bezorging begint, bijvoorbeeld via automatische packagedetectie. In notificaties die de alias kiezen, verander je via() in ['acme-operations-log'] en gebruik je dezelfde naam als sleutel in viaQueues(). operationsLog voor het ophalen van de bestemming is een aparte sleutel en hoeft niet te veranderen. Kies een naam die niet botst met de namen van ingebouwde kanalen.De Manager houdt geresolvede kanalen per naam vast. Als je de aanmaakroutine van de alias in hetzelfde proces opnieuw registreert, wordt een al aangemaakte instantie niet vervangen. Verifieer wijzigingen in de registratie ook in een nieuw opgestarte applicatie of worker.
Notification::fake() is bedoeld om de intentie om een notificatie te verzenden te verifiëren. Je kunt er niet mee controleren of send() van het kanaal en het ophalen van de route werken. Gebruik voor het testen van de bezorging de echte notificatiemanager en vervang LoggerInterface door een testversie.Het volgende voorbeeld draait vanuit de TestCase van Testbench. Met notifyNow() kun je de verwerking van het kanaal uitvoeren zonder een worker te starten, ook voor een ShouldQueue-notificatie.
<?phpnamespace Acme\OperationsLog\Tests;use Acme\OperationsLog\OperationsLogChannel;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Notifications\Notification as BaseNotification;use Illuminate\Support\Facades\Notification;use Orchestra\Testbench\TestCase;use Psr\Log\LoggerInterface;class OperationsLogChannelTest extends TestCase{ public function test_channel_writes_the_routed_event(): void { $notification = new class extends BaseNotification implements ShouldQueue { use Queueable; public function via(object $notifiable): array { return [OperationsLogChannel::class]; } public function toOperationsLog(object $notifiable): string { return 'health-check-passed'; } }; $logger = $this->createMock(LoggerInterface::class); $logger->expects($this->once())->method('info')->with( 'Operations notification', ['destination' => 'operations', 'event' => 'health-check-passed'], ); $this->app->instance(LoggerInterface::class, $logger); Notification::route('operationsLog', 'operations')->notifyNow($notification); }}
Controleer daarnaast dat er een exception optreedt als er geen bestemming is, en dat een alias, als je die aanbiedt, vanaf een nieuwe start kan worden geresolved. Gebruik je het kanaal via de wachtrij, test dan ook in een aparte verificatieapplicatie met een draaiende queue worker dat jobs in de wachtrij operations-log aankomen en worden verwerkt.NotificationSender splitst een ShouldQueue-notificatie per kanaal op in jobs en kiest de wachtrij aan de hand van de sleutels van viaQueues(). Als send() van het kanaal een exception gooit, vuurt hij NotificationFailed af en gooit de exception opnieuw. Keert send() normaal terug, dan vuurt hij NotificationSent af. De instellingen voor nieuwe pogingen in de wachtrij volgen de configuratie van de applicatie. Let op: als je exceptions binnen het kanaal stilletjes afvangt, wordt een mislukte bezorging als succes behandeld.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Knowledge of Laravel","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146","dark":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/dark.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=a8a0340d86ff8aa90e9adfc98a0362d7","href":"/"},"favicon":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/favicon.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=8f5a03a681c95d31803fc237b5811065","api":{"playground":{"display":"simple"}},"navbar":{},"footer":{"socials":{"github":"https://github.com/invokable"}},"seo":{"metatags":{"canonical":"https://kawax.biz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"jp","default":true,"href":"jp/packages/laravel-boost-copilot-cli"},{"language":"en","href":"en/packages/laravel-boost-copilot-cli"},{"language":"de","href":"de/packages/laravel-boost-copilot-cli"},{"language":"es","href":"es/packages/laravel-boost-copilot-cli"},{"language":"fr","href":"fr/packages/laravel-boost-copilot-cli"},{"language":"it","href":"it/packages/laravel-boost-copilot-cli"},{"language":"ko","href":"ko/packages/laravel-boost-copilot-cli"},{"language":"nl","href":"nl/packages/laravel-boost-copilot-cli"},{"language":"zh-Hans","href":"zh-CN/packages/laravel-boost-copilot-cli"},{"language":"zh-Hant","href":"zh-TW/packages/laravel-boost-copilot-cli"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"invokable","hasAudioNarration":true,"actualSubdomain":"invokable","customDomains":["kawax.biz"],"gitSource":{"type":"github","owner":"kawax","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af4f8bb899645a1d83de491","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"en","tag":"My Packages","count":145},{"language":"jp","tag":"マイパッケージ","count":145},{"language":"de","tag":"Meine Pakete","count":100},{"language":"es","tag":"Mis paquetes","count":100},{"language":"fr","tag":"Mes packages","count":100},{"language":"it","tag":"I miei pacchetti","count":100},{"language":"ko","tag":"My 패키지","count":100},{"language":"nl","tag":"Mijn packages","count":100},{"language":"zh-Hans","tag":"我的包","count":100},{"language":"zh-Hant","tag":"我的套件","count":100},{"language":"de","tag":"Fortgeschrittene Themen","count":82},{"language":"en","tag":"Advanced Topics","count":82},{"language":"es","tag":"Temas avanzados","count":82},{"language":"fr","tag":"Sujets avancés","count":82},{"language":"it","tag":"Argomenti avanzati","count":82},{"language":"jp","tag":"応用トピック","count":82},{"language":"ko","tag":"심화 주제","count":82},{"language":"nl","tag":"Geavanceerde onderwerpen","count":82},{"language":"zh-Hans","tag":"进阶主题","count":82},{"language":"zh-Hant","tag":"進階主題","count":82},{"language":"en","tag":"VOICEVOX","count":67},{"language":"jp","tag":"VOICEVOX","count":67},{"language":"de","tag":"Leitfaden","count":61},{"language":"en","tag":"Guide","count":61},{"language":"es","tag":"Guía","count":61},{"language":"fr","tag":"Guide","count":61},{"language":"it","tag":"Guida","count":61},{"language":"jp","tag":"ガイド","count":61},{"language":"ko","tag":"가이드","count":61},{"language":"nl","tag":"Gids","count":61},{"language":"zh-Hans","tag":"指南","count":61},{"language":"zh-Hant","tag":"指南","count":61},{"language":"de","tag":"Blog","count":47},{"language":"en","tag":"Blog","count":47},{"language":"es","tag":"Blog","count":47},{"language":"fr","tag":"Blog","count":47},{"language":"it","tag":"Blog","count":47},{"language":"jp","tag":"ブログ","count":47},{"language":"ko","tag":"블로그","count":47},{"language":"nl","tag":"Blog","count":47},{"language":"zh-Hans","tag":"博客","count":47},{"language":"zh-Hant","tag":"部落格","count":47},{"language":"en","tag":"VOICEVOX Engine API Reference","count":45},{"language":"jp","tag":"VOICEVOXエンジンAPIリファレンス","count":45},{"language":"de","tag":"Paketentwicklung","count":43},{"language":"de","tag":"GitHub Copilot","count":43},{"language":"en","tag":"Package Development","count":43},{"language":"en","tag":"GitHub Copilot","count":43},{"language":"es","tag":"Desarrollo de paquetes","count":43},{"language":"es","tag":"GitHub Copilot","count":43},{"language":"fr","tag":"Développement de packages","count":43},{"language":"fr","tag":"GitHub Copilot","count":43},{"language":"it","tag":"Sviluppo di pacchetti","count":43},{"language":"it","tag":"GitHub Copilot","count":43},{"language":"jp","tag":"パッケージ開発","count":43},{"language":"jp","tag":"GitHub Copilot","count":43},{"language":"ko","tag":"패키지 개발","count":43},{"language":"ko","tag":"GitHub Copilot","count":43},{"language":"nl","tag":"Package-ontwikkeling","count":43},{"language":"nl","tag":"GitHub Copilot","count":43},{"language":"zh-Hans","tag":"包开发","count":43},{"language":"zh-Hans","tag":"GitHub Copilot","count":43},{"language":"zh-Hant","tag":"套件開發","count":43},{"language":"zh-Hant","tag":"GitHub Copilot","count":43},{"language":"de","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"en","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"es","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"fr","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"it","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"jp","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"ko","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"nl","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hans","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hant","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"de","tag":"Tutorial","count":35},{"language":"en","tag":"Tutorial","count":35},{"language":"es","tag":"Tutorial","count":35},{"language":"fr","tag":"Tutoriel","count":35},{"language":"it","tag":"Tutorial","count":35},{"language":"jp","tag":"チュートリアル","count":35},{"language":"ko","tag":"튜토리얼","count":35},{"language":"nl","tag":"Tutorial","count":35},{"language":"zh-Hans","tag":"教程","count":35},{"language":"zh-Hant","tag":"教學","count":35},{"language":"de","tag":"SDK","count":27},{"language":"es","tag":"SDK","count":27},{"language":"fr","tag":"SDK","count":27},{"language":"it","tag":"SDK","count":27},{"language":"ko","tag":"SDK","count":27},{"language":"nl","tag":"SDK","count":27},{"language":"zh-Hans","tag":"SDK","count":27},{"language":"zh-Hant","tag":"SDK","count":27},{"language":"de","tag":"VOICEVOX","count":22},{"language":"es","tag":"VOICEVOX","count":22},{"language":"fr","tag":"VOICEVOX","count":22},{"language":"it","tag":"VOICEVOX","count":22},{"language":"ko","tag":"VOICEVOX","count":22},{"language":"nl","tag":"VOICEVOX","count":22},{"language":"zh-Hans","tag":"VOICEVOX","count":22},{"language":"zh-Hant","tag":"VOICEVOX","count":22}],"searchSettings":{"isFiltersEnabled":false,"showContentSnippets":true,"fullPageSearch":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"nl/advanced/package-notification-channels","slug":"/nl/advanced/package-notification-channels","pageMetadata":{"title":"Aangepaste notificatiekanalen in een package en verificatie van de bezorging","description":"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.","href":"/nl/advanced/package-notification-channels"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Wanneer je vanuit een package extra manieren wilt bieden om notificaties te bezorgen, ontwerp je `,_jsx(_components.strong,{children:`de keuze van het kanaal`}),` en `,_jsx(_components.strong,{children:`het bepalen van de bestemming`}),` los van elkaar. Op deze pagina gebruiken we een klein kanaal dat operationele gebeurtenissen naar de log schrijft als voorbeeld, en leggen we uit via welk pad de klassen uit je package worden geresolved en welke verificatie nodig is bij updates. Ook als je dit vervangt door verzending naar een externe dienst, blijft de verdeling van verantwoordelijkheden tussen kanaal en notificatie hetzelfde.`]}),`\n`,_jsxs(_components.p,{children:[`Deze pagina is gecontroleerd aan de hand van de implementatie van Laravel Framework `,_jsx(_components.code,{children:`v13.38.0`}),`. Zie `,_jsx(_components.a,{href:`/nl/notifications`,children:`Notificaties`}),` voor de basisbewerkingen van notificaties en `,_jsx(_components.a,{href:`/nl/advanced/package-testing`,children:`Packages testen`}),` voor de testomgeving van een package.`]}),`\n`,_jsx(Heading,{level:`2`,id:`de-klassenaam-is-de-bezorgwijze-de-route-is-de-bestemming`,children:`De klassenaam is de bezorgwijze, de route is de bestemming`}),`\n`,_jsxs(_components.p,{children:[`De kanaalklassenaam die je uit `,_jsx(_components.code,{children:`via()`}),` teruggeeft, bepaalt van welk object `,_jsx(_components.code,{children:`send()`}),` wordt aangeroepen. De waarde die je uit `,_jsx(_components.code,{children:`routeNotificationFor()`}),` ophaalt, is daarentegen de bestemming die dat kanaal gebruikt. De twee hoeven niet dezelfde naam te hebben.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Plaats`}),_jsx(_components.th,{children:`Voorbeeld op deze pagina`}),_jsx(_components.th,{children:`Rol`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`via()`}),` van de notificatie`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`OperationsLogChannel::class`})}),_jsx(_components.td,{children:`Resolven van het kanaal en bezorgen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Route van het notifiable object`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`operationsLog`}),` → `,_jsx(_components.code,{children:`operations`})]}),_jsx(_components.td,{children:`Bestemming die binnen het kanaal wordt gebruikt`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`viaQueues()`}),` van de notificatie`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`OperationsLogChannel::class`}),` → `,_jsx(_components.code,{children:`operations-log`})]}),_jsx(_components.td,{children:`Bestemming van de job wanneer je in de wachtrij plaatst`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`NotificationSender`}),` geeft de kanaalnaam die `,_jsx(_components.code,{children:`via()`}),` heeft gekozen door aan `,_jsx(_components.code,{children:`ChannelManager::driver()`}),`. Als `,_jsx(_components.code,{children:`ChannelManager`}),` de naam niet vindt bij de ingebouwde of geregistreerde namen en de naam een bestaande klasse is, resolvet hij die klasse via de container. `,_jsxs(_components.strong,{children:[`Als je het kanaal alleen via de klassenaam gebruikt, heb je geen `,_jsx(_components.code,{children:`Notification::extend()`}),` of service provider in je package nodig.`]}),` Zorg er wel voor dat de klasse via de autoload van Composer gevonden wordt en dat de container de afhankelijkheden van de constructor kan resolven.`]}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n A[\"Klassenaam kiezen in via()\"] --> B[\"ChannelManager::driver()\"]\n B --> C{\"Al geresolved?\"}\n C -->|Ja| D[\"Vastgehouden kanaal\"]\n C -->|Nee| E[\"Aanmaken via de container\"]\n E --> D\n D --> F[\"Bestemming ophalen en bezorgen in send()\"]`}),`\n`,_jsx(Heading,{level:`2`,id:`het-kanaal-zelf-vanuit-het-package-leveren`,children:`Het kanaal zelf vanuit het package leveren`}),`\n`,_jsxs(_components.p,{children:[`Het voorbeeldpackage `,_jsx(_components.code,{children:`Acme\\\\OperationsLog`}),` legt gebeurtenisnamen zonder gevoelige informatie vast, samen met de naam van het operationele team dat de notificatie ontvangt. In een Laravel-applicatie is `,_jsx(_components.code,{children:`Psr\\\\Log\\\\LoggerInterface`}),` gekoppeld aan de logservice, dus je kunt deze via de constructor ontvangen.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Acme\\\\OperationsLog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Notifications\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` InvalidArgumentException`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Psr\\\\Log\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LoggerInterface`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`final`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` OperationsLogChannel`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` __construct`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`private`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` readonly`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` LoggerInterface`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $logger`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` send`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notifiable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $destination`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notifiable`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`routeNotificationFor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'operationsLog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` is_string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$destination`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`||`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $destination`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ''`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` throw`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` InvalidArgumentException`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Operations log destination is required.'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`logger`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`info`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Operations notification'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'destination'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $destination`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'event'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toOperationsLog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$notifiable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]);`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Het ontvangen object is naar verwachting een model dat de trait `,_jsx(_components.code,{children:`Notifiable`}),` gebruikt, of een on-demand bestemming die `,_jsx(_components.code,{children:`Notification::route()`}),` aanmaakt. In het eerste geval wordt de waarde van `,_jsx(_components.code,{children:`routeNotificationForOperationsLog()`}),` teruggegeven, in het tweede geval de waarde die met `,_jsx(_components.code,{children:`route('operationsLog', ...)`}),` is geregistreerd. Om te voorkomen dat een notificatie zonder bestemming als bezorgd wordt behandeld, gooit dit voorbeeld een exception. Ook als je dit vervangt door echte externe bezorging, controleer je de bestemming en het verzendresultaat, en ontwerp je het zo dat fouten niet stilletjes als succes worden behandeld.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Neem geen toegangstokens of persoonsgegevens op in de gebeurtenisnamen of bestemmingen die je naar de log schrijft. Dit voorbeeld is een logverzending om het resolven van kanalen en het testen te laten zien, en geen implementatie van bezorging naar een externe dienst.`})}),`\n`,_jsx(Heading,{level:`2`,id:`notificatie-en-bestemming-definiëren-aan-de-kant-van-de-gebruiker`,children:`Notificatie en bestemming definiëren aan de kant van de gebruiker`}),`\n`,_jsxs(_components.p,{children:[`De notificatie in de applicatie geeft de kanaalklasse terug en definieert alleen het bericht dat aan het kanaal wordt doorgegeven. Met `,_jsx(_components.code,{children:`ShouldQueue`}),` en `,_jsx(_components.code,{children:`Queueable`}),` loopt een gewone aanroep van `,_jsx(_components.code,{children:`notify()`}),` via de wachtrij.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` App\\\\Notifications`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Acme\\\\OperationsLog\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OperationsLogChannel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Bus\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Queueable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Contracts\\\\Queue\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ShouldQueue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Notifications\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` HealthCheckPassed`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` implements`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ShouldQueue`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Queueable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` via`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notifiable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` array`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OperationsLogChannel`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` toOperationsLog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notifiable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` string`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'health-check-passed'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` viaQueues`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` array`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OperationsLogChannel`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'operations-log'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Als je de bestemming ter plekke opgeeft, is de sleutel van `,_jsx(_components.code,{children:`Notification::route()`}),` `,_jsx(_components.strong,{children:`niet de kanaalklassenaam`}),`, maar de sleutel van `,_jsx(_components.code,{children:`routeNotificationFor('operationsLog', ...)`}),` die binnen het kanaal wordt aangeroepen.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` App\\\\Notifications\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`HealthCheckPassed`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`route`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'operationsLog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'operations'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`notify`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` HealthCheckPassed`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Wil je vanuit een model in de applicatie verzenden, voeg dan de volgende methode toe aan het model dat `,_jsx(_components.code,{children:`Notifiable`}),` gebruikt.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Notifications\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` routeNotificationForOperationsLog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` string`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'operations'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Ook met `,_jsx(_components.code,{children:`$user->notify(new HealthCheckPassed())`}),` op dit model wordt hetzelfde kanaal gekozen. Configureer een wachtrijverbinding en start een worker die de wachtrij `,_jsx(_components.code,{children:`operations-log`}),` verwerkt.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`php`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` artisan`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` queue:work`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --queue=operations-log`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`OperationsLogChannel`}),` zelf wordt per kanaal in de Manager vastgehouden. `,_jsx(_components.strong,{children:`Sla de bestemming of de inhoud van de notificatie daarom niet op in properties van het kanaal`}),`, maar haal ze bij elke aanroep uit de argumenten van `,_jsx(_components.code,{children:`send()`}),`. Zo neemt ook een langlopende queue worker geen gegevens van een vorige notificatie mee.`]}),`\n`,_jsx(Heading,{level:`2`,id:`als-je-een-korte-alias-nodig-hebt`,children:`Als je een korte alias nodig hebt`}),`\n`,_jsxs(_components.p,{children:[`Alleen als je gebruikers in `,_jsx(_components.code,{children:`via()`}),` een korte naam wilt laten opgeven in plaats van een klassenaam, gebruik je `,_jsx(_components.code,{children:`Notification::extend()`}),` in de gewone service provider van je package.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Acme\\\\OperationsLog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ServiceProvider`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` OperationsLogServiceProvider`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ServiceProvider`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` boot`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`extend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'acme-operations-log'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` fn`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) => `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$app`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`make`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OperationsLogChannel`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Laat de provider laden voordat de bezorging begint, bijvoorbeeld via `,_jsx(_components.a,{href:`/nl/advanced/package-discovery`,children:`automatische packagedetectie`}),`. In notificaties die de alias kiezen, verander je `,_jsx(_components.code,{children:`via()`}),` in `,_jsx(_components.code,{children:`['acme-operations-log']`}),` en gebruik je dezelfde naam als sleutel in `,_jsx(_components.code,{children:`viaQueues()`}),`. `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`operationsLog`}),` voor het ophalen van de bestemming is een aparte sleutel`]}),` en hoeft niet te veranderen. Kies een naam die niet botst met de namen van ingebouwde kanalen.`]}),`\n`,_jsx(_components.p,{children:`De Manager houdt geresolvede kanalen per naam vast. Als je de aanmaakroutine van de alias in hetzelfde proces opnieuw registreert, wordt een al aangemaakte instantie niet vervangen. Verifieer wijzigingen in de registratie ook in een nieuw opgestarte applicatie of worker.`}),`\n`,_jsx(Heading,{level:`2`,id:`de-bezorging-los-van-fake-testen`,children:`De bezorging los van fake testen`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Notification::fake()`}),` is bedoeld om de `,_jsx(_components.strong,{children:`intentie`}),` om een notificatie te verzenden te verifiëren. Je kunt er niet mee controleren of `,_jsx(_components.code,{children:`send()`}),` van het kanaal en het ophalen van de route werken. Gebruik voor het testen van de bezorging de echte notificatiemanager en vervang `,_jsx(_components.code,{children:`LoggerInterface`}),` door een testversie.`]}),`\n`,_jsxs(_components.p,{children:[`Het volgende voorbeeld draait vanuit `,_jsxs(_components.a,{href:`/nl/advanced/package-testing`,children:[`de `,_jsx(_components.code,{children:`TestCase`}),` van Testbench`]}),`. Met `,_jsx(_components.code,{children:`notifyNow()`}),` kun je de verwerking van het kanaal uitvoeren zonder een worker te starten, ook voor een `,_jsx(_components.code,{children:`ShouldQueue`}),`-notificatie.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`41`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`41`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Acme\\\\OperationsLog\\\\Tests`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Acme\\\\OperationsLog\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OperationsLogChannel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Bus\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Queueable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Contracts\\\\Queue\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`ShouldQueue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Notifications\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` as`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` BaseNotification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Orchestra\\\\Testbench\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`TestCase`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Psr\\\\Log\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LoggerInterface`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` OperationsLogChannelTest`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` TestCase`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_channel_writes_the_routed_event`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` class`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` extends`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` BaseNotification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` implements`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ShouldQueue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Queueable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` via`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notifiable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` array`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OperationsLogChannel`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`];`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` toOperationsLog`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $notifiable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` string`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'health-check-passed'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` };`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $logger`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`createMock`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LoggerInterface`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $logger`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`expects`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`$this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`once`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`())`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`method`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'info'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Operations notification'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'destination'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'operations'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'event'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'health-check-passed'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`app`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`instance`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LoggerInterface`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$logger`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Notification`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`route`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'operationsLog'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'operations'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`notifyNow`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$notification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Controleer daarnaast dat er een exception optreedt als er geen bestemming is, en dat een alias, als je die aanbiedt, vanaf een nieuwe start kan worden geresolved. Gebruik je het kanaal via de wachtrij, test dan ook in een aparte verificatieapplicatie met een draaiende queue worker dat jobs in de wachtrij `,_jsx(_components.code,{children:`operations-log`}),` aankomen en worden verwerkt.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`NotificationSender`}),` splitst een `,_jsx(_components.code,{children:`ShouldQueue`}),`-notificatie per kanaal op in jobs en kiest de wachtrij aan de hand van de sleutels van `,_jsx(_components.code,{children:`viaQueues()`}),`. Als `,_jsx(_components.code,{children:`send()`}),` van het kanaal een exception gooit, vuurt hij `,_jsx(_components.code,{children:`NotificationFailed`}),` af en gooit de exception opnieuw. Keert `,_jsx(_components.code,{children:`send()`}),` normaal terug, dan vuurt hij `,_jsx(_components.code,{children:`NotificationSent`}),` af. De instellingen voor nieuwe pogingen in de wachtrij volgen de configuratie van de applicatie. Let op: als je exceptions binnen het kanaal stilletjes afvangt, wordt een mislukte bezorging als succes behandeld.`]}),`\n`,_jsx(Heading,{level:`2`,id:`geraadpleegde-primaire-bronnen`,children:`Geraadpleegde primaire bronnen`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/docs/blob/13.x/notifications.md#custom-channels`,children:`Officiële documentatie van Laravel 13: aangepaste notificatiekanalen en wachtrijen`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/docs/blob/13.x/packages.md#package-discovery`,children:`Officiële documentatie van Laravel 13: automatische packagedetectie`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.38.0/src/Illuminate/Notifications/ChannelManager.php`,children:`ChannelManager: resolven vanuit de klassenaam`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.38.0/src/Illuminate/Notifications/NotificationSender.php`,children:`NotificationSender: bezorging, wachtrijen en events per kanaal`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.38.0/src/Illuminate/Notifications/RoutesNotifications.php`,children:`RoutesNotifications en AnonymousNotifiable: routes naar bestemmingen`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.38.0/src/Illuminate/Support/Manager.php`,children:`Manager: vasthouden en uitbreiden van drivers`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.38.0/src/Illuminate/Foundation/Application.php`,children:`Application: binding van LoggerInterface`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Aangepaste notificatiekanalen in een package en verificatie van de bezorging","description":"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.","href":"/nl/advanced/package-notification-channels"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"De klassenaam is de bezorgwijze, de route is de bestemming","slug":"de-klassenaam-is-de-bezorgwijze-de-route-is-de-bestemming","depth":2,"children":[]},{"title":"Het kanaal zelf vanuit het package leveren","slug":"het-kanaal-zelf-vanuit-het-package-leveren","depth":2,"children":[]},{"title":"Notificatie en bestemming definiëren aan de kant van de gebruiker","slug":"notificatie-en-bestemming-definiëren-aan-de-kant-van-de-gebruiker","depth":2,"children":[]},{"title":"Als je een korte alias nodig hebt","slug":"als-je-een-korte-alias-nodig-hebt","depth":2,"children":[]},{"title":"De bezorging los van fake testen","slug":"de-bezorging-los-van-fake-testen","depth":2,"children":[]},{"title":"Geraadpleegde primaire bronnen","slug":"geraadpleegde-primaire-bronnen","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"narration":{"path":"nl/advanced/package-notification-channels","locale":"nl","estimatedDurationSec":430},"subdomain":"invokable","siteName":"Knowledge of Laravel","title":"Aangepaste notificatiekanalen in een package en verificatie van de bezorging - Knowledge of Laravel","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"jp":{"href":"/jp/advanced/package-notification-channels","matchLevel":1},"en":{"href":"/en/advanced/package-notification-channels","matchLevel":1},"de":{"href":"/de/advanced/package-notification-channels","matchLevel":1},"es":{"href":"/es/advanced/package-notification-channels","matchLevel":1},"fr":{"href":"/fr/advanced/package-notification-channels","matchLevel":1},"it":{"href":"/it/advanced/package-notification-channels","matchLevel":1},"ko":{"href":"/ko/advanced/package-notification-channels","matchLevel":1},"nl":{"href":"/nl/advanced/package-notification-channels","matchLevel":0},"zh-Hans":{"href":"/zh-CN/advanced/package-notification-channels","matchLevel":1},"zh-Hant":{"href":"/zh-TW/advanced/package-notification-channels","matchLevel":1}}},"lastModified":"2026-10-22T22:21:35.005Z","gitLastModified":"2026-10-22T22:21:00.000Z","originalFileLocation":"nl/advanced/package-notification-channels.mdx","locale":"nl"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Aangepaste notificatiekanalen in een package en verificatie van de bezorging - Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:description\" content=\"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://kawax.biz/nl/advanced/package-notification-channels\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://invokable.mintlify.site/_mintlify/api/og/v2?division=Package-ontwikkeling\u0026amp;title=Aangepaste+notificatiekanalen+in+een+package+en+verificatie+van+de+bezorging\u0026amp;description=Lever+notificatiekanalen+van+Laravel+13+vanuit+een+package+en+lees+hoe+resolven+via+de+klassenaam%2C+het+routeren+van+bestemmingen%2C+wachtrijverwerking+en+het+test\u0026amp;theme=cef70bdc0dd1884481ab7c5d\u0026amp;signature=bf32fef6cd9d7a5d2a6f13e316bfb4871c82a63df5b5fcab5699add7624cc085\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Aangepaste notificatiekanalen in een package en verificatie van de bezorging - Knowledge of Laravel\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://invokable.mintlify.site/_mintlify/api/og/v2?division=Package-ontwikkeling\u0026amp;title=Aangepaste+notificatiekanalen+in+een+package+en+verificatie+van+de+bezorging\u0026amp;description=Lever+notificatiekanalen+van+Laravel+13+vanuit+een+package+en+lees+hoe+resolven+via+de+klassenaam%2C+het+routeren+van+bestemmingen%2C+wachtrijverwerking+en+het+test\u0026amp;theme=cef70bdc0dd1884481ab7c5d\u0026amp;signature=bf32fef6cd9d7a5d2a6f13e316bfb4871c82a63df5b5fcab5699add7624cc085\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://kawax.biz/nl/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/nl/advanced/package-notification-channels.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"nl\" href=\"https://kawax.biz/nl/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://kawax.biz/jp/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://kawax.biz/en/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://kawax.biz/de/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://kawax.biz/es/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://kawax.biz/fr/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://kawax.biz/it/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://kawax.biz/ko/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://kawax.biz/zh-CN/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hant\" href=\"https://kawax.biz/zh-TW/advanced/package-notification-channels\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://kawax.biz/jp/advanced/package-notification-channels\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://kawax.biz/#organization\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146\"}},{\"@type\":\"WebSite\",\"@id\":\"https://kawax.biz#website\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://kawax.biz/nl/advanced/package-notification-channels#webpage\",\"url\":\"https://kawax.biz/nl/advanced/package-notification-channels\",\"name\":\"Aangepaste notificatiekanalen in een package en verificatie van de bezorging\",\"description\":\"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.\",\"dateModified\":\"2026-10-22T22:21:00.000Z\",\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"},\"breadcrumb\":{\"@id\":\"https://kawax.biz/nl/advanced/package-notification-channels#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://kawax.biz/nl/advanced/package-notification-channels#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Package-ontwikkeling\",\"item\":\"https://kawax.biz/nl/advanced/package-development\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aangepaste notificatiekanalen in een package en verificatie van de bezorging\",\"item\":\"https://kawax.biz/nl/advanced/package-notification-channels\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://kawax.biz/nl/advanced/package-notification-channels#article\",\"headline\":\"Aangepaste notificatiekanalen in een package en verificatie van de bezorging\",\"name\":\"Aangepaste notificatiekanalen in een package en verificatie van de bezorging\",\"description\":\"Lever notificatiekanalen van Laravel 13 vanuit een package en lees hoe resolven via de klassenaam, het routeren van bestemmingen, wachtrijverwerking en het testen van de echte bezorging werken.\",\"url\":\"https://kawax.biz/nl/advanced/package-notification-channels\",\"mainEntityOfPage\":{\"@id\":\"https://kawax.biz/nl/advanced/package-notification-channels#webpage\"},\"dateModified\":\"2026-10-22T22:21:00.000Z\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"},\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Knowledge of Laravel\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Knowledge of Laravel\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/nl/advanced/package-notification-channels.md","siteName":"Knowledge of Laravel","nav":{"global":null,"languages":[{"language":"jp","default":true,"pages":[{"title":"jp","href":"/jp/advanced/package-notification-channels"}]},{"language":"en","pages":[{"title":"en","href":"/en/advanced/package-notification-channels"}]},{"language":"de","pages":[{"title":"de","href":"/de/advanced/package-notification-channels"}]},{"language":"es","pages":[{"title":"es","href":"/es/advanced/package-notification-channels"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/advanced/package-notification-channels"}]},{"language":"it","pages":[{"title":"it","href":"/it/advanced/package-notification-channels"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/advanced/package-notification-channels"}]},{"language":"nl","tabs":[{"tab":"Mijn packages","pages":[{"title":"Mijn packages","href":"/nl/packages/laravel-boost-copilot-cli"}]},{"tab":"Tutorial","pages":[{"title":"Tutorial","href":"/nl/introduction"}]},{"tab":"Gids","pages":[{"title":"Gids","href":"/nl/lifecycle"}]},{"tab":"Geavanceerde onderwerpen","groups":[{"group":"AI-ontwikkeling","pages":[{"title":"Een MCP-server bouwen met Laravel","href":"/nl/advanced/mcp-server"},{"title":"Een custom agent voor Boost maken","href":"/nl/advanced/boost-custom-agent"},{"title":"Een custom provider voor de AI SDK maken","href":"/nl/advanced/ai-sdk-custom-provider"},{"title":"Agentmiddleware in de Laravel AI SDK","href":"/nl/advanced/ai-sdk-agent-middleware"}]},{"group":"Design patterns","pages":[{"title":"Het Pipeline-patroon","href":"/nl/advanced/pipeline"},{"title":"Fluent-klasse","href":"/nl/advanced/fluent"},{"title":"Macroable-trait","href":"/nl/advanced/macroable"},{"title":"Conditionable-trait","href":"/nl/advanced/conditionable"},{"title":"InteractsWithTime-trait","href":"/nl/advanced/interacts-with-time"},{"title":"ForwardsCalls-trait","href":"/nl/advanced/forwards-calls"},{"title":"De tap()-helper en de Tappable-trait","href":"/nl/advanced/tap"},{"title":"De interne implementatie van de once()-helper — Once, Onceable en PreventsCircularRecursion","href":"/nl/advanced/once-helper"},{"title":"Dumpable-trait","href":"/nl/advanced/dumpable"},{"title":"Support Contracts (Arrayable / Jsonable / Htmlable / Responsable)","href":"/nl/advanced/support-contracts"},{"title":"Lottery-klasse","href":"/nl/advanced/lottery"},{"title":"Higher-order messages van collecties","href":"/nl/advanced/higher-order-messages"},{"title":"Collection deep dive","href":"/nl/advanced/collection-deep-dive"},{"title":"Illuminate\\Support\\Manager — anatomie van het driversysteem","href":"/nl/advanced/manager"},{"title":"PHP Reflection API","href":"/nl/advanced/php-reflection"},{"title":"PHP FFI","href":"/nl/advanced/ffi"},{"title":"PHP AST","href":"/nl/advanced/php-ast"}]},{"group":"Package-ontwikkeling","pages":[{"title":"Laravel-packages ontwikkelen","href":"/nl/advanced/package-development"},{"title":"De interne structuur van package discovery","href":"/nl/advanced/package-discovery"},{"title":"InteractsWithData-trait","href":"/nl/advanced/interacts-with-data"},{"title":"Uitgestelde service providers","href":"/nl/advanced/deferred-provider"},{"title":"Versiecompatibiliteit van packages beheren","href":"/nl/advanced/package-versioning"},{"title":"GitHub Actions pinnen en beveiliging","href":"/nl/advanced/github-actions-pinning"},{"title":"CHANGELOG en releasebeheer voor packages","href":"/nl/advanced/package-changelog"},{"title":"Laravel-packages testen met Orchestra Testbench","href":"/nl/advanced/package-testing"},{"title":"Packageontwikkeling met Testbench Workbench","href":"/nl/advanced/package-workbench"},{"title":"GeneratorCommand — eigen make: commando's implementeren","href":"/nl/advanced/generator-command"},{"title":"Een Laravel starter kit maken","sidebarTitle":"Starter kit maken","href":"/nl/advanced/starter-kit-creation"},{"title":"Statische analyse van packages (PHPStan / Larastan)","href":"/nl/advanced/package-static-analysis"},{"title":"Packageconfiguratie samenvoegen en cachen","href":"/nl/advanced/package-config-merging"},{"title":"Migrations van packages publiceren en bijwerken","href":"/nl/advanced/package-migrations"},{"title":"Views van packages overschrijven en bijwerken","href":"/nl/advanced/package-views"},{"title":"Routes van packages registreren en cachen","href":"/nl/advanced/package-routes"},{"title":"Packagecaches integreren in optimize","href":"/nl/advanced/package-optimization"},{"title":"Publieke assets van packages publiceren en bijwerken","href":"/nl/advanced/package-assets"},{"title":"Packagevertalingen overschrijven en bijwerken","href":"/nl/advanced/package-translations"},{"title":"Hooks na het resolven van packageservices","href":"/nl/advanced/package-service-resolution"},{"title":"Diagnostische package-informatie toevoegen aan about","href":"/nl/advanced/package-about"},{"title":"Artisan-commands van een package registreren en afhankelijkheden resolven","href":"/nl/advanced/package-commands"},{"title":"Event listeners van een package registreren en cachen","href":"/nl/advanced/package-events"},{"title":"Levensduur van packageservices ontwerpen","href":"/nl/advanced/package-service-lifetimes"},{"title":"Middleware van packages registreren en het toepassingsbereik","href":"/nl/advanced/package-middleware"},{"title":"Blade-extensies van packages en de compilatiecache","href":"/nl/advanced/package-blade-extensions"},{"title":"Storage-drivers registreren in een package en opnieuw resolven","description":"Op basis van de FilesystemManager van Laravel 13: registreren met Storage::extend(), het vasthouden van disk-instanties, opnieuw resolven na een configuratiewijziging en verificatie die niet afhankelijk is van fake.","href":"/nl/advanced/package-filesystem-drivers"},{"title":"Aangepaste notificatiekanalen in een package en verificatie van de bezorging","href":"/nl/advanced/package-notification-channels"},{"title":"Containertags in packages en het bundelen van plugins","description":"Bundel implementaties uit meerdere packages met containertags in Laravel 13 en bekijk het lazy resolven van tagged(), het verschil met giveTagged(), dubbele registratie en de levenscyclus.","href":"/nl/advanced/package-container-tags"},{"title":"HTTP-clients en tests voor packages","href":"/nl/advanced/package-http-client"},{"title":"Logchannels voor packages uitbreiden en opnieuw resolven","href":"/nl/advanced/package-logging"},{"title":"Eigen cachestores en contracten voor packages","href":"/nl/advanced/package-cache-drivers"},{"title":"Mailtransports voor packages registreren en testen","href":"/nl/advanced/package-mail-transports"},{"title":"Contextuele attributen en dependency-resolutie in packages","href":"/nl/advanced/package-contextual-attributes"},{"title":"Geplande taken van een package registreren en onderhouden","href":"/nl/advanced/package-scheduling"},{"title":"Eigen sessiedrivers voor packages","href":"/nl/advanced/package-session-drivers"},{"title":"Databaseverbindingen uitbreiden vanuit packages","href":"/nl/advanced/package-database-connections"},{"title":"Dynamische relaties registreren vanuit packages","href":"/nl/advanced/package-dynamic-relations"},{"title":"Stringvalidatieregels registreren vanuit packages","sidebarTitle":"Stringvalidatieregels","href":"/nl/advanced/package-validation-extensions"},{"title":"Response-macro's en HTTP-contracten in packages","href":"/nl/advanced/package-response-macros"},{"title":"Servicedecoratie en extend in packages","href":"/nl/advanced/package-service-decoration"},{"title":"Policies registreren en overschrijven in packages","href":"/nl/advanced/package-authorization"},{"title":"Morph maps in packages en compatibiliteit van opgeslagen data","href":"/nl/advanced/package-morph-maps"}]},{"group":"Applicatiestructuur","pages":[{"title":"Applicatiestructuur van Laravel 11 en later","href":"/nl/advanced/app-structure"},{"title":"Migratiegids van oude naar nieuwe structuur","sidebarTitle":"Migratiegids","href":"/nl/advanced/app-structure-migration"},{"title":"FAQ over de nieuwe appstructuur van Laravel 11+","sidebarTitle":"FAQ nieuwe appstructuur","href":"/nl/advanced/app-structure-faq"}]},{"group":"Nieuwe functies in Laravel 13","pages":[{"title":"PHP-attributes","href":"/nl/advanced/php-attributes"},{"title":"PHP-attributes voor controllers","sidebarTitle":"Controller-attributes","href":"/nl/advanced/controller-attributes"}]},{"group":"Eloquent in detail","pages":[{"title":"Eloquent-observers en modelevents","href":"/nl/advanced/eloquent-observers"},{"title":"Scopes in Eloquent","href":"/nl/advanced/eloquent-scopes"},{"title":"Custom casts van Eloquent","href":"/nl/advanced/eloquent-casts"},{"title":"Eloquent bootable traits","href":"/nl/advanced/eloquent-bootable-traits"},{"title":"Custom pivot-modellen en chaperone","href":"/nl/advanced/eloquent-custom-pivot"},{"title":"Eloquent afterQuery en het contract van queryresultaten","sidebarTitle":"afterQuery en resultaatverwerking","href":"/nl/advanced/eloquent-after-query"}]},{"group":"Validatie-uitbreidingen","pages":[{"title":"Custom validatieregels","href":"/nl/advanced/custom-validation-rules"}]},{"group":"Authenticatie uitbreiden","pages":[{"title":"Een custom authenticatieguard implementeren","href":"/nl/advanced/custom-auth-guard"},{"title":"Laravel Fortify en de starter kits","href":"/nl/advanced/fortify"}]},{"group":"Beveiliging","pages":[{"title":"Rate limiting aanpassen","href":"/nl/advanced/rate-limiting"}]},{"group":"Queues","pages":[{"title":"Uitvoeringscontrole van queue-jobs","href":"/nl/advanced/queue-job-control"}]},{"group":"Testen","pages":[{"title":"Geavanceerd testen met Pest","href":"/nl/advanced/testing-pest"}]},{"group":"Realtime","pages":[{"title":"Onder de motorkap van de Mercure-broadcastdriver","href":"/nl/advanced/mercure-broadcasting"}]}]},{"tab":"Blog","pages":[{"title":"Blog","href":"/nl/blog/changelog/202610"}]}]},{"language":"zh-Hans","pages":[{"title":"zh-Hans","href":"/zh-CN/advanced/package-notification-channels"}]},{"language":"zh-Hant","pages":[{"title":"zh-Hant","href":"/zh-TW/advanced/package-notification-channels"}]}]},"basePath":"","title":"Aangepaste notificatiekanalen in een package en verificatie van de bezorging - Knowledge of Laravel","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["2bfc744e19"],"chunks":["NarrationPlayer-CfOFO133.js","types-CiTgMxws.js","shallow-dY3TMRCk.js"]}