如何在Laravel中生成一个带有占位符/可替换值的路径,以便在运行时在JS中使用?

时间:2017-11-28 07:42:13

标签: javascript php laravel blade laravel-routing

我有一条以JSON格式返回帖子数据的路线:

Route::get('posts/{post}/data', 'PostController@getData')->name('data.post');

由JS在前面调用:

<a href="#" data-post-id="{{ $post->id }}" class="post-links">{{ $post->title }}</a>

点击绑定如下:

$(".post-links").click(function() {
    var postId = $(this).data('post-id');
    $.get( "{{ route('data.post') }}" + postId, function(data) {
        // process the data...
    });
});

这里的问题是,get的URL必须在前端生成,具体取决于点击了哪个链接,但Laravel在渲染视图时已经处理了route方法。如果没有id参数,则路由生成失败。如何使用参数获取路径基础?

2 个答案:

答案 0 :(得分:2)

在Js你可以做这样的事情。

var postId = $(this).data('post-id');
var url = "{{ route('data.post', ':url') }}";
url = url.replace(':url', postId);

用于多张外卡

 var postId = $(this).data('post-id');
 var anotherId = 1;
 var url = "{{ route('test', [':url',':url1']) }}";
 url = url.replace(':url', postId);
 url = url.replace(':url1', anotherId);

希望这会对你有所帮助。

答案 1 :(得分:0)

这是另一种较少依赖前端代码的方式:

将route参数设置为可选:

Route::get('data/posts/{post?}', 'DataController@post')
    ->name('data.posts);

现在,您可以轻松调用基本路由并在JS中附加id:

$(".post-links").click(function() {
    var postId = $(this).data('post-id');
    $.get( "{{ route('data.posts') }}/" + postId, function(data) {
        // process the data...
    });
});

比替换字符串更整洁!

这确实有一些缺陷需要避免,即可选参数使/data/posts之类的路由成为有效路由,因此如果帖子为null,您只需处理该异常。

我相信这是一个更好的解决方案,所以我将此作为正确答案,但我也喜欢其他解决方案。

更新:考虑到原始问题,即关于占位符或可替换值的问题,另一个答案是事实上正确的。我自己的这个答案是使用占位符的替代方法,所以我将另一个答案标记为正确答案。