spatie/menu

HTML 菜单生成器

资助包维护!
spatie
其他

安装次数: 2,061,729

依赖: 9

建议者: 0

安全: 0

星级: 735

关注者: 23

分支: 100

开放问题: 0

3.2.0 2023-04-12 10:02 UTC

README

Latest Version on Packagist Tests Total Downloads

spatie/menu 包为你的 PHP 应用程序提供了一种流畅的接口来构建任何大小的菜单。如果你使用 Laravel 构建应用程序,spatie/laravel-menu 提供了一些额外的功能。

如果你正在寻找一个更灵活且无渲染的解决方案,也许我们的精神继承者 Laravel Navigation 就是你要找的。

文档可在 https://docs.spatie.be/menu 查找。

从版本 1 升级?这里有升级指南

支持我们

我们投入了大量资源来创建最优秀的开源软件包。您可以通过购买我们的付费产品之一来支持我们。

我们非常感激您从家乡给我们寄来明信片,并注明您正在使用我们哪个包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上

人类可读、流畅的接口

所有类都提供了一种人类可读的、流畅的接口(无数组配置)。此外,您可以选择更详细和灵活的语法,或者方便的方法来覆盖大多数用例。

Menu::new()
    ->add(Link::to('/', 'Home'))
    ->add(Link::to('/about', 'About'))
    ->add(Link::to('/contact', 'Contact'))
    ->add(Html::empty())
    ->render();

// Or just...
Menu::new()
    ->link('/', 'Home')
    ->link('/about', 'About')
    ->link('/contact', 'Contact')
    ->empty()
<ul>
    <li><a href="/">Home</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
    <li></li>
</ul>

或更编程化的方法

菜单也可以通过类似 reduce 的可调用函数创建。

$pages = [
    '/' => 'Home',
    '/about' => 'About',
    '/contact' => 'Contact',
];

Menu::build($pages, function ($menu, $label, $url) {
    $menu->add($url, $label);
})->render();
<ul>
    <li><a href="/">Home</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
</ul>

对 HTML 输出有很强的控制力

您可以通过编程为菜单中的任何项目或菜单本身添加 HTML 类和属性。

Menu::new()
    ->addClass('navigation')
    ->add(Link::to('/', 'Home')->addClass('home-link'))
    ->add(Link::to('/about', 'About'))
    ->add(Link::to('/contact', 'Contact')->addParentClass('float-right'))
    ->wrap('div.wrapper')
<div class="wrapper">
    <ul class="navigation">
        <li><a href="/" class="home-link">Home</a></li>
        <li><a href="/about">About</a></li>
        <li class="float-right"><a href="/contact">Contact</a></li>
    </ul>
</div

为元素添加 id

您可以为元素添加 id,这样就可以轻松地使用 CSS 或 JS 定位这些元素。

Menu::new()
    ->id('navigation')
    ->add(Link::to('/', 'Home')->id('home-link'))
    ->add(Link::to('/about', 'About'))
    ->add(Link::to('/contact', 'Contact'))
<ul id="navigation">
    <li><a href="/" id="home-link">Home</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
</ul>

不怕深度

菜单支持子菜单,子菜单可以无限嵌套。

Menu::new()
    ->link('/', 'Home')
    ->submenu('More', Menu::new()
        ->addClass('submenu')
        ->link('/about', 'About')
        ->link('/contact', 'Contact')
    );
<ul>
    <li><a href="/">Home</a></li>
    <li>
        More
        <ul class="submenu">
            <li><a href="/about">About</a></li>
            <li><a href="/contact">Contact</a></li>
        </ul>
    </li>
</ul>

为 Laravel 应用提供一些额外的功能

菜单包的 Laravel 版本添加了一些额外的功能,例如生成 URL 和宏的便利方法。

Menu::macro('main', function () {
    return Menu::new()
        ->action('HomeController@index', 'Home')
        ->action('AboutController@index', 'About')
        ->action('ContactController@index', 'Contact')
        ->setActiveFromRequest();
});
<nav class="navigation">
    {{ Menu::main() }}
</nav>

Spatie 是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到我们所有开源项目的概述。

安装

您可以通过 composer 安装此包

composer require spatie/menu

用法

文档可在 https://docs.spatie.be/menu 查找。

升级到 2.0

对于大多数用例,升级到 2.0 应该非常简单。

如果你只是构建菜单...

  • voidvoidIf 已被移除。这些可以用 htmlhtmlIf 替换,它们的第一个参数为空字符串。
  • prefixLinksprefixUrls 方法已被移除,因为它们在某些情况下太不可预测了。目前还没有替代方案,除了编写自己的逻辑并使用 applyToAll 应用。

如果你使用自定义 Item 实现...

  • HtmlAttributesParentAttributes 特性已被重命名为 HasHtmlAttributesHasParentAttributes
  • 已删除HasUrl接口和特性。与URL相关的函数现在也是Activatable接口和特性的部分。

新增功能...

  • 添加了静态的Menu::build和非静态的Menu::fill方法,用于从数组创建菜单。
  • 现在Activatable上的setActive方法还接受一个非严格的布尔值或可调用参数来设置$active为true或false。
  • Menu::htmlMenu::htmlIf现在接受一个作为其第二个参数的$parentAttributes数组。

变更日志

请参阅CHANGELOG了解最近有哪些变化。

测试

phpunit

贡献

请参阅CONTRIBUTING获取详细信息。

安全

如果您发现了关于安全的bug,请通过security@spatie.be发送邮件,而不是使用问题跟踪器。

明信片软件

您可以使用这个包,但如果它进入您的生产环境,我们非常感谢您从家乡寄给我们一张明信片,说明您正在使用我们的哪个包。

我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。

我们将所有收到的明信片发布在我们的公司网站上

致谢

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。