如何将 Angular js 路由与 laravel/lumen 路由一起使用?

Posted

技术标签:

【中文标题】如何将 Angular js 路由与 laravel/lumen 路由一起使用?【英文标题】:How to use angular js routing with laravel/lumen routing? 【发布时间】:2016-05-26 03:15:39 【问题描述】:

我正在开发在 laravel(最新版​​本 5.*)上开发的 web 应用程序。我做了很多搜索,但没有找到确切的解决方案,如何将 angular js 路由与 laravel 路由结合使用。

假设网址像:

/viewItem/2 /editItem/5 等等,任何有参数的url

我想使用angular js根据参数获取数据。问题是laravel有自己的内置路由(/app/Http中的routes.php)和使用(ngRoute模块)的angular js路由。

如果两个路由同时使用,具体流程是什么? 如果想避免在需要后端数据的每个页面上创建对象来获取数据,如何实现? eg.$obj->getItem($id) Angular js 路由放置在哪里?

【问题讨论】:

【参考方案1】:

这些技术是不同的。 Angular Routing 是为单页应用程序 (https://en.wikipedia.org/wiki/Single-page_application) 构建的。 Laravel 路由服务多个页面。

但是,如果你想要一个单页应用程序,你应该使用 Laravel 路由/控制器来给应用程序页面。

您还可以使用 (https://laravel.com/docs/5.2/controllers#restful-resource-controllers) Laravel 资源控制器 在您的 JS 应用和后端之间共享数据。

但你不能混合使用 Laravel 和 Angular 路由。

【讨论】:

【参考方案2】:

您需要区分 Laravel 应用程序的路由和 Angular 应用程序的路由。

定义一个路由来显示 Angular 应用程序

// Http/routes.php

Route::get('/js_route', function() 
    return view('application');
)->where('js_route', '(.*)'); // Allow multiple URI segments

此路由允许斜杠使用 ngRoute 进行路由,它应该是您的 routes.php 中最后定义的。

它只会渲染一个模板,用于显示你的真实 Angular 应用程序。

// views/application.blade.php

<html>
    <body>
        <div class="container">
            <div ng-view></div> <!-- Here will come your partial views -->
        </div>
    </body>
</html>

使用 Angular 进行真正的应用程序路由

现在,使用 ngRoute 定义应用程序的路由并在它们之间导航。

// public/js/src/app.js

$routeProvider
    .when('/', 
        templateUrl: 'Default/index.html', // A simple HTML template
    );

// ...

在 Laravel 中创建 API 端点

您将在 Angular 应用程序中使用 XHR 从 Laravel 应用程序中检索数据。 为此,只需在相应的方法(即 GET、POST)中定义新路由,并创建相应的控制器/动作。

// Http/Controller/FooController.php

class FooController extends \BaseController 

    /**
     * List all Foo entities in your app
     *
     * @return Response
     */
    public function index()
    
        return Response::json(Foo::get());
    


// Http/routes.php

Route::get('/api/foo', 'FooController@index')

创建服务/工厂以检索您的数据

// public/js/src/app.js

(function (app) 

    function FooService($http, $q) 
        this.getFoos = function() 
            return $http.get('/api/foo');
        ;
    

    app.service('Foo', FooService);

)(angular.module('yourApp'));

这样,您可以从 laravel 路由中检索数据,而无需直接浏览路由。 // public/js/src/app.js

function MainCtrl($scope, $http) 
    $scope.listFoo = function() 
        $http.getFoos()
            .then(function(response) 
                $scope.foos = response.data;
            , function(error) 
                console.log(error);
            );
    ;


app.controller('MainController', MainCtrl);

使用您的应用程序

现在,您可以仅使用 javascript 路由在应用程序中导航,并使用 Laravel 路由从后端检索数据。

【讨论】:

【参考方案3】:

我是如何做到的: 在我的 routes.php 中

/**
 * Redirects any other unregistered routes back to the main
 * angular template so angular can deal with them
 *
 * @Get( "path?", as="catch.all" )
 * @Where("path": "^((?!api).)*$")
 *
 * @return Response
 */
  Route::any('path?', function () 

    View::addExtension('html', 'php');

    return View::make('index');

  )->where("path", "^((?!api).)*$");


/*
|--------------------------------------------------------------------------
| API routes
|--------------------------------------------------------------------------
*/
  Route::group([
    'prefix' => 'api'
  ], function () 
     //here are my api calls
  );

我在resources/view 中创建了一个 index.html,这是我的基地。 您可以将 jscss 文件放在 resources/assetspublic 文件夹中。

【讨论】:

我要导入哪个视图类?

以上是关于如何将 Angular js 路由与 laravel/lumen 路由一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?

Laraver 框架资料

如何在 Angular.js 中延迟路由定义?

如何在angular js中实现多路由

Angular 和 Express 路由如何在 mean.js 应用程序中协同工作?

如何结合护照和angular-ui路由