如何从Laravel视图/模板目录提供单页AngularJS应用程序


How to serve a single page AngularJS app from Laravel views/templates directory?

我正在尝试结合一个基于Mobile Angular UI的SPA Angle应用程序,该应用程序可以利用Laravel的功能,如csrf保护。 我可以将整个AngularJS应用程序放在Laravel的public/目录中,但我不确定这是否是正确的方法。

我正在寻找的是关于如何能够提供可以与Laravel交互的index.php的指导,单页AngularJS应用程序将从中接管。 就我而言,Laravel是单页应用程序的API。

问题:

  1. Laravel路由是为从templates/返回index.php/app3定义的

当然,我更愿意定义/app的路由,但是,所有 AngularjS 资产都位于 public/app/ 中,请求 app/ 返回默认目录列表,因为/app中没有 index.php/html。 简单地将index.php放在public/会导致空白页,因为由于某种原因,PHP永远不会被服务器解析。 将index.php更改为index.html有效,但是我如何利用Laravels csrf保护之类的功能呢?

  1. index.php正确加载所有 AngularJS 资源,并且没有控制台错误。

  2. 单击index.php的侧边栏链接,通常会返回一个AngularJS模板,该模板应放置在index.php中,而是加载目录不包含索引.php/html时显示的默认目录列表。

为什么 AngularJS 模板无法在 index.php 内部加载?

将单页AngularJS应用程序与Laravel相结合的最佳方法是什么?

终于明白了。问题是我的AngularJS路由链接是错误的。

以下是我的工作配置:


Laravel
routes.php
...
$router->get('/app3', function() {
    return view('app3.index');
});

AngularJS
index.php
<base href="/" />
...
<!-- Sidebars -->
<div ng-include="'/app/sidebar.html'" 
        ui-track-as-search-param='true'
        class="sidebar sidebar-left"></div>

demo.js
  app.config(function($routeProvider) {
  $routeProvider.when('/',              {templateUrl: 'app/home.html', reloadOnSearch: false});
  $routeProvider.when('/app/',              {templateUrl: 'app/home.html', reloadOnSearch: false});
  $routeProvider.when('/app/scroll',        {templateUrl: 'app/scroll.html', reloadOnSearch: false}); 
  $routeProvider.when('/app/toggle',        {templateUrl: 'app/toggle.html', reloadOnSearch: false}); 
  $routeProvider.when('/app/tabs',          {templateUrl: 'app/tabs.html', reloadOnSearch: false}); 
  $routeProvider.when('/app/accordion',     {templateUrl: 'app/accordion.html', reloadOnSearch: false}); 
  $routeProvider.when('/app/overlay',       {templateUrl: 'app/overlay.html', reloadOnSearch: false}); 
  $routeProvider.when('/app/forms',         {templateUrl: 'app/forms.html', reloadOnSearch: false});
  $routeProvider.when('/app/dropdown',      {templateUrl: 'app/dropdown.html', reloadOnSearch: false});
  $routeProvider.when('/app/drag',          {templateUrl: 'app/drag.html', reloadOnSearch: false});
  $routeProvider.when('/app/carousel',      {templateUrl: 'app/carousel.html', reloadOnSearch: false});
  $routeProvider.when('/app/toggleLegacy',  {templateUrl: 'app/toggleLegacy.html', reloadOnSearch: false});

sidebar.html
  <a class="list-group-item" href="/app3/#/app">Home <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/scroll">Scroll <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/toggle">Toggle <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/tabs">Tabs <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/accordion">Accordion <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/overlay">Overlay <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/forms">Forms <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/dropdown">Dropdown <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/test/invoice">Invoice <i class="fa fa-chevron-right pull-right"></i></a>
  <a class="list-group-item" href="/app3/#/app/test">Test <i class="fa fa-chevron-right pull-right"></i></a>

希望这可以帮助想要将移动角度UI与Laravel相结合的人!

感谢@Ohgodwhy澄清 AngularJS 模板需要在public/目录中。

假设你有这样的路线:

Route::get('/app3', 'RouteController@serveAngular');

然后你有一个控制器

class RouteController extends BaseController{
    public function serveAngular(){
        return View::make('angular/index');
    }
}

然后你就有了

-views
    -angular
        -index.blade.php

然后在你的index.blade中.php你只需要包含你的角度标记

<div ng-app="myApp">

不需要将ng-app定义放在 HTML 标记的顶部,只需放在应用程序容器的顶部即可。

当然,您还必须包含您的 AngularJS,以便您的主模板包含以下内容:

@yield('scripts')
</head>

这样,您就可以在角度模板中轻松挂钩

@section('scripts')
<script src="/path/to/my/AnguularJS.js"></script>
@stop

希望这有帮助。

您可以在公用文件夹中执行类似操作

公用文件夹中每个目录的内容:

public/app : Contains all AngularJS related JavaScript files (controllers and lib directories)
public/app/controllers: Contains all AngularJS controllers
public/app/lib : This directory will contain all AngularJS core files. You can also load AngularJS from a CDN network. 
public/css : Contains all CSS files.
public/js : Contains all regular JavaScript files for our UI.

您可以在以下位置阅读完整的文章:

http://deepdivetuts.com/create-laravel-and-angular-single-page-application-for-beginners-only