【问题标题】:Grunt serve + PHP?咕噜服务+ PHP?
【发布时间】:2014-04-28 14:06:57
【问题描述】:

我正在使用 yo + grunt + angular.js 开始我的第一个项目。
我有一项服务需要从我的服务器读取一些数据;我使用 angular $http 服务构建了它。 我还构建了一个 RESTful Web 服务(用 PHP 实现,但它可以是 Java、C、Perl,...,没关系),它公开了一个 API 来获取数据。
grunt 为我的 ng-app 提供服务的服务器当前(并且可能永远)与运行 PHP Web 服务的服务器相同(由 apache 提供)。

我想知道这是否是一个可接受的架构...我最终在同一台服务器上拥有两个不同的服务器(grunt 和 apache)...此外,我总是必须添加一个“访问控制允许来源: 127.0.0.1" 到我的 PHP 服务的输出... :-(

例如,是否可以从 grunt 提供 PHP 服务?

更新:我说的是开发阶段...当然在生产中我不会使用 grunt...
为了更好地解释自己,我想在 $http() 中使用相对 url...在开发和生产阶段使用相同的代码...
如果在生产中我可以期望它工作,因为我将只有一台服务器用于部署的 Angular 应用程序 PHP 服务,当 Angular 应用程序由 Grunt 提供服务时,该服务应该在开发时解释 PHP ?咕噜声本身?如果是,怎么做?

UDPATE 2 和一个可能的解决方案:在对这个问题思考了很多(也阅读了this 文章)之后,在这里没有得到满意的答案,我决定使用这种方法:

  • 发展
    • 使用“类似生产”的服务器(Apache、lighttpd、...)来提供真正的 PHP 页面。
      使用带有 $http 或 $request 的绝对 URL 来访问该服务器(与 Grunt 不同,后者提供 angular.js 页面)。网址将很容易配置,只需要最少的工作(和可能的错误)即可切换到生产环境。
    • 在 PHP 脚本中,在生成 (JSON) 输出之前,始终输出正确的“Access-Control-Allow-Origin”标头;该指令的值也很容易配置。

  • 生产
    • 将 angular.js 应用部署到部署 PHP 的同一服务器。
    • 更改 url 并使它们相对,因为现在它们与客户端脚本共享相同的来源。
    • 更改“Access-Control-Allow-Origin”标头,以仅允许本地请求(或者可能完全删除该标头...)。

如果有人想对此解决方案发表评论、提出异议或提出更好的解决方案,我将非常高兴...

【问题讨论】:

  • 是的,你可以用 grunt 服务 php,但你最好使用 Apache 而不是内置的 livereload/watch 服务器。您仍然可以运行 grunt server 以使页面在保存时自动刷新。这将节省部署时间并允许您使用 modrewrite 等。
  • 我不会使用主要用于简化开发的东西来服务于生产应用程序。
  • 我说的是开发阶段...当然在生产中我不会使用 grunt...但是我想知道是否 - 例如 - 在 $http() 中我可以使用相对 url ...希望我确实解释了自己...
  • 你考虑过使用 php buildin server for dev 吗?我用那个通过。带有 livereload 的 grunt-php

标签: php angularjs gruntjs


【解决方案1】:

我们对工作中的问题的解决方案是在 app 文件夹中创建包含示例数据的平面文件,并使用带有 $resource 和 $http 的相对 URL,然后将我们的代码部署为同一子目录级别的应用程序... /fx /api/fund 例如。

这允许 grunt 提供一些静态的东西来查看 Angular 应用程序的设计外观,同时仍然提供完整的体验。然后我们有一个开发服务器,当我们提交代码(使用 Jenkins)时,它会更新,我们可以检查真正的功能并运行我们的测试套件。

这种方法有点笨拙,但它使我们能够获得 grunt 方法的好处,并且仍然有一个测试服务器。我们还让我们的构建使用缩小版本,以便我们可以测试放大不会破坏应用程序。

这种方法的唯一问题是带有 grunt 的内置 Web 服务器无法处理 post 请求,因此任何调用 post 的操作都会失败。

【讨论】:

  • 我明白了...这个解决方案并不能完全满足我的需求,我最好解释和执行一个真正的 php 页面(也可以测试 php 代码...:-)
  • 我们在我们的开发服务器上使用配置匹配生产进行测试。
  • 我知道这是一个可能的解决方案,但我想要更“健壮”的东西......我的意思是,我觉得php输出和平面文件之间的对应关系是一个非常薄弱的​​点,一个点失败...
【解决方案2】:

听起来你正在尝试和我做同样的事情。 (仅限本地开发的解决方案)

我正在使用 yo angular 来启动一个 angular 项目,但我想连接到一个 php 服务来传递一些内容。

我使用 grunt-connect-proxy 将我的发布请求传递给 apache。这很好用,除了发送表单数据时 $_POST 保持为空的事实,例如$http.post('/api',{"foo":"bar"})。我发布了一个关于这个的问题,但它仍然没有解决,我不知道如何让它工作。无论如何,另一种解决方案是将所有内容保存在同一个文件夹/域中。

这就是我的故事

其实这个故事是有尾巴的。 终于我找出了导致问题的原因,see this post

【讨论】:

  • 谢谢,很高兴看到其他人面临同样的问题... :-) 我自己也尝试过“grunt-connect-proxy”,IIRC,但确实阅读了有关 $_POST 的信息问题,所以我也放弃了它......我确实接受了你的第二个解决方案。你是如何解决 CORS 的?在开发阶段,我确实在每个 php 页面上输出 Access-Control-Allow-Origin: http://mygruntserverdomainandport...虽然,我觉得这是一个次优(非常次 :-) 解决方案... :-(
  • 感谢您分享您的解决方案。但是,您是说“将所有内容保存在同一个文件夹/域中”时没有 CORS 问题吗?你用什么来提供角度服务?咕噜声,还是同一个阿帕奇?在第一种情况下应该很奇怪,因为它们是不同的服务器,因此是不同的域......
【解决方案3】:

没有得到满意的答复,我自己想了很多之后,给出我的结论:

  • 发展
    • 使用“类似生产”的服务器(Apache、lighttpd、...)来提供真正的 PHP 页面。
      使用带有 $http 或 $request 的绝对 URL 来访问该服务器(与 Grunt 不同,后者提供 angular.js 页面)。网址将很容易配置,只需要最少的工作(和可能的错误)即可切换到生产环境。
    • 在 PHP 脚本中,在生成 (JSON) 输出之前,始终输出正确的“Access-Control-Allow-Origin”标头;该指令的值也很容易配置。

  • 生产
    • 将 angular.js 应用部署到部署 PHP 的同一服务器。
    • 更改 url 并使它们相对,因为现在它们与客户端脚本共享相同的来源。
    • 更改“Access-Control-Allow-Origin”标头,以仅允许本地请求(或者可能完全删除该标头...)。

【讨论】:

  • 嘿,谢谢分享。我也有同样的问题。当您使用标头“Content-Type: application/json”发出请求时,此解决方案是否有效?
  • 是的,当然...您唯一应该记住的是,如果您发布 JSON 数据,您必须确保您的标头包含“Content-Type”:'应用程序/x-www-form-urlencoded'...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多