4

我正在使用 CakePHP 作为我的后端和 AngularJS 作为我的前端框架来构建一个应用程序。

我需要将 CakePHP 与我的前端代码放在同一台服务器上,以便它可以提供我需要的 JSON。

通常在 CakePHP 中,有一个 webroot 文件夹,除了 js/css/less/* 之外,还有一个 index.php 与 CakePHP 挂钩。但是,添加 AngularJS 会增加一些复杂性,因为我还想要一个 index.html。

这是我想要的控制流程:

  • 如果用户访问 domain.com/,则显示 index.html(但路由保持为 '*.com/'!)
  • 如果用户访问 domain.com/#/home,显示 index.html 并让 Angular 处理哈希路由
  • 如果用户访问 domain.com/about(假设 about 页面、html 和所有内容由 CakePHP 提供),请将它们发送到 index.php。
  • 如果我使用 domain.com/users/list.json 进行 AJAX 调用,请使用 index.php,以便 CakePHP 可以提供 JSON。

所以我的想法是我可以让 .htaccess 规则来处理这个问题。但我不太确定要写什么。

现在我有:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d #if it's not an existing directory
    RewriteCond %{REQUEST_FILENAME} !-f #if it's not an existing file
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L] #everything else, send to CakePHP
</IfModule>

有任何想法吗?

它会像在最后一个条件之后添加一行一样简单RewriteRule / index.html [L]吗?

此外,请随时建议使用 CakePHP 和 AngularJS 的替代设置。

谢谢!


编辑:我想提供更多关于我用于 AngularJS 的构建系统的信息,以及为什么它会导致仅从“home.ctp”视图提供服务的问题。

我正在使用ng-boilerplatewhichkarma用于测试和grunt连接、丑化以及在 index.html 中包含脚本。

我认为构建系统真的很漂亮,因为它允许我保持模块化结构。

这是典型ng-boilerplate前端的目录结构:

ng-boilerplate/
  |- build/                    # Development build
  |  | index.html
  |  | assets/
  |  | 
  |  |- angular/
  |- grunt-tasks/
  |- karma/
  |- src/                      # Actual source code I'm editing
  |  |- app/
  |  |  |- <app logic>
  |  |- assets/
  |  |  |- <static files>
  |  |- common/
  |  |  |- <reusable code>
  |  |- less/
  |  |  |- main.less
  |- vendor/
  |  |- angular-bootstrap/
  |  |- bootstrap/
  |  |- placeholders/
  |- build.config.js           # Build configuration specific to app
  |- Gruntfile.js
  |- module.prefix
  |- module.suffix
  |- package.json

(有关这些目录和文件夹的更多信息:https ://github.com/joshdmiller/ng-boilerplate )

home.ctp这使得工作流程变得困难,因为每次编辑 index.html 时,我都必须采用最新的“构建”(在开发期间)并手动放置 index.html 文件。

这就是为什么我首先想到.htaccess。不过,我知道如果我确实想直接从 CakePHP 提供页面而不是将 AngularJS 引入图片,那么这个想法有其自身的局限性。

也许我可以配置构建系统以将 index.html 放在 CakePHP 的home.ctp视图中。关于这个解决方案的任何想法?

4

2 回答 2

9

把事情简单化

Cake 的主要原则之一是KISS(“保持简单(愚蠢)”)。

/如果 url 的响应是 index.html 文件的响应,则不需要任何重写规则更改

即做相当于这个:

cd app
mv webroot/index.html View/Pages/home.ctp
<edit View/Pages/home.ctp>

如果将以下内容放在视图文件的顶部:

<?php $this->layout = false; ?>

您也可以将内容保留为完整的原始 html 文件。

这样做将消除任何.htaccess修改的需要。

关于其中一个要点的具体说明:

如果用户访问 domain.com/#/home,显示 index.html 并让 Angular 处理哈希路由

无需为此做任何事情,因为浏览器不会通过请求发送 url 片段 - 服务器上收到的 url 是domain.com/.

但是如果你真的想用 mod rewrite 来做

然后所需要的就是为 url 添加一个规则/- 这是唯一的例外:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule  ^$ /index.html [L]

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

请务必使用.htaccess您正在使用的确切版本的 cake 规则,因为它们多年来发生了变化,并且使用旧版本的重写规则和新版本的 Cake 可能会导致奇怪的行为。

请注意,目录排除条件不是必需的,也可能是不需要的(它允许使用 eg 列出目录/css)。

于 2013-07-08T08:32:09.520 回答
0

查看链接:

烘焙后端 REST API 我将重用 CakePHP 博客教程的数据库方案。准备帖子表 执行以下脚本在您的 MySQL 数据库中创建一个帖子表,它还初始化了示例数据。

http://hantsy.blogspot.com.ar/2013/11/create-restful-application-with.html

于 2014-11-01T04:14:59.490 回答