Skip to content

Commit

Permalink
Merge pull request #7 from RobertBoes/feat/customizable-searlization
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertBoes committed Jul 24, 2023
2 parents da0acff + 9072a4b commit 3c8e99f
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 6 deletions.
27 changes: 27 additions & 0 deletions README.md
Expand Up @@ -144,6 +144,33 @@ class IgnoreAdminBreadcrumbs implements ClassifierContract
}
```

## Serializing breadcrumbs

In some cases you might not like the default way breadcrumbs are serialized.
To modify the way the breadcrumbs are being sent to the frontend you can register a serialize callback
in the `boot` method of a service provider:

```php
<?php

namespace App\Providers;

use RobertBoes\InertiaBreadcrumbs\InertiaBreadcrumbs;

class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
InertiaBreadcrumbs::serializeUsing(fn (Breadcrumb $breadcrumb) => [
'name' => $breadcrumb->title(),
'href' => $breadcrumb->url(),
'active' => $breadcrumb->current(),
'data' => $breadcrumb->data(),
]);
}
}
```

### 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
6 changes: 5 additions & 1 deletion src/Breadcrumb.php
Expand Up @@ -42,8 +42,12 @@ public function data(): ?array
return $this->data;
}

public function toArray()
public function toArray(): array
{
if (InertiaBreadcrumbs::$serializeUsingCallback) {
return call_user_func(InertiaBreadcrumbs::$serializeUsingCallback, $this);
}

return array_filter([
'title' => $this->title(),
'url' => $this->url(),
Expand Down
18 changes: 18 additions & 0 deletions src/InertiaBreadcrumbs.php
@@ -0,0 +1,18 @@
<?php

namespace RobertBoes\InertiaBreadcrumbs;

class InertiaBreadcrumbs
{
/**
* The callback that is responsible serializing breadcrumbs to the frontend
*
* @var callable|null
*/
public static $serializeUsingCallback;

public static function serializeUsing(callable $callback)
{
static::$serializeUsingCallback = $callback;
}
}
5 changes: 0 additions & 5 deletions src/InertiaBreadcrumbsServiceProvider.php
Expand Up @@ -14,11 +14,6 @@ class InertiaBreadcrumbsServiceProvider extends PackageServiceProvider
{
public function configurePackage(Package $package): void
{
/*
* This class is a Package Service Provider
*
* More info: https://github.com/spatie/laravel-package-tools
*/
$package
->name('inertia-breadcrumbs')
->hasConfigFile();
Expand Down
83 changes: 83 additions & 0 deletions tests/SerializationTest.php
@@ -0,0 +1,83 @@
<?php

namespace RobertBoes\InertiaBreadcrumbs\Tests;

use Diglactic\Breadcrumbs\Breadcrumbs;
use Diglactic\Breadcrumbs\Generator as BreadcrumbTrail;
use Inertia\Inertia;
use Inertia\Testing\AssertableInertia as Assert;
use RobertBoes\InertiaBreadcrumbs\Breadcrumb;
use RobertBoes\InertiaBreadcrumbs\InertiaBreadcrumbs;
use RobertBoes\InertiaBreadcrumbs\Middleware;

class SerializationTest extends TestCase
{
/**
* @param \Illuminate\Routing\Router $router
*/
public function defineRoutes($router): void
{
$router->get('/home', function () {
return Inertia::render('Home', []);
})->name('home')->middleware([Middleware::class]);
}

/**
* @test
*/
public function it_serializes_breadcrumbs(): void
{
Breadcrumbs::for('home', function (BreadcrumbTrail $trail) {
$trail->push('Home', route('home'));
});

$this->getJson('/home')
->assertOk()
->assertInertia(
fn (Assert $page) => $page
->component('Home')
->has(
'breadcrumbs',
1,
fn (Assert $page) => $page
->where('title', 'Home')
->where('url', route('home'))
->where('current', true)
->missing('data')
)
);
}

/**
* @test
*/
public function it_can_use_a_custom_serializer(): void
{
Breadcrumbs::for('home', function (BreadcrumbTrail $trail) {
$trail->push('Home', route('home'));
});

InertiaBreadcrumbs::serializeUsing(fn (Breadcrumb $breadcrumb) => [
'name' => $breadcrumb->title(),
'href' => $breadcrumb->url(),
'active' => $breadcrumb->current(),
'data' => $breadcrumb->data(),
]);

$this->getJson('/home')
->assertOk()
->assertInertia(
fn (Assert $page) => $page
->component('Home')
->has(
'breadcrumbs',
1,
fn (Assert $page) => $page
->where('name', 'Home')
->where('href', route('home'))
->where('active', true)
->where('data', [])
)
);
}
}
3 changes: 3 additions & 0 deletions tests/TestCase.php
Expand Up @@ -6,6 +6,7 @@
use Illuminate\Support\Facades\View;
use Inertia\ServiceProvider as InertiaServiceProvider;
use Orchestra\Testbench\TestCase as Orchestra;
use RobertBoes\InertiaBreadcrumbs\InertiaBreadcrumbs;
use RobertBoes\InertiaBreadcrumbs\InertiaBreadcrumbsServiceProvider;

class TestCase extends Orchestra
Expand All @@ -14,6 +15,8 @@ protected function setUp(): void
{
parent::setUp();

InertiaBreadcrumbs::$serializeUsingCallback = null;

Factory::guessFactoryNamesUsing(
fn (string $modelName) => 'RobertBoes\\InertiaBreadcrumbs\\Database\\Factories\\'.class_basename($modelName).'Factory'
);
Expand Down

0 comments on commit 3c8e99f

Please sign in to comment.