Laravel 与 Ajax:不正确的路由

Posted

技术标签:

【中文标题】Laravel 与 Ajax:不正确的路由【英文标题】:Laravel vs. Ajax: incorrect routing 【发布时间】:2015-02-25 05:30:15 【问题描述】:

我正在尝试根据“部门”填充“职位”下拉列表。 Ajax 调用在“部门”下拉列表的change 事件上触发。

问题是Ajax调用无法到达正确的路由:

url: 'ajax/get-position' - 网址是:localhost/public/join/ajax/get-position?dept_id=5 url: '/ajax/get-position' - 网址是:localhost/ajax/get-position?dept_id=5

这两个网址都是错误的,我不知道为什么。尤其是第一点中的 /join/ 对我来说是个谜。正确的 URL 应该是 localhost/public/ajax/get-position?dept_id=5。我相信路由中存在某种冲突,但我不确定在哪里。

Ajax 调用是在 localhost/public/join/editor 页面上进行的。

JS:

...
...
$.ajax(
    url: 'ajax/get-position',
    data: 
        dept_id: value
    ,
    type: 'GET',
    dataType : 'json',
    success: function(json) 
        //
    ,
    error: function(xhr, status, errorThrown) 
        //
    
);
...
...

路线:

Route::get('join/editor',
    array(
        'uses' => 'DefaultController@showEditorRegistration',
        'as' => 'editorRegistration'
    )
);

Route::post('join/editor',
    array(
        'uses' => 'DefaultController@createEditor',
        'as' => 'createEditor'
    )
);

// ROUTE FOR AJAX CALL
Route::get('ajax/get-position',
    array(
        'uses' => 'DefaultController@getPositionsByDepartment',
    )
);

有什么想法吗?

编辑:

javascript 位于外部文件中。如果我将 JS 直接放在 Blade.php 视图中并使用 URL::route('routename') 作为 Ajax url 值 - 一切正常。但是,仅使用 url: ajax/get-position - 不会。疯狂的世界。

【问题讨论】:

如果您尝试直接在浏览器中点击get-position 路由会收到什么错误消息? @ChrisSchmitz 没有。直接在浏览器中访问时,该路线很好。只有 Ajax 调用会产生问题。我在帖子中提到的错误 URL 会抛出 404。 我设置了一个快速项目来测试 ajax 调用并且没有遇到问题。要进行故障排除,请尝试将 ajax/get-position 路由中的第二个参数替换为闭包并返回测试数据。例如:Route::get('ajax/get-position', function()return 'worked';);。如果你添加它并通过 ajax 触发它,你会得到“工作”返回吗? @ChrisSchmitz 不幸的是,它没有被退回。它无法返回,因为 Ajax 仍然没有找到正确的路线。我将 JS 脚本放入一个 Blade.php 文件中,并使用 URL::route('getPositionsByDepartment') 作为 Ajax url 值 - 它可以工作。但是我想将 JS 保存在一个外部文件中并简单地使用 'ajax/get-position',它应该基于路由工作 - 它不:/ 这很奇怪。因此,当您将 URL::route('getPositionsByDepartment') 添加到视图中并在浏览器的开发工具中检查生成的 ajax 时,它插入的完整 url 是什么? 【参考方案1】:

我不完全确定,但根据我们关于您项目细节的对话,我认为问题与您的文档根目录的位置有关。 public 目录不应该出现在你的任何 laravel 项目的 url 中。

我创建了一个演示项目来演示与Laravel and Ajax 的简单交互。这是一个原版的 laravel 项目,对 hello 视图做了些许改动。

签出项目,导航到公共文件夹,然后使用以下命令启动临时 phpserver:

php -S localhost:8002

然后您可以转到网址http://localhost:8002 以访问主页。

如果您检查主页上的链接并查看使用URL 外观为路由tester 生成的url。该 URL 不包含 public 目录:

http://localhost:8003/tester

您还可以查看 ajax 设置,发现您也可以使用 tester 路由。

    $('#getbutton').click( function ()
            $.ajax(
                url: 'tester'

                ).complete(function (a)
                    alert(a.responseText);
                ).error(function (a)
                   console.log(a);
                );
    );

使用链接或 ajax 调用按钮单击将点击路由文件中的 tester 路由:

Route::get('tester',[ 'as' => 'tester', 'uses' => function ()
    return 'worked';
]);

链接可以通过路由文件中分配的路由名称tester命中路由,ajax请求可以从查询字符串中命中路由。

您项目中的路由看起来不错,并且在 ajax 调用中使用 ajax/get-position 作为您的 url 应该不是问题。

试试这个项目。即使问题不是 webroot 问题,也希望它能帮助您找出问题的根源。

【讨论】:

谢谢,克里斯,这很有用。我也不确定,但似乎根位置是唯一可能不正确的地方。很快我将在生产环境中进行测试,我们拭目以待。在那之前,我将路由 URL 保存在隐藏的表单输入中,然后从那里将其检索到我的 JS 中。再次感谢。 没问题。祝你好运!

以上是关于Laravel 与 Ajax:不正确的路由的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 路由问题:自动重定向到根文件夹

Ajax 调用 Laravel 路由

在 Laravel 5 中为非 Ajax 路由设置请求(而非响应)标头

Laravel 5.2 - 会话不会在路由更改中持续存在

使用ajax更新数据库记录的Laravel刷新页面

Laravel 图片上传使用 ajax 500 内部服务器错误