0

我是 Craft 的新手(来自 Laravel),在尝试为使用 pluginfactory.io 创建的插件路由到控制器操作时遇到 404 错误。插件安装没有问题,但我似乎找不到执行控制器操作的方法。

这是相关的目录结构

├── composer.json
├── config
│   ├── app.php
│   ├── db.php
│   ├── general.php
│   ├── license.key
│   ├── redactor
│   └── routes.php
├── modules
│   └── Module.php
├── plugins
│   └── signup
│       ├── composer.json
│       └── src
│           ├── Signup.php

│           ├── controllers
│           │   ├── EnrollmentController.php
│           ├── models
│           │   ├── Enrollment.php
│           │   └── Settings.php

我已经尝试了我的 EnrollmentController 的默认控制器路由:http://localhost:8080/actions/signup/enrollment/index使用 /plugin/controller/action 格式,并且请求永远不会到达控制器。当我尝试创建自定义模块时遇到了同样的问题。

这是我的 EnrollmentController 的代码

namespace wolff\signup\controllers;

use wolff\signup\Enrollment;

use Craft;
use craft\web\Controller;

class EnrollmentController extends Controller
{
    protected $allowAnonymous = true;

    public function actionIndex()
    {
        $result = 'Welcome to the EnrollmentController actionIndex() method';

        die($result);
    }

这是 404 的堆栈跟踪

yii\base\InvalidRouteException: Unable to resolve the request "signup/enrollment/index". in /Applications/MAMP/htdocs/craft/vendor/yiisoft/yii2/base/Module.php:537
Stack trace:
#0 /Applications/MAMP/htdocs/craft/vendor/craftcms/cms/src/web/Application.php(299): yii\base\Module->runAction('signup/enrollme...', Array)
#1 /Applications/MAMP/htdocs/craft/vendor/craftcms/cms/src/web/Application.php(566): craft\web\Application->runAction('signup/enrollme...', Array)
#2 /Applications/MAMP/htdocs/craft/vendor/craftcms/cms/src/web/Application.php(278): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#3 /Applications/MAMP/htdocs/craft/vendor/yiisoft/yii2/base/Application.php(386): craft\web\Application->handleRequest(Object(craft\web\Request))
#4 /Applications/MAMP/htdocs/craft/web/index.php(21): yii\base\Application->run()
#5 {main}

Next yii\web\NotFoundHttpException: Page not found. in /Applications/MAMP/htdocs/craft/vendor/craftcms/cms/src/web/Application.php:570
Stack trace:
#0 /Applications/MAMP/htdocs/craft/vendor/craftcms/cms/src/web/Application.php(278): craft\web\Application->_processActionRequest(Object(craft\web\Request))
#1 /Applications/MAMP/htdocs/craft/vendor/yiisoft/yii2/base/Application.php(386): craft\web\Application->handleRequest(Object(craft\web\Request))
#2 /Applications/MAMP/htdocs/craft/web/index.php(21): yii\base\Application->run()
#3 {main}
4

2 回答 2

0

有两种方法可以为插件执行控制器方法。

1.通过表单动作:

<form method="post" accept-charset="UTF-8">
    <input type="hidden" name="action" value="demo-plugin/default/index">

在此,demo-plugin 是我的插件句柄,默认是我的控制器,index 是控制器的操作方法。

2. 通过在 Plugin.php 文件中定义控制面板路由:

UrlManager::class,
UrlManager::EVENT_REGISTER_CP_URL_RULES,
function(RegisterUrlRulesEvent $event) {
    $event->rules['contactform'] = 'demo-plugin/default/show';
}
于 2020-12-16T10:15:10.217 回答
0

您能否确认插件或模块已实际加载并运行?在插件的方法中尝试die-ing 。init()

接下来我要检查的是你的插件是否$controllerNamespace在它的init()方法中设置正确。查看插件商店中的另一个插件,看看他们是如何做到的。$controllerNamespace通常,如果 Craft 作为控制台应用程序运行,您将有不同的情况。

如果以上所有看起来都是正确的。尝试在插件方法中手动设置 URL init(),看看是否能解决问题。从 CraftCMS docs-设置一个 CP URL:

<?php
use craft\events\RegisterUrlRulesEvent;
use craft\web\UrlManager;
use yii\base\Event;

// init
Event::on(UrlManager::class, UrlManager::EVENT_REGISTER_CP_URL_RULES, function(RegisterUrlRulesEvent $event) {
    $event->rules['cocktails/new'] = ['template' => 'cocktails/_edit'];
    $event->rules['cocktails/<widgetId:\d+>'] = 'cocktails/edit-cocktail';
});

设置站点 URL:

<?php
use craft\events\RegisterUrlRulesEvent;
use craft\web\UrlManager;
use yii\base\Event;

// init
Event::on(UrlManager::class, UrlManager::EVENT_REGISTER_SITE_URL_RULES, function(RegisterUrlRulesEvent $event) {
    $event->rules['cocktails/new'] = ['template' => 'cocktails/_edit'];
    $event->rules['cocktails/<widgetId:\d+>'] = 'cocktails/edit-cocktail';
});
于 2019-08-27T11:44:58.107 回答