Skip to content

Commit 65a8973

Browse files
committed
feat: can pass in params and update method for MenuItems created with the controller method.
1 parent 690251a commit 65a8973

6 files changed

Lines changed: 76 additions & 6 deletions

File tree

src/Traits/HasController.php

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
namespace Javaabu\MenuBuilder\Traits;
44

5-
use Illuminate\Database\Eloquent\Model;
6-
75
trait HasController
86
{
97
protected ?string $controller = null;
8+
protected string $controller_method = 'index';
9+
protected array $controller_params = [];
1010

11-
public function controller(string $controller): self
11+
public function controller(string $controller, array $params = [], ?string $controller_method = 'index'): self
1212
{
1313
$this->clearLink();
1414

1515
$this->controller = $controller;
16+
$this->controller_method = $controller_method;
17+
$this->controller_params = $params;
1618

1719
return $this;
1820
}
@@ -24,7 +26,7 @@ public function getController(): ?string
2426

2527
public function hasController(): bool
2628
{
27-
return ! empty($this->getController());
29+
return !empty($this->getController());
2830
}
2931

3032
protected function checkActiveFromController(): bool
@@ -46,11 +48,16 @@ protected function clearController(): self
4648

4749
protected function generateControllerLink(): string
4850
{
49-
return action([$this->getController(), $this->getControllerMethod()]);
51+
return action([$this->getController(), $this->getControllerMethod()], $this->getControllerParams());
52+
}
53+
54+
public function getControllerParams(): array
55+
{
56+
return $this->controller_params;
5057
}
5158

5259
protected function getControllerMethod(): string
5360
{
54-
return 'index';
61+
return $this->controller_method;
5562
}
5663
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Javaabu\MenuBuilder\Tests\Controllers;
4+
5+
class HomeController
6+
{
7+
public function index(string $locale)
8+
{
9+
return view('locale-index', compact('locale'));
10+
}
11+
}

tests/Controllers/UsersController.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Javaabu\MenuBuilder\Tests\Controllers;
44

55
use Javaabu\MenuBuilder\Menu\MenuItem;
6+
use Javaabu\MenuBuilder\Tests\Models\User;
67

78
class UsersController
89
{
@@ -13,4 +14,16 @@ public function index()
1314

1415
return view('active-link', compact('active_item', 'inactive_item'));
1516
}
17+
18+
public function show($user)
19+
{
20+
$user = User::find($user);
21+
22+
return view('user', compact('user'));
23+
}
24+
25+
public function localeIndex(string $locale)
26+
{
27+
return view('locale-index', compact('locale'));
28+
}
1629
}

tests/Unit/MenuItemTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Http\Request;
66
use Illuminate\Support\Facades\Gate;
7+
use Javaabu\MenuBuilder\Tests\Controllers\HomeController;
78
use Javaabu\MenuBuilder\Tests\Controllers\UsersController;
89
use Illuminate\Support\Facades\Route;
910
use Javaabu\MenuBuilder\Tests\InteractsWithDatabase;
@@ -174,6 +175,42 @@ public function it_can_set_the_menu_item_controller(): void
174175
$this->assertEquals('http://localhost/users', $menu_item->getLink());
175176
}
176177

178+
/** @test */
179+
public function it_can_set_menu_item_from_controller_with_params(): void
180+
{
181+
Route::get('/users/{user}', [UsersController::class, 'show']);
182+
183+
$user = User::factory()->create();
184+
185+
$menu_item = MenuItem::make('Users')
186+
->controller(UsersController::class, compact('user'), 'show');
187+
188+
$this->assertEquals(UsersController::class, $menu_item->getController());
189+
$this->assertEquals('http://localhost/users/1', $menu_item->getLink());
190+
191+
$this->visit($menu_item->getLink())
192+
->seeText("User: {$user->name}");
193+
}
194+
195+
/** @test */
196+
public function it_can_set_menu_item_for_index_method_from_controller_with_params(): void
197+
{
198+
Route::get('/{locale}/users', [HomeController::class, 'index']);
199+
200+
$menu_item = MenuItem::make('Users')
201+
->controller(
202+
HomeController::class,
203+
['locale' => 'jp'],
204+
'index'
205+
);
206+
207+
$this->assertEquals(HomeController::class, $menu_item->getController());
208+
$this->assertEquals('http://localhost/jp/users', $menu_item->getLink());
209+
210+
$this->visit($menu_item->getLink())
211+
->seeText("Locale: jp");
212+
}
213+
177214
/** @test */
178215
public function it_can_determine_active_state_from_controller(): void
179216
{

tests/views/locale-index.blade.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Locale: {{ $locale }}

tests/views/user.blade.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
User: {{ $user->name }}

0 commit comments

Comments
 (0)