Я новичок в 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 });
Чтобы проверить, где работает функция, я вставил две строки, которые редактируют элемент, который я использую. Функция вызывается правильно, когда добавляется первая опция «Тест». Однако он никогда не активирует функцию обратного вызова, так как вторая строка тестового кода не выполняется.
Я подозреваю, что проблема заключается в URL-адресе, который я предоставляю на JavaScript '/types/'+$brand
. Я видел в некоторых уроках BASE var, которые использовались до предоставления URL-адреса, но я не понимаю, почему мой код выше не работает. Любые указатели?
Может ли кто-нибудь объяснить мне, где я ошибаюсь?
Ваш базовый путь к вашему проекту laravel – localhost/laravel/public/
но ваш AJAX-запрос отправляется только на localhost
. Есть некоторые способы для этого.
Способ 1:
Это наиболее предпочтительный метод. (по моему мнению)
Вместо использования nginx, apache для запуска веб-сервера, вы можете использовать встроенный веб-сервер PHP.
Откройте окно терминала (или cmd в Windows), cd в основной каталог для вашего проекта (тот, у которого есть поставщик, приложение и общедоступные каталоги) и введите команду php artisan serve
. Это создаст PHP-сервер на localhost: 8000, и ваш базовый путь будет /
.
Есть много вариантов, например, php artisan help serve"
если вы хотите их увидеть.
После того, как вы это сделали, ваш код должен работать.
Способ 2
Если вы хотите использовать nginx или apache, вы должны добавить виртуальный хост для своего проекта.
Это можно сделать с помощью конфигов.
Apache: http://httpd.apache.org/docs/current/vhosts/examples.html
Nginx: http://wiki.nginx.org/ServerBlockExample
После этого вы должны добавить новую запись в файл hosts.
Способ 3
Как вы сказали, вы можете добавить переменную BASE перед '/types/'+$brand
.
Ваш запрос отправляется в localhost/types/$brand
.
Он должен пойти в localhost/laravel/public/types/$brand
.
Просто замените '/types/'$brand
'/laravel/public/types'+$brand
Использовать метатег «базовый» HTML
<!doctype html> <html lang="en"> <head> ... <base href="{{ URL::to('/') }}"/> ...
Объявляя этот тег, вы гарантируете, что каждый относительный URL-адрес будет основан на реальном абсолютном URL http://localhost/my-laravel-project/public/
( http://localhost/my-laravel-project/public/
), а не на URL-адресе Localhost ( http://localhost
)