【问题标题】:Combining Angularjs and CodeIgniter结合 Angularjs 和 CodeIgniter
【发布时间】:2013-01-18 22:07:21
【问题描述】:

我正在开发一个用 CodeIgniter 编写的现有网站,我们正在考虑将 AngularJS 用于一些需要大量前端功能但我们不想替换所有 CodeIgniter 视图(一次(目前))的页面。

所以我点击了一个由 Angular 的路由器控制的链接,它由 javascript 处理,但下一个链接可能是应该由 CodeIgniter 框架处理的“正常”请求。

有没有什么优雅的方法可以结合这两种方法?我真的不介意一些额外的客户端开销,因为该网站尚未在生产中运行。

【问题讨论】:

    标签: php javascript codeigniter angularjs


    【解决方案1】:

    我从未使用过 Angular - 不过这可能会有所帮助。

    所以我点击了一个由 angular 路由器控制的链接,它是 由javascript处理

    此 JavaScript 是否向您的 CI 控制器之一发出 Ajax 请求?如果是这样,CI 现在有 is_ajax_request() 方法,它允许您检查请求(POST 或 GET)是否来自 ajax。您可以根据来自 Ajax 的请求与普通请求进行不同的处理。

    用户指南(页面底部):http://ellislab.com/codeigniter/user-guide/libraries/input.html

    希望对你有帮助!

    【讨论】:

    • 在服务器端结合这两种技术没有问题,但在客户端,当网站上仍然有 php 生成的 html 页面时,我不确定如何使用 Angulars 路由。
    【解决方案2】:

    我继承了一个 CI 应用程序,我使用 Angular 和 CI 主要用于路由请求。在我的情况下,我没有使用 Angular 模板,所以我在 $routeProvider 配置中使用 ' ' 空但带有空格参数作为模板选项。这允许我执行通常的 CI ajax 请求,而无需对原始服务器端代码进行太多更改。

    angular.module('my_app', []).
      config(['$routeProvider', function($routeProvider) {
      $routeProvider.
       when('/', { template: " ", controller: my_routes.mainpage}). 
       when('/design/:designId/:action', {template: " ", controller: my_routes.show_design}).
       when('/vote_design/:designId', {template: " ", controller: my_routes.vote_design}).
       otherwise({redirectTo: '/'});
    }]);
    

    【讨论】:

      【解决方案3】:

      随着 Angular 应用程序的增长,您似乎希望逐渐减少对 CodeIgniter (CI) 路由的使用。这并不难,但需要很多细节。哪种方法有效取决于您的项目结构。 注意:我从 Code Igniter URL 中删除了 index.php,因此下面的路径可能与默认路径不同。

      1) CodeIgniter 安装在根目录

      如果 CI 安装在服务器的根目录上,您可以在 CI 中创建一个文件夹(例如,我有一个“ng”文件夹)。您的项目将如下所示:

          /controllers
          /models
          /ng
          (etc)
          /index.php (code igniter index file)
      

      /ng 中放置一个 .htaccess 文件,内容如下:

          Order allow, deny
          Allow from all
      

      这允许直接访问/ng 中的文件,而不是通过 CI 的路由系统将这些请求发回。例如,您现在可以直接加载它: example.com/ng/partials/angular-view.html

      主网页仍将由 CodeIgniter 创建,但它现在可以包含 Angular 资产,例如部分视图等。最终,您可以通过返回一个简单页面并加载 Angular 来替换 CodeIgniter 所做的大部分工作来自/ng 的部分视图,就像它的设计目的一样。

      这个方法很好,因为 CodeIgniter 可以控制是否加载初始页面(通过 CI 控制器中的一些用户身份验证代码)。如果用户未登录,他们将被重定向并且永远不会看到 Angular 应用程序。

      2) 目录中的 CodeIgniter

      如果 CI 安装在一个目录中,例如example.com/myapp/(code igniter),您可以简单地在它旁边创建一个目录,example.com/myappNg/

          /myapp/
          /myapp/controllers/
          /myapp/models/
          /myapp/(etc)
          /myapp/index.php (code igniter index file)
          /myappNg/
          /myappNg/partials/
          /myappNg/js/
          /myappNg/(etc)
      

      现在在您的 Angular 应用程序中,您可以通过使路径相对于域根目录而不是相对于 Angular 应用程序来从 CI 请求资源。例如,在 Angular 中,您将不再从 Angular 文件夹 partials/angular-view.html 请求局部视图,而是希望从 CI /myapp/someResource 请求视图。注意前导/。 "someResource" 可以返回一个 html 文档,或者 JSON 或者任何你用 Code Igniter 做的事情。

      最终您可以替换引用/myapp/ 的路径数。一旦你不再使用 CI 做任何事情,你可以简单地将你的 Angular index.html 放在 /myapp/ 中,它会继续在 /myappNg/ 处引用你的路径。

      TL;DR 使您的 Angular 应用程序完全可用,并将其与 CodeIgniter 分离。逐渐转向使用 Angular 部分视图和其他 JSON 源,而不是链接到 CodeIgniter 页面。最终用一个引导 Angular 的 HTML 文件替换你的 CodeIgniter 端点。

      【讨论】:

      • 如果您真的这样做,这是正确的方法,我们最终创建了一个 codeigniter API 和一个单独的 angularjs 前端。
      • 在 Codeigniter 到 Angular 的过渡过程中,您是如何管理会话的?
      【解决方案4】:

      最好的办法是将后端代码与 Angular 代码分开 并使用 codeInginter 代码作为 API

      /Codeigniter 代码 /角度代码

      因为 CodeIgniter 自带安全功能,这应该是你最好的选择

      【讨论】:

        【解决方案5】:

        我从另一个与我一起工作的程序员那里找到了一个 CI 站点,该站点正在休假几个月。由于其目的的性质,我们的网站主要是用很多角度构建的。我们的解决方案有点不同。

        与标准 CI 框架不同的是几个文件夹:js\angular\controllersjs\angular\modules 在 CI 的应用程序文件夹中,用于保存所有角度模型和控制器文件。然后将 Angular 文档加载到应用程序基础文件夹中。

        【讨论】:

          【解决方案6】:

          除了 Aaron Martin 给出的答案之外,还可以将其用作客户端 - 服务器方法。

          假设我们在项目的根目录中创建了 2 个文件夹:

          1. 客户

          2. 服务器

          Client 文件夹将包含 AngularJS 的所有代码和客户端库,包括 Bower 和 Npm 库。 客户端的路由也将由 AngularJS 路由器处理。

          将有工厂或服务充当客户端 angularjs 的提供者。 这些文件将包含发送请求和从服务器端接收响应的代码。

          Server 文件夹将包含 Laravel 或 CodeIgniter 或任何其他 PHP 框架的代码。 您将创建请求的所有 API 并相应地开发功能。 因此,整个 PHP 部分(服务器目录)将存储所有媒体文件和数据库文件。此外,它还将具有 RSS 提要等的任何接收链接。

          客户端在其服务器上的任何 API 上请求时,只会收到 JSON 或 XML 格式的所有响应..

          在我看来,这是开发 Web 应用程序的最佳实践之一。

          【讨论】:

          • 客户端仅表示使用 Web api(rest api)的(标准)Web 应用程序。服务器是 web (rest) api。两者都可以用 CodeIgniter 编写。在客户端,您可能希望使用 AngularJs 等客户端库。没有更多的了。
          猜你喜欢
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2014-10-31
          • 2015-07-08
          • 1970-01-01
          • 1970-01-01
          • 2016-12-16
          • 2018-05-17
          相关资源
          最近更新 更多