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

Javascript 如何在Laravel中生成具有占位符/可替换值的路由,以便在运行时在JS中使用?,javascript,php,laravel,blade,laravel-routing,Javascript,Php,Laravel,Blade,Laravel Routing,我有一个以JSON格式返回post数据的路由: Route::get('posts/{post}/data', 'PostController@getData')->name('data.post'); 前面的JS调用: <a href="#" data-post-id="{{ $post->id }}" class="post-links">{{ $post->title }}</a> 这里的问题是,get的URL必须在前端生成,这取决于单击了哪个

我有一个以JSON格式返回post数据的路由:

Route::get('posts/{post}/data', 'PostController@getData')->name('data.post');
前面的JS调用:

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

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

在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);

希望这对您有所帮助。

以下是另一种不太依赖前端代码的方法:

将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
之类的路由成为有效路由,因此您只需在posts为
null
的情况下处理该异常

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


更新:考虑到原始问题(关于占位符或可替换值),另一个答案事实上是正确的。我自己的这个答案是使用占位符的另一种选择,因此我会将另一个答案标记为正确答案。

您确切地知道URL将如何呈现为这样
posts/1/data
,您必须手动将URL放入ajax请求中,而不是等待laravel为您生成,然后,您可以更改从链接的data post ID属性@yvesdaxmaz获得的ID,这违背了使用动态路由生成的目的。如果以后我将URL路由更改为
/articles/approved/1/data
,那么我必须在使用它的任何地方更改JS文件中的路径。当触发单击事件时,将呈现视图,并且必须找到相同的方法来获取URL,以处理ajax请求,该URL需要一个ID,该ID已经存在于由laravel生成的html中。当您生成HTML时,您就在应用程序的客户端,在这种情况下,您正好在浏览器中,当视图呈现时,laravel生成新路由的唯一方法是向handler发出新请求,这就是您必须生成url的原因manualy@yvesdaxmaz什么?因为laravel在呈现您的
视图模板时已经处理了“route”方法,所以在您前面的javascript代码
$中就有了http://..../posts/????/data)
您的目标是在单击相同的链接后自动更改该url中的ID。您必须更改该url
$.get(“此url”)
在点击事件触发时执行的代码中。要做到这一点,您必须从data post ID属性中获取ID并将其放入URL中,这是laravel无法做到的,因为视图已呈现。这不是一个坏把戏。我现在接受这一点,但我会留意更多解决方案。谢谢!这对通配符w不起作用如果你的需求满足了它的伟大…..:“RoHiSHIAH是的,如果通配符在路线的中间,那么你的方法就是走的路。”
$(".post-links").click(function() {
    var postId = $(this).data('post-id');
    $.get( "{{ route('data.posts') }}/" + postId, function(data) {
        // process the data...
    });
});