Laravel 4 как RESTful бэкэнд для AngularJS

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

Например...

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

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

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

Заранее спасибо за предложения, примеры...

2 ответа

Решение

Наконец я нашел рабочее решение, идеальное в моем сценарии, для которого не требуется поддомен. В этом случае 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);

вместе с (внутри раздела index.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>

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

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

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

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

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

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

Другие вопросы по тегам