Laravel 4作为AngularJS的RESTful后端

时间:2013-11-13 22:40:07

标签: angularjs laravel-4 restful-architecture

我正在尝试构建一个Web应用程序,它应该在客户端使用Laravel作为RESTful后端API和AngularJS。 我在Stackoverflow上阅读了有关该问题的所有其他帖子,但没有人肯定回答我的疑虑,至少,我没有找到明确的源代码示例。

例如......

我应该开发两个完全不同的应用程序,一个是Laravel的后端,另一个是纯客户端,使用AngularJS? 但在这种情况下:如何通过单个域(或虚拟主机)处理它们?

或者我应该在Laravel中创建AngularJS模板,在"视图"文件夹和他们调用Laravel服务?我怀疑这是最好的方法:在这种情况下,后端并没有完全与前端实现分离。

另外,如何正确处理路由?我的意思是:我想管理AngularJS路线,如菜单/页面导航,只调用Laravel来检索数据并填充我的视图。 移动"公共"这篇文章(Angular JS + Laravel 4: How to compile for production mode?)中建议的文件夹可能有帮助吗?

Thanx提前提出建议,例子......

2 个答案:

答案 0 :(得分:25)

最后,我找到了一个工作解决方案,在我的场景中完美无缺,不需要子域。 在这种情况下,Laravel专门用作RESTful Web服务,没有服务器端视图或模板: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();
});

我启用了HTML5历史记录API,添加此行来配置我的Angular应用程序:

$locationProvider.html5Mode(true);

和(在index.html头部内):

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

因此解决浏览器页面刷新,深层链接或直接页面书签等问题的最后一个要求是在包含Angular应用程序的文件夹的根目录中添加.htaccess文件:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

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

希望它有所帮助!

答案 1 :(得分:0)

这是半个评论半答案,它太长了。

Matteo正如您所指出的,基本上有三个不同的地方可以使用此堆栈进行某种路由/重定向。通常我没有看到在Apache级别进行重定向的优势,我想这可能对本地化或者某种负载/磁盘平衡更有用。但是,如果您有多个指向此地址的域,并且需要将这些初始请求路由到相应的index.html,那么您将获得VirtualHost配置(因此,如果您考虑此路由,则这将是我的服务器端路由)。

一般来说,之后我依靠Angular $ routeProvider处理客户端“路由”,实际上只是将URL映射到视图(可能传递一些数据)。

我没有想过在我的PHP代码中设置路由器来创建一个合适的RESTful接口。在我的特定情况下,数据以相当抽象的方式存储,我必须在PHP中做相当多的工作才能以一致的方式组织它,任何直接的ORM类型解决方案都无法工作。这种尝试让我考虑像MongoDB这样的选项,因为它应该减轻从持久存储到客户端和返回的转换所需的工作量。

无论如何所有这一切都说我使用$ http来调用自定义服务到我需要的特定PHP端点。我的PHP文件夹和我的脚本就位于我的索引文件所在的位置旁边,因此来自angular的请求是来自服务器根目录的所有相对路径,这使得它很简单。因此它们在物理上“嵌套”,可以说或者并存,但PHP代码从不写任何模板或影响它只是获取数据并提供数据(作为JSON)的表示,所以在概念上它们保持独立。