You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Symfony Webpack Encore中从多目录加载Stimulus控制器?

如何在Symfony Webpack Encore中从多个目录加载Stimulus控制器

当然可以同时从多个目录加载Stimulus控制器,以下是几种实用的实现方式:

1. 手动注册单个控制器

如果只需加载其他目录下的特定控制器,直接导入后调用app.register()即可完成注册:

import { startStimulusApp } from '@symfony/stimulus-bridge';
// 导入其他目录的控制器文件
import AlertController from './shared/controllers/AlertController';
import ModalController from './admin/controllers/ModalController';

export const app = startStimulusApp(require.context(
    '@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
    true,
    /\.[jt]sx?$/,
));

// 注册额外目录的控制器
app.register('alert', AlertController);
app.register('modal', ModalController);

2. 批量加载整个目录的控制器

如果要一次性加载某个目录下的所有控制器,可以通过额外创建require.context实现批量注册:

import { startStimulusApp } from '@symfony/stimulus-bridge';

export const app = startStimulusApp(require.context(
    '@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
    true,
    /\.[jt]sx?$/,
));

// 创建对应目录的上下文,批量加载控制器
const adminControllersContext = require.context(
    '@symfony/stimulus-bridge/lazy-controller-loader!./admin/controllers',
    true, // 开启递归加载子目录
    /\.[jt]sx?$/
);

// 遍历上下文并注册每个控制器
adminControllersContext.keys().forEach(key => {
    const controllerModule = adminControllersContext(key);
    // 从文件名提取控制器名称(比如从"./UserController.js"提取"user")
    const controllerNameMatch = key.match(/\.\/([A-Z][a-zA-Z0-9]+)Controller\.[jt]sx?$/);
    if (controllerNameMatch) {
        const controllerName = controllerNameMatch[1].toLowerCase();
        app.register(controllerName, controllerModule.default);
    }
});

3. 通过controllers.json配置批量加载

如果你使用controllers.json管理控制器规则,可以直接在配置中添加额外目录:

{
    "controllers": {
        "./controllers/": {
            "glob": "*.{js,ts}",
            "lazy": true
        },
        "./admin/controllers/": {
            "glob": "*.{js,ts}",
            "lazy": true
        },
        "./shared/controllers/": {
            "glob": "*.{js,ts}",
            "lazy": true
        }
    },
    "entrypoints": []
}

之后修改bootstrap.js,让Stimulus加载这个配置(替代原有的目录直接加载):

import { startStimulusApp } from '@symfony/stimulus-bridge';

// 从controllers.json加载所有配置的控制器目录
export const app = startStimulusApp(require.context(
    '@symfony/stimulus-bridge/lazy-controller-loader!./',
    true,
    /\.(j|t)sx?$/
));

内容的提问来源于stack exchange,提问作者Thomas Landauer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:40:45