在 blade 模板 {{ route () }} 中使用 JavaScript 变量的问题

我载 web.php 中定义了一条如下的路由:

Route::get( '/manager/content/get_content_name/{content}',  'ContentsController@get_content_name') -> name('manager.content.get_content_name');

ContentsController 控制器中定义如下的方法:

    public function get_content_name(Content $content)
    {
        return ($content->name);
    }

在视图中想使用 ajax 通过 pre_content_id 来快速获取 $content->name,ajax 如下

        var pre_content_id = $("label#pre_content_id").text();
        $.ajax({
            url: '{{ route('manager.content.get_content_name', pre_content_id) }}',
            type: 'GET',
            dataType: 'text',
            success: function(result){
                $("label#pre_content_id").text(result);
            }
        });

整个逻辑就是这个样子的。
运行结果报错如下

ErrorException (E_ERROR)
Use of undefined constant pre_content_id - assumed 'pre_content_id' (this will throw an Error in a future version of PHP) (View: D:\WebService\laravel\smenu\resources\views\manager\content\show.blade.php)
Previous exceptions
Use of undefined constant pre_content_id - assumed 'pre_content_id' (this will throw an Error in a future version of PHP) (0)

现在的问题就是 pre_content_id 是 js 的变量
怎么样才能在 '{{route ('manager.content.get_content_name', pre_content_id) }} 中,让 pre_content_id 这个 js 的变量被 js 解析,而不是被 blade 解析呢。

在解决过程中,尝试了如下的方法:
将路由定义更改为:

Route::get( '/manager/content/get_content_name/{content?}',  'ContentsController@get_content_name') -> name('manager.content.get_content_name');

将 ajax 代码更改为:

        var pre_content_id = $("label#pre_content_id").text();
        $.ajax({
            url: '{{ route('manager.content.get_content_name', pre_content_id) }}',
            type: 'GET',
            data:{
                content: pre_content_id
            },
            dataType: 'text',
            success: function(result){
                $("label#pre_content_id").text(result);
            }
        });

发现不会报错,后台查看 ajax 的请求地址变为
http://test.app/manager/content/get_content_name?content=10005
但是这个请求,仍然不能正常的被路由解析到 ContentsController 控制器的 get_content_name 方法。

我翻了半宿的论坛和手册,也没有找到相关的解答。
当然,我知道是可以直接使用手工拼接 URI 来实现功能,但是我现在就是想通过 {{route ()}} 来实现。
脑袋进死胡同了,钻牛角尖了,转不出来了。
希望诸位能帮忙解答一下,或者给一个手册的查找方向。
谢谢

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
leo
最佳答案

这是不可能的,因为 PHP 的渲染早于 JS,这是无法改变的。

5年前 评论
讨论数量: 6
leo

这是不可能的,因为 PHP 的渲染早于 JS,这是无法改变的。

5年前 评论

你这写的啥玩意,把 js 变量写到 php 函数里?这么秀的啊

5年前 评论

@pigzzz 要不说钻牛角尖了呢,就想尝试一下。。。。

5年前 评论

@leo 其实也明白的,就是想 blade 这么牛的东西,感觉应该有个什么机制可以实现。。。

5年前 评论
Sanbo 4年前

url () 和 route () 的本质是生产 url, 你提交的时候是 js 在部分在生效,已经是在 html 上操作了,{{url ()}}、{{route ()}} 的部分在 html 中已经是个字符串了,预设变量占位字符串如(obj_id、user_id),js 代码中使用 replace 方法将占位的字符串替换成 js 变量即可

2年前 评论