基于Zend Framework 2、Require.js和Backbone.js的RESTful架构Demo

这是将Zend Framework 2官方Album的Demo改成一个客户端基于Require.js和Backbone.js,服务端基于Zend Framework 2的一个RESTful架构的Demo。

本程序将Album demo中的CRUD功能改成了一个名为AlbumRestApiController的controller提供RESTful API,这个AlbumRestApiController继承了ZF2提供的AbstractRestfulController,它可以根据HTTP请求的method:POST,GET,PUT和DELETE来自动分发请求至CRUD的action。

在前端使用Require.js来管理js的文件,用Backbone.js来实现MVC、路由分发的功能和路由欺骗的功能,js的主要程序在/public/js/application中。

建议使用谷歌Chrome当打开应用,需要配置虚拟主机,访问http://your-domain/album-rest,在页面的header里会发现一个播放器,这个播放器是用来测试页面是否有刷新的,在播放音乐的时候对页面进行操作跳转,如果URL改变了页面也改变了但音乐没有停止播放说明程序是实现了我想要的概念——网站即应用,所有的AJAX数据请求都是访问上面提到的RESTful API,做到了URI即资源。

程序的git地址:http://git.oschina.net/tonitech/RESTful-Zend-Framework-2-Demo 。

由于github服务器在国外,其下载上传速度跟开源中国提供的git库是没法比的,所以我选择了开源中国的代码托管。

本程序是本人用于学习Zend Framework 2、Require.js和Backbone.js以及RESTful概念使用,欢迎各位同仁批评指正,Fork和Star点赞!谢谢!

Zend Framework 2在Nginx服务器下无法路径重写的解决办法

今天我在我的pcDuino上添加Zend Framework 2应用程序,在Nginx中添加了Server的配置之后打开网站,发现首页没有任何问题,但是其他的Module都无法进入,我想想感觉问题应该出在路径重写的问题上。我想要不我把.htaccess的规则改写成Nginx的rewrite规则吧!然后我打开.htaccess,内容如下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

有种虽不明但觉利的感觉,算了,我放弃我刚刚的想法,怎么办怎么办?算了,我还是去咨询一下把,于是跑到Stackoverflow去问了下这个问题,有个老外回答了下:

You really do not need any rewrite rules to make Nginx and ZF2 to play nice together. Here is a very simple Nginx configuration which I use:

server {
    listen *:80;
    server_name DOMAIN;

    # Character Set
    charset utf-8;

    # Logs
    access_log /vhosts/DOMAIN/logs/access_log main;
    error_log /vhosts/DOMAIN/logs/error_log;

    # Directory Indexes
    index index.php;

    # Document Root
    root /vhosts/DOMAIN/public;

    # Location
    location / {
        try_files $uri $uri/ /index.php;
    }

    # Error Pages
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    # PHP-FPM Support
    location ~ \.php$ {
        fastcgi_pass unix:/usr/local/etc/php-fpm/DOMAIN.sock;
        include fastcgi.conf;
    }

    # Block access to .htaccess
    location ~ \.htaccess {
        deny all;
    }
}

Of course change the paths to your current setup. Since you did not mention what type of PHP installation you are using I can’t help you there because I am currently using PHP-FPM.

Using this very simple setup all my modules are working as expected. For example I could visithttp://example.com/some/url OR http://example.com/index.php/some/url

Nginx also has a simple configuration for ZF http://wiki.nginx.org/Zend_Framework#Time_for_nginx

我试了下,果然成功了!

最重要的是配置Location的:

location / {
    try_files $uri $uri/ /index.php;
}

和阻止.htaccess的:

location ~ \.htaccess {
    deny all;
}