3

我无法让FOSJsRoutingBundleSymfony Flex、WebpackAngularJS一起使用。

我在 Symfony 3 和 AngularJS 中使用这个包已经很长时间了,从来没有出现过问题,但是随着 Symfony Flex 中 webpack 的引入,设置变得更加复杂。不幸的是,FOSJsRoutingBundle 2.2 版的文档并不清楚。

您可以在此处找到此捆绑包的当前文档。

我正在使用FOSJsRoutingBundle,以便我的 Angular HTTP 请求可以使用生成的路由而不是绝对 URL。

问题

我已经按照composer的文档设置了这个包。然后将路由转储到位于 的 json 文件中code/assets/fos_js_routes.json。此文件中生成的路由是有效的,并且是我期望看到的。

当我使用 Angular 时,我想在一个单独的文件中对路由进行初始所需的声明,这样我的所有 Angular 控制器都可以使用,Routing.而无需在这些文件中做任何进一步的工作。


FOS 设置文件 /code/assets/js/fos_js_router.js以下文档

const routes = require('../../assets/fos_js_routes.json');
import Routing from '../../vendor/friendsofsymfony/jsrouting-bundle/Resources/public/js/router.min.js';

Routing.setRoutingData(routes);

示例 Angular 文件 /code/assets/js/apps/default/controller/test.js

(function () {

    'use strict';

    angular.module('test')
    .controller(
        'TestCtrl',
        ['$scope', '$http',
            function ($scope, $http) {

                let url = Routing.generate('test_route_name');
             }
         ])
});

Webpack 配置

var Encore = require('@symfony/webpack-encore');

Encore
    .setOutputPath('public/build/')
    .setPublicPath('/build')
    .addEntry('app', './assets/js/app.js')
    .addEntry('app_fos_router', [
        './assets/js/fos_js_router.js'
    ])
    .addEntry('app_angular', [
        './assets/js/apps/default/app.js', // angular app setup
        './assets/js/apps/default/routes.js', // angular routes setup
        './assets/js/apps/default/controller/test.js' // angular where Routing is needed
    ])
    .enableSingleRuntimeChunk()
    .cleanupOutputBeforeBuild()
    .enableBuildNotifications()
    .enableSourceMaps(!Encore.isProduction())
    .enableVersioning(Encore.isProduction())
;

module.exports = Encore.getWebpackConfig();

前端树枝模板

{% extends 'base.html.twig' %}

{% block title %}Test{% endblock %}

{% block javascripts %}
    {{ encore_entry_script_tags('app') }}
    {{ encore_entry_script_tags('app_fos_router') }}
    {{ encore_entry_script_tags('app_angular') }}
{% endblock %}

{% block body %}
    <div ng-app="test" ui-view="content"></div>
{% endblock %}

错误

从上面的设置中,我得到test.js: ReferenceError: Routing is not defined at了我的 AngularJS 文件。

我需要做些什么不同的事情才能let url = Routing.generate('test_route_name');在我的 AngularJS 文件中使用?

4

2 回答 2

2

router.js在您的assets/js目录中创建文件。接下来,填写router.js以下内容:

const routes = require('./fos_js_routes.json');
const router = require('../../vendor/friendsofsymfony/jsroutingbundle/Resources/public/js/router.min.js');
router.setRoutingData(routes);
module.exports = router;

像这样提供新变量webpack.config.js

.autoProvideVariables({
    "Routing": "router",
})

将新的加载器添加到您的 webpack:

.addLoader({
    test: /jsrouting-bundle\/Resources\/public\/js\/router.min.js$/,
    loader: "exports-loader?router=window.Routing"
})

最后扩展 webpack 配置:

let config = Encore.getWebpackConfig();

config.resolve.alias = {
'router': __dirname + '/assets/js/router.js',
};

module.exports = config;

它应该使 Routing 成为全局对象,以便您可以在其他 js 文件中使用它,如下所示:

let url = Routing.generate('some_route_name', { param: value });

希望能帮助到你。干杯。

于 2019-01-05T19:12:07.790 回答
1

让这个工作的简单修复:

const routes = require('../../assets/fos_js_routes.json');
import Routing from '../../vendor/friendsofsymfony/jsrouting-bundle/Resources/public/js/router.min.js';

Routing.setRoutingData(routes);
window.Routing = Routing;
于 2019-01-05T20:48:01.387 回答