amrikasir / ziggy
生成一个Blade指令,导出所有命名的Laravel路由。同时提供JavaScript中的route()辅助函数。
Requires
- laravel/framework: ~5.4
Requires (Dev)
- mikey179/vfsstream: ^1.6
- orchestra/testbench: ~3.6
This package is auto-updated.
Last update: 2021-07-13 20:34:39 UTC
README
只是从 tightenco/ziggy 的一个复制/分支。
由于我需要在Laravel项目中使用带有我添加的功能的Ziggy,而tightenco的响应太长,所以我将重新发布新的Packagist仓库
Ziggy - 在JavaScript中使用你的Laravel命名路由
Ziggy创建了一个Blade指令,你可以将其包含在视图文件中。这将导出一个JavaScript对象,包含应用的所有命名路由,以它们的名称(别名)为键,以及一个全局的route()辅助函数,你可以用它来在JavaScript中访问路由。
安装
-
将Ziggy添加到Composer文件:
composer require amrikasir/ziggy或composer -vvv require amrikasir/ziggy如果你需要查看详细日志 -
(如果Laravel 5.4) 将
Tightenco\Ziggy\ZiggyServiceProvider::class添加到你的config/app.php文件中的providers数组。 -
在主应用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的标准配置文件,并将whitelist或blacklist设置为一个包含路由名称数组的值。
注意:您必须选择其中之一。同时设置whitelist和blacklist将完全禁用过滤,并直接返回默认的路由列表。
示例config/ziggy.php
<?php return [ // 'whitelist' => ['home', 'api.*'], 'blacklist' => ['debugbar.*', 'horizon.*', 'admin.*'], ];
如上述示例所示,Ziggy在过滤器中使用星号作为通配符。 home将仅匹配名为home的路由,而api.*将匹配任何以api.开头的路由,例如api.posts.index和api.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')
注意:使用组将始终优先于上述提到的whitelist和blacklist设置。
其他有用的方法
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,其中命名路由home和login存在于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.php 的 boot() 部分即可
$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 Porzio、Adam Wathan 和 Jeffrey Way 的帮助,以巩固这一想法。
