amrikasir/ziggy

该包已被废弃,不再维护。没有建议的替代包。

生成一个Blade指令,导出所有命名的Laravel路由。同时提供JavaScript中的route()辅助函数。

安装: 79

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 0

开放问题: 0

语言:JavaScript

0.7.2 2019-08-13 05:15 UTC

This package is auto-updated.

Last update: 2021-07-13 20:34:39 UTC


README

只是从 tightenco/ziggy 的一个复制/分支。

由于我需要在Laravel项目中使用带有我添加的功能的Ziggy,而tightenco的响应太长,所以我将重新发布新的Packagist仓库

Ziggy - Use your Laravel Named Routes inside JavaScript

Ziggy - 在JavaScript中使用你的Laravel命名路由

Ziggy创建了一个Blade指令,你可以将其包含在视图文件中。这将导出一个JavaScript对象,包含应用的所有命名路由,以它们的名称(别名)为键,以及一个全局的route()辅助函数,你可以用它来在JavaScript中访问路由。

安装

  1. 将Ziggy添加到Composer文件:composer require amrikasir/ziggycomposer -vvv require amrikasir/ziggy 如果你需要查看详细日志

  2. (如果Laravel 5.4) 将 Tightenco\Ziggy\ZiggyServiceProvider::class 添加到你的 config/app.php 文件中的 providers 数组。

  3. 在主应用JavaScript加载之前(可能在头部),在模板中包含我们的Blade指令(@routes)。

用法

此包替换了@routes指令,以一个由应用所有路由名称为键的集合。此集合在Ziggy.namedRoutes中可用。

此包还创建了一个可选的route() JavaScript辅助函数,它类似于Laravel的route() PHP辅助函数,可以用来通过名称和(可选)参数获取URL。

示例

不带参数

route('posts.index') // Returns '/posts'

带必填参数

route('posts.show', {id: 1}) // Returns '/posts/1'
route('posts.show', [1]) // Returns '/posts/1'
route('posts.show', 1) // Returns '/posts/1'

带多个必填参数

route('events.venues.show', {event: 1, venue: 2}) // Returns '/events/1/venues/2'
route('events.venues.show', [1, 2]) // Returns '/events/1/venues/2'

带查询参数

route('events.venues.show', {event: 1, venue: 2, page: 5, count: 10})
// Returns '/events/1/venues/2?page=5&count=10'

如果传递整个对象,Ziggy将自动查找id主键

var event = {id: 1, name: 'World Series'};
var venue = {id: 2, name: 'Rogers Centre'};

route('events.venues.show', [event, venue]) // Returns '/events/1/venues/2'

如果想要使用未命名的路由

url('/url/want/to/go');

Ziggy提供go方法

route().go('/url/want/to/go')

实际的AJAX或Axios示例

var post = {id: 1, title: 'Ziggy Stardust'};

return axios.get(route('posts.show', post))
    .then((response) => {
        return response.data;
    });

Ajax或Axios与未命名的路由

return axios.get(route().go('/url/want/to/go'))
    .then((response) => {
        return response.data;
    });

默认值

见Laravel 文档

默认值对于Laravel版本 >= 5.5.29 直接有效,对于之前的版本,你需要在包含我们的Blade指令(@routes)的同一页面中设置默认参数

Ziggy.defaultParameters = {
    //example
    locale: "en"
}

路由过滤

路由过滤是完全可选的。如果你希望默认将所有路由传递给JavaScript,你可以继续使用Ziggy,如上所述。

基本白名单和黑名单

要利用基本的路由白名单或黑名单功能,您首先需要在Laravel应用程序的config/目录中创建一个名为ziggy.php的标准配置文件,并将whitelistblacklist设置为一个包含路由名称数组的值。

注意:您必须选择其中之一。同时设置whitelistblacklist将完全禁用过滤,并直接返回默认的路由列表。

示例config/ziggy.php

<?php
return [
    // 'whitelist' => ['home', 'api.*'],
    'blacklist' => ['debugbar.*', 'horizon.*', 'admin.*'],
];

如上述示例所示,Ziggy在过滤器中使用星号作为通配符。 home将仅匹配名为home的路由,而api.*将匹配任何以api.开头的路由,例如api.posts.indexapi.users.show

简单的白名单和黑名单宏

您还可以使用以下宏来实现白名单和黑名单。

示例白名单

Route::whitelist(function () {
    Route::get('...')->name('posts');
});

Route::whitelist()->get('...')->name('posts');

示例黑名单

Route::blacklist(function () {
    Route::get('...')->name('posts');
});

Route::blacklist()->get('...')->name('posts');

使用组的高级白名单

您还可以选择在您的config/ziggy.php中定义多个白名单,通过定义groups

<?php
return [
    'groups' => [
        'admin' => [
            'admin.*',
            'posts.*',
        ],
        'author' => [
            'posts.*',
        ]
    ],
];

在上面的示例中,您可以看到我们已为不同的用户角色配置了多个白名单。您可以通过在blade视图中传递组键到@routes来显式一个特定的白名单组。示例

@routes('author')

注意:使用组将始终优先于上述提到的whitelistblacklist设置。

其他有用的方法

current()

要获取当前路由的名称(基于浏览器的window.location),您可以使用

route().current()
// returns "events.index"

要检查我们是否位于当前路由,请将所需的路由作为唯一参数传递

route().current("events.index")
// returns true

您甚至可以使用通配符

route().current("events.*")
// returns true

url()

Ziggy返回一个字符串原语的包装器,在几乎所有情况下都表现得像字符串。在第三方库使用严格类型检查的罕见情况下,您可能需要一个实际的String文字。

要实现这一点,只需在您的路由上调用.url()

route('home').url()
// http://myapp.local/

Artisan命令

Ziggy发布了一个Artisan命令来生成一个ziggy.js路由文件,该文件可以作为资产管道(例如Laravel Mix)的一部分使用。

您可以在项目中运行php artisan ziggy:generate以在resources/assets/js/ziggy.js中生成一个静态路由文件。

可选地,包含一个第二个参数来覆盖路径和文件名(您必须传递包含路径的文件名)

php artisan ziggy:generate "resources/foo.js"

示例 ziggy.js,其中命名路由homelogin存在于routes/web.php

// routes/web.php

<?php

Route::get('/', function () {
    return view('welcome');
})->name('home');

Route::get('/login', function () {
    return view('login');
})->name('login');
// ziggy.js

var Ziggy = {
    namedRoutes: {"home":{"uri":"\/","methods":["GET","HEAD"],"domain":null},"login":{"uri":"login","methods":["GET","HEAD"],"domain":null}},
    baseUrl: 'http://myapp.local/',
    baseProtocol: 'http',
    baseDomain: 'myapp.local',
    basePort: false
};

export {
    Ziggy
}

基于环境的加载已压缩的路由辅助文件

当加载blade辅助文件时,Ziggy会检测当前环境,如果APP_ENV不是local,则对输出进行压缩。

在这种情况下,将加载ziggy.min.js。否则,将使用ziggy.js

可选的 route 助手

如果您只想通过 @routes 使用路由,但不需要 route 助手函数,可以在您的配置中包含 skip-route-function 并将其设置为 true

// config/ziggy.php

<?php

return [
    'skip-route-function' => true
];

与 Vue 组件一起使用

如果您想在 Vue 组件中使用 route 助手,需要在您的 app.js 文件中添加以下代码

Vue.mixin({
    methods: {
        route: route
    }
});

然后,在您的 Vue 组件中使用此方法,例如

<a class="nav-link" :href="route('home')">主页</a>

感谢 Archer70 提供此解决方案。

laravel-haml (以及其他自定义 Blade 编译器) 一起使用

laravel-haml 提供基于 HAML 的 Blade 模板。由于 laravel-haml 使用独立的 BladeCompiler 实例,自定义指令(如 @route)不会自动导入。有一个 pull request 旨在修复此问题。在此期间,只需将此代码放置在您的 ./app/Providers/AppServiceProvider.phpboot() 部分即可

$customDirectives = $this->app['blade.compiler']->getCustomDirectives();
foreach ($customDirectives as $name => $closure) {
  $this->app['Bkwld\LaravelHaml\HamlBladeCompiler']->directive($name, $closure);
}

此模式不仅限于 laravel-haml;它可以用于初始化您可能正在使用的任何自定义模板编译器。

贡献 & 信用

要开始为 Ziggy 贡献,只需提交您的 Pull Request。

感谢 Caleb PorzioAdam WathanJeffrey Way 的帮助,以巩固这一想法。

感谢所有我们的贡献者