Skip to content

Commit

Permalink
Added classifier option
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertBoes committed Jun 24, 2022
1 parent ac4f255 commit 277479f
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 4 deletions.
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,31 @@ export default {
</script>
```

## 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
<?php

namespace App\Support;

use Illuminate\Support\Str;
use RobertBoes\InertiaBreadcrumbs\Classifier\ClassifierContract;
use RobertBoes\InertiaBreadcrumbs\BreadcrumbCollection;

class IgnoreAdminBreadcrumbs implements ClassifierContract
{
public function shouldShareBreadcrumbs(BreadcrumbCollection $collection): bool
{
return ! Str::startsWith($collection->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:
Expand Down
9 changes: 9 additions & 0 deletions config/inertia-breadcrumbs.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

use RobertBoes\InertiaBreadcrumbs\Classifier\AppendAllBreadcrumbs;
use RobertBoes\InertiaBreadcrumbs\Classifier\IgnoreSingleBreadcrumbs;
use RobertBoes\InertiaBreadcrumbs\Collectors\DiglacticBreadcrumbsCollector;
use RobertBoes\InertiaBreadcrumbs\Collectors\TabunaBreadcrumbsCollector;
use RobertBoes\InertiaBreadcrumbs\Collectors\GretelBreadcrumbsCollector;
Expand All @@ -24,4 +26,11 @@
* If you're using glhd/gretel you can use GretelBreadcrumbsCollector::class (see notes in the readme about using this package)
*/
'collector' => 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,
];
13 changes: 13 additions & 0 deletions src/Classifier/AppendAllBreadcrumbs.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace RobertBoes\InertiaBreadcrumbs\Classifier;

use RobertBoes\InertiaBreadcrumbs\BreadcrumbCollection;

class AppendAllBreadcrumbs implements ClassifierContract
{
public function shouldShareBreadcrumbs(BreadcrumbCollection $collection): bool
{
return true;
}
}
10 changes: 10 additions & 0 deletions src/Classifier/ClassifierContract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace RobertBoes\InertiaBreadcrumbs\Classifier;

use RobertBoes\InertiaBreadcrumbs\BreadcrumbCollection;

interface ClassifierContract
{
public function shouldShareBreadcrumbs(BreadcrumbCollection $collection): bool;
}
13 changes: 13 additions & 0 deletions src/Classifier/IgnoreSingleBreadcrumbs.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace RobertBoes\InertiaBreadcrumbs\Classifier;

use RobertBoes\InertiaBreadcrumbs\BreadcrumbCollection;

class IgnoreSingleBreadcrumbs implements ClassifierContract
{
public function shouldShareBreadcrumbs(BreadcrumbCollection $collection): bool
{
return $collection->items()->count() > 1;
}
}
3 changes: 3 additions & 0 deletions src/InertiaBreadcrumbsServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
});
Expand Down
27 changes: 23 additions & 4 deletions src/Middleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,46 @@
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);
}

Inertia::share('breadcrumbs', $breadcrumbs);

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;
}
}

0 comments on commit 277479f

Please sign in to comment.