【问题标题】:How to use Ajax with jQuery in Laravel 4?如何在 Laravel 4 中使用 Ajax 和 jQuery?
【发布时间】:2013-07-09 09:58:37
【问题描述】:

我是 Laravel 4 的新手,看看我是否可以将我的网站转换为它(之前没有框架编写)。我无法让 AJAX(通过 jQuery)与我的控制器正确交互。

首先,我正在使用的控制器名为IndexController.php,并有一个名为types 的函数,如下所示:

class IndexController extends BaseController {

// Other controller functions

public function types($brand) {

    $types = DB::select('select * from aircraft_types where brand_id = ?', array($brand));

    echo json_encode($types);

}

}

函数返回数据库中的数据(JSON 格式)。然后我创建了一个到这个控制器的路由,功能如下:

Route::get('types/{id}', array('uses'=>'IndexController@types'));

我通过转到 //localhost/lavarel/public/types/1 再次检查了路由和函数是否正常工作,并且确实返回了正确的 JSON 数据。

有问题的jquery函数如下:

function updateTypes($brand) {

$("#type").append('<option value="test">Test...</option>'); // This executes correctly

$.getJSON('/types/'+$brand, function(data) {
    $("#type").append('<option value="test 2">Test 2...</option>'); // This does not
// Some other JSON related code
});

为了测试该功能的工作原理,我插入了两行来编辑我正在使用的项目。该函数被正确调用,因为正在附加第一个“测试”选项。但是,由于没有执行第二行测试代码,它似乎从未激活回调函数。

我怀疑问题是我提供给 JavaScript '/types/'+$brand 的 URL。我在一些教程中看到了在我提供的 URL 之前使用的 BASE var,但我不明白为什么上面的代码不起作用。有什么指点吗?

谁能向我解释我哪里出错了?

【问题讨论】:

  • 你在控制台的 responseText 中看到了什么?
  • 原谅我 - 我如何访问它?该网站没有中断或显示错误,它只是没有进行所需的更改
  • 如果您使用的是 Chrome,请转到右上角菜单中的 Tools &gt; Developer tools。转到Network 选项卡并选择底部的XHR。在这里,您将看到您的应用程序的任何请求。对调试很有帮助。

标签: php ajax jquery laravel


【解决方案1】:

您的 laravel 项目的基本路径是 localhost/laravel/public/,但您的 AJAX 请求只发送到 localhost。有一些方法可以解决这个问题。

方法一:

这是最受青睐的方法。 (在我看来)

你可以使用 PHP 内置的 web 服务器,而不是使用 nginx、apache 来启动 web 服务器。

打开终端窗口(或 Windows 中的 cmd),cd 进入项目的主目录(包含供应商、应用程序和公共目录的目录)并输入命令 php artisan serve。这将在 localhost:8000 上创建一个 PHP 服务器,您的基本路径将是 /

有很多选项,例如php artisan help serve",如果您想查看所有选项。

完成此操作后,您的代码应该可以工作了。

方法二

如果你想使用 nginx 或 apache,你应该为你的项目添加一个虚拟主机。

这可以通过配置来完成。

阿帕奇:http://httpd.apache.org/docs/current/vhosts/examples.html

Nginx:http://wiki.nginx.org/ServerBlockExample

之后,您应该在 hosts 文件中添加一个新条目。

方法3

正如你所说,你可以在 '/types/'+$brand 之前添加一个 BASE 变量。

您的请求发送至localhost/types/$brand

它应该转到localhost/laravel/public/types/$brand

只需将'/types/'$brand 替换为'/laravel/public/types'+$brand

【讨论】:

  • OK - 在尝试其他两种方法之前,我正在尝试方法 3。正如您正确指出的那样,通过使用 URL '/types/'+$brand 它试图加载 //localhost/types/1 (这是不正确的)。因此,我将 URL 更改为 '/laravel/public/types/'+$brand。奇怪的是,这会导致页面寻找 //localhost/laravel/public/laravel/public/types/1 (即 /laravel/public 重复两次)(!)有什么想法吗?
  • 你现在的代码是什么?如果没有您使用的 code-sn-p,很难回答您的问题。您发布的字符串应该可以工作。你确定你有/laravel/... 而不是laravel/...?另外,我建议您使用方法 1 或 2。因为这样您就可以在域上发布您的项目,而无需更改您的代码。
  • 啊,这很有趣。退一步 - 当我将此站点上传到我的主机服务器时 - 我如何让我的域指向正确的位置?目前,它自然会转到我的公共文件夹中的索引文件,但大概我需要将整个 Laravel 文件夹结构放在那里。如何将 URL 指向正确的文件?
  • 你想指向公共目录是的。如果您自己托管,或者在 VPS 上托管,则可以使用上面的方法 2 轻松完成。如果您将其托管在网络托管服务上,则可能有一个“public_html”文件夹可供您上传。那是您的公共文件夹。将您的公共目录的内容上传到那里,其余的上传到外面。之后,只需在 bootstrap/paths.php 中更改您的公共路径。
【解决方案2】:

使用 HTML 'base' 元标记

<!doctype html>
<html lang="en">
<head>
    ...
    <base href="{{ URL::to('/') }}"/>
    ...

声明此标签,您确保每个相对 URL 都基于项目的真实、绝对 URL (http://localhost/my-laravel-project/public/),而不是 Localhost 的 URL (http://localhost)

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 2013-10-05
    • 2013-06-17
    • 2013-07-08
    • 2014-02-14
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多