add filter for side menu

This commit is contained in:
Pig Fang 2020-05-30 16:39:01 +08:00
parent dde61d31f4
commit 30e4c7d28a
3 changed files with 58 additions and 4 deletions

View File

@ -4,6 +4,7 @@ namespace App\Http\View\Composers;
use App\Events; use App\Events;
use App\Services\PluginManager; use App\Services\PluginManager;
use Blessing\Filter;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\View\View; use Illuminate\View\View;
@ -13,9 +14,13 @@ class SideMenuComposer
/** @var Request */ /** @var Request */
protected $request; protected $request;
public function __construct(Request $request) /** @var Filter */
protected $filter;
public function __construct(Request $request, Filter $filter)
{ {
$this->request = $request; $this->request = $request;
$this->filter = $filter;
} }
public function compose(View $view) public function compose(View $view)
@ -36,9 +41,12 @@ class SideMenuComposer
break; break;
} }
$menu = $menu[$type];
$menu = $this->filter->apply('side_menu', $menu, [$type]);
$view->with('items', array_map(function ($item) { $view->with('items', array_map(function ($item) {
return $this->transform($item); return $this->transform($item);
}, $menu[$type])); }, $menu));
} }
public function transform(array $item): array public function transform(array $item): array

View File

@ -3,6 +3,7 @@
namespace Tests\Fakes; namespace Tests\Fakes;
use Blessing\Filter as BaseFilter; use Blessing\Filter as BaseFilter;
use Illuminate\Support\Arr;
use PHPUnit\Framework\Assert; use PHPUnit\Framework\Assert;
class Filter extends BaseFilter class Filter extends BaseFilter
@ -11,7 +12,10 @@ class Filter extends BaseFilter
public function apply(string $hook, $init, $args = []) public function apply(string $hook, $init, $args = [])
{ {
$this->applied[$hook] = array_merge([$init], $args); if (!Arr::has($this->applied, $hook)) {
$this->applied[$hook] = [];
}
$this->applied[$hook][] = array_merge([$init], $args);
return parent::apply($hook, $init, $args); return parent::apply($hook, $init, $args);
} }
@ -34,9 +38,31 @@ class Filter extends BaseFilter
if (!empty($predicate)) { if (!empty($predicate)) {
Assert::assertTrue( Assert::assertTrue(
call_user_func_array($predicate, $this->applied[$hook]), call_user_func_array(
$predicate,
Arr::last($this->applied[$hook])
),
"Arguments of Filter '$hook' does not satisfies the predicate." "Arguments of Filter '$hook' does not satisfies the predicate."
); );
} }
} }
public function assertHaveBeenApplied(string $hook, $predicate = null)
{
Assert::assertArrayHasKey(
$hook, $this->applied,
"Expected Filter '$hook' was not applied."
);
$result = Arr::first(
$this->applied[$hook],
function ($arguments) use ($predicate) {
return call_user_func_array($predicate, $arguments);
}
);
Assert::assertNotNull(
$result,
"None of applies of Filter '$hook' satisfy the predicate."
);
}
} }

View File

@ -24,6 +24,26 @@ class SideMenuComposerTest extends TestCase
Event::assertDispatched(Events\ConfigureAdminMenu::class); Event::assertDispatched(Events\ConfigureAdminMenu::class);
} }
public function testFilter()
{
$filter = Fakes\Filter::fake();
$user = factory(User::class)->create();
$this->actingAs($user)->get('/user');
$filter->assertHaveBeenApplied('side_menu', function ($menu, $type) {
$this->assertCount(count(config('menu.user')), $menu);
$this->assertEquals('user', $type);
return true;
});
$filter->assertApplied('side_menu', function ($menu, $type) {
$this->assertCount(count(config('menu.explore')), $menu);
$this->assertEquals('explore', $type);
return true;
});
}
public function testTransform() public function testTransform()
{ {
$user = factory(User::class)->create(); $user = factory(User::class)->create();