From 277479fdfc1a72f6960502ef0c21aab8cb405c0f Mon Sep 17 00:00:00 2001 From: Robert Boes <2871897+RobertBoes@users.noreply.github.com> Date: Fri, 24 Jun 2022 23:52:57 +0200 Subject: [PATCH] Added classifier option --- README.md | 25 ++++++++++++++++++++ config/inertia-breadcrumbs.php | 9 ++++++++ src/Classifier/AppendAllBreadcrumbs.php | 13 +++++++++++ src/Classifier/ClassifierContract.php | 10 ++++++++ src/Classifier/IgnoreSingleBreadcrumbs.php | 13 +++++++++++ src/InertiaBreadcrumbsServiceProvider.php | 3 +++ src/Middleware.php | 27 ++++++++++++++++++---- 7 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/Classifier/AppendAllBreadcrumbs.php create mode 100644 src/Classifier/ClassifierContract.php create mode 100644 src/Classifier/IgnoreSingleBreadcrumbs.php diff --git a/README.md b/README.md index 3fa93be..0be80f6 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,31 @@ export default { ``` +## Using a classifier + +A classifier is used to determine when breadcrumbs should be shared as Inertia props. +By default all breadcrumbs are shared, but this package is shipped with the `IgnoreSingleBreadcrumbs` classifier, which simply discards a breadcrumb collection containing only one route. + +To write your own classifier you'll have to implement `RobertBoes\InertiaBreadcrumbs\BreadcrumbCollection\ClassifierContract` and update the `inertia-breadcrumbs.classifier` config, for example: + +```php +first()->url(), '/admin')'' + } +} +``` + ### Notes on using `glhd/gretel` `glhd/gretel` shares the breadcrumbs automatically if it detects Inertia is installed and shares the props with the same key (`breadcrumbs`). If you want to use this package with gretel you should disable their automatic sharing by updating the config: diff --git a/config/inertia-breadcrumbs.php b/config/inertia-breadcrumbs.php index 6e8f994..d0699ab 100644 --- a/config/inertia-breadcrumbs.php +++ b/config/inertia-breadcrumbs.php @@ -1,5 +1,7 @@ DiglacticBreadcrumbsCollector::class, + + /** + * A classifier to determine if the breadcrumbs should be added to the Inertia response + * This can be useful if you have defined a breadcrumb route which other routes can extend, but you don't want to show single breadcrumbs + */ + 'classifier' => AppendAllBreadcrumbs::class, + // 'classifier' => IgnoreSingleBreadcrumbs::class, ]; diff --git a/src/Classifier/AppendAllBreadcrumbs.php b/src/Classifier/AppendAllBreadcrumbs.php new file mode 100644 index 0000000..3fd87b1 --- /dev/null +++ b/src/Classifier/AppendAllBreadcrumbs.php @@ -0,0 +1,13 @@ +items()->count() > 1; + } +} diff --git a/src/InertiaBreadcrumbsServiceProvider.php b/src/InertiaBreadcrumbsServiceProvider.php index 703daf0..238d412 100644 --- a/src/InertiaBreadcrumbsServiceProvider.php +++ b/src/InertiaBreadcrumbsServiceProvider.php @@ -3,6 +3,8 @@ namespace RobertBoes\InertiaBreadcrumbs; use Illuminate\Routing\Router; +use RobertBoes\InertiaBreadcrumbs\Classifier\AppendAllBreadcrumbs; +use RobertBoes\InertiaBreadcrumbs\Classifier\ClassifierContract; use RobertBoes\InertiaBreadcrumbs\Collectors\BreadcrumbCollectorContract; use RobertBoes\InertiaBreadcrumbs\Collectors\DiglacticBreadcrumbsCollector; use Spatie\LaravelPackageTools\Package; @@ -25,6 +27,7 @@ public function configurePackage(Package $package): void public function packageRegistered() { $this->app->bind(BreadcrumbCollectorContract::class, config('inertia-breadcrumbs.collector', DiglacticBreadcrumbsCollector::class)); + $this->app->bind(ClassifierContract::class, config('inertia-breadcrumbs.classifier', AppendAllBreadcrumbs::class)); $this->app->instance('inertia-breadcrumbs-package-existence', function (string $class): bool { return class_exists($class); }); diff --git a/src/Middleware.php b/src/Middleware.php index 0830273..75a5437 100644 --- a/src/Middleware.php +++ b/src/Middleware.php @@ -5,22 +5,26 @@ use Closure; use Illuminate\Http\Request; use Inertia\Inertia; +use RobertBoes\InertiaBreadcrumbs\Classifier\ClassifierContract; use RobertBoes\InertiaBreadcrumbs\Collectors\BreadcrumbCollectorContract; class Middleware { - public BreadcrumbCollectorContract $collector; + private BreadcrumbCollectorContract $collector; - public function __construct(BreadcrumbCollectorContract $collector) + private ClassifierContract $classifier; + + public function __construct(BreadcrumbCollectorContract $collector, ClassifierContract $classifier) { $this->collector = $collector; + $this->classifier = $classifier; } public function handle(Request $request, Closure $next) { - $breadcrumbs = $this->collector->forRequest($request); + $breadcrumbs = $this->breadcrumbs($request); - if ($breadcrumbs->items()->isEmpty()) { + if (is_null($breadcrumbs)) { return $next($request); } @@ -28,4 +32,19 @@ public function handle(Request $request, Closure $next) return $next($request); } + + private function breadcrumbs(Request $request): ?BreadcrumbCollection + { + $breadcrumbs = $this->collector->forRequest($request); + + if ($breadcrumbs->items()->isEmpty()) { + return null; + } + + if (! $this->classifier->shouldShareBreadcrumbs($breadcrumbs)) { + return null; + } + + return $breadcrumbs; + } }