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

Craft CMS自定义表单模块控制器Action触发404错误求助

Craft CMS 自定义模块表单提交404错误排查与修复

我在使用Craft CMS开发自定义联系表单模块,目标是实现后台查看提交记录+提交后发送邮件,但表单提交时一直报HTTP 404 - 未找到错误。

已完成以下操作:

  • 创建了模块、控制器及对应Action
  • 在config/app.php中配置了模块
  • 在composer.json的psr-4中添加了自动加载规则
  • 尝试过多种命名空间和路由组合,问题依然存在

文件夹结构

modules/
├─ submissions/
    ├─ Module.php
    ├─ Controllers/
        ├─ defaultController.php

相关代码片段

表单Action输入代码

{{ actionInput('submissions/default/send-submission') }}

使用actionUrl也会触发相同错误:

<a href="{{ actionUrl('submissions/default/send-submission') }}">link</a>

模块代码(Module.php)

<?php
namespace submissions;

use Craft;

class Module extends \yii\base\Module
{
    public function init()
    {
        // 定义与命名空间对应的别名
        Craft::setAlias('@submissions', __DIR__);

        // 根据请求类型设置控制器命名空间
        if (Craft::$app->getRequest()->getIsConsoleRequest()) {
            $this->controllerNamespace = 'modules\\submissions\\console\\controllers';
        } else {
            $this->controllerNamespace = 'modules\\submissions\\controllers';
        }

        parent::init();
    }
}

控制器代码(defaultController.php)

<?php
namespace modules\submissions\controllers;

use Craft;

class defaultController extends Controller
{

    protected $allowAnonymous = [
        'action' => self::ALLOW_ANONYMOUS_LIVE | self::ALLOW_ANONYMOUS_OFFLINE,
    ];

    public function actionSendSubmission() 
    {
        echo "test";
    }    
}

核心问题排查与修复

1. 控制器命名规范修正

Craft CMS遵循Yii框架命名约定,控制器类名必须首字母大写,且文件名需与类名完全一致:

  • 将控制器文件名改为DefaultController.php
  • 将类名改为DefaultController

2. 命名空间与模块配置匹配检查

确保config/app.php中的模块配置正确:

return [
    'modules' => [
        'submissions' => [
            'class' => 'submissions\Module',
        ],
    ],
    'bootstrap' => ['submissions'],
];

同时确认composer.json的psr-4自动加载规则覆盖正确路径:

"autoload": {
    "psr-4": {
        "submissions\\": "modules/submissions/",
        "modules\\submissions\\": "modules/submissions/"
    }
}

修改后执行composer dump-autoload刷新自动加载规则。

3. 匿名访问配置修正

控制器中allowAnonymous的配置格式错误,需指定具体动作名称:

protected $allowAnonymous = ['send-submission'];

或精细化配置:

protected $allowAnonymous = [
    'send-submission' => self::ALLOW_ANONYMOUS_LIVE | self::ALLOW_ANONYMOUS_OFFLINE,
];

4. 缓存清理

修改配置和代码后,必须清理Craft缓存:

  • 后台进入设置 → 缓存 → 清空所有缓存
  • 或执行控制台命令:php craft clear-caches/all

内容的提问来源于stack exchange,提问作者jelle.rondas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:00:57