Подтвердить что ты не робот

Laravel 4 в качестве RESTful backend для AngularJS

Я пытаюсь создать веб-приложение, которое должно использовать Laravel в качестве API-интерфейса RESTful и AngularJS на стороне клиента. Я прочитал все остальное сообщение о Stackoverflow о проблеме, но никто определенно не отвечает на мои сомнения, по крайней мере, я не нашел окончательного примера источника.

Например...

Должен ли я разработать два совершенно разных приложения, бэкэнд с Laravel и другой, чисто клиентом, с AngularJS? Но в этом случае: как обрабатывать их через один домен (или виртуальный хост)?

Или мне нужно создавать шаблоны AngularJS внутри Laravel, в папке "views" и из них вызывать услуги Laravel? Я сомневаюсь, что это лучший подход: в этом случае бэкэнд не полностью отделен от реализации интерфейса.

Также, как правильно обрабатывать маршрутизацию? Я имею в виду: я хотел бы управлять маршрутами AngularJS, такими как меню/страница навигации, вызывая Laravel только для получения данных и заполнения моих просмотров. Перемещение "общедоступной" папки, как предложено в этом сообщении (Angular JS + Laravel 4: Как скомпилировать для производственного режима?) может помочь?

Thanx заранее для предложений, примеров...

4b9b3361

Ответ 1

Наконец, я нашел рабочее решение, совершенное в моем сценарии, которое не требует субдомена. В этом случае Laravel действует исключительно как веб-служба RESTful, а не виды или шаблоны на стороне сервера: уровень представления полностью востребован для AngularJS.

Скажем, у меня есть два полностью развязанных приложения (FE e WS) внутри одной корневой папки:

root
|__fe
|__ws

Я изменил настройки виртуального хоста в файле Apache httpd-vhosts.conf следующим образом:

<VirtualHost *:80>
    ServerName myapp.com
    DocumentRoot "\www\root\fe"

    alias /ws "\www\root\ws\public"
    <Directory "\www\root\ws\public">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride all
            Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Затем я добавил "RewriteBase/ws" в свой файл laravel/public/.htacces:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

    RewriteBase /ws

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [NC,L]
</IfModule>

Таким образом, я могу писать в браузере (например):

http://myapp.com             (AngularJS client side root)
http://myapp.com/ws/users    (RESTful service endpoint for "users")

И затем определите сторону клиента, AngularJS маршрутизируя следующим образом:

app.config(function($routeProvider) {
    $routeProvider
        .when('/', {controller: 'HomeController', templateUrl: 'templates/home.html'})
        .when('/users', {controller: 'UsersController', templateUrl: 'templates/users.html'})
        .otherwise({redirectTo: '/'});
});

Связать его с ресурсом RESTful таким образом:

app.factory('User', function($resource) {
    return $resource('http://myapp.com/ws/users');
});

app.controller('UsersController', function($scope, User) {
    $scope.title = "Users";
    $scope.users = User.query();
});

Я включил API истории HTML5, добавив эту строку, чтобы настроить приложение Angular:

$locationProvider.html5Mode(true);

вместе с (внутри раздела head.html head):

<base href="/" />
<meta name="fragment" content="!" />

Таким образом, последнее требование для решения таких проблем, как обновление страницы браузера, глубокая привязка или прямая закладка страницы, заключается в добавлении файла .htaccess в корень папки, содержащей приложение Angular:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.html [NC,L]
</IfModule>

Надеюсь, что это поможет!

Ответ 2

Это половина ответа половины ответа, она слишком длинная.

Matteo, как вы указали, в основном три разных места, вы можете сделать какую-то маршрутизацию/перенаправление с этим стеком. Обычно я не видел преимущества для переадресации на уровне Apache, я полагаю, что это может быть более полезно для локализации или, возможно, для какой-то балансировки нагрузки/диска. Однако у вас будет ваша конфигурация VirtualHost, если у вас есть несколько доменов, указывающих на этот адрес, и вам необходимо направить эти начальные запросы на соответствующий index.html(так что если вы рассматриваете эту маршрутизацию, это будет моя маршрутизация на стороне сервера).

Вообще говоря, после этого я полагаюсь на Angular $routeProvider для обработки "маршрутов" на стороне клиента, которые действительно просто сопоставляют URL-адрес с представлением (возможно, передавая некоторые данные).

Мне не нравилось настраивать маршрутизатор в моем PHP-коде, чтобы создать правильный интерфейс RESTful. В моем конкретном случае данные хранятся в довольно абстрактном виде, и я должен был сделать достаточную работу на PHP, чтобы организовать ее организованным способом, любое прямое решение типа ORM не будет работать. Эта попытка привела меня к рассмотрению таких параметров, как MongoDB, хотя, поскольку она должна облегчать рабочую нагрузку, необходимую для выполнения перевода с постоянного хранилища на клиентскую и обратно.

Во всяком случае, все, что я сказал, что я использую $http, просто выполняю свои звонки с пользовательских сервисов на определенные конечные точки PHP, которые мне нужны. Моя папка PHP с моими скриптами находится рядом с тем, где мой индексный файл подан, поэтому запросы из Angular являются относительными путями из корня сервера, что упрощает его. Таким образом, они физически "вложены", так сказать, или живут бок о бок, но код PHP никогда не пишет никаких шаблонов или не влияет на презентацию, когда он просто получает данные и обслуживает их (как JSON), поэтому концептуально они остаются отдельными.