Yii DefaultController 带有破折号的操作

问题描述 投票:0回答:1

这是我当前模块的目录结构

enter image description here

在我的DefaultController.php我有这个

<?php

class DefaultController extends Controller
{
    //set default action if nessesary
    public $defaultAction = 'index'; //default is index

    /**
     * Declares class-based actions.
     */
    public function actions() {

        // page action renders "static" pages stored under '/views/default/pages'
        // They can be accessed via: index.php?r=default/page&view=FileName
        return array(
            'pages' => array('class' => 'CViewAction'),
        );
    }

    public function actionIndex()
    {
        $this->render('index');
    }

    /**
    * Catch all action - used as a workaround to support dashed action names like my-action => actionMyAction
    * @param string $action Action that was not found within this controller
    */
    public function missingAction($action){
            $action = explode('-', $action);
            $action = array_map('strtolower', $action);
            $action = array_map('lcfirst', $action);
            $action = implode('',$action);

            if(method_exists($this,'action'.$action) || array_key_exists('action'.$action, $this->actions())){
                    $this->setAction($action);
                    $this->run($action); 
            }else{
                    throw new CHttpException(404, Yii::t('main','Action "{action}" does not exist in "{controller}".', array(
                            '{action}' => 'action'.$action,
                            '{controller}' => get_class($this),
                    )));
            }
    }

    public function actionLoanCalculator()
    {
        $model=new CalculatorsForm();

        // uncomment the following code to enable ajax-based validation
        /*
        if(isset($_POST['ajax']) && $_POST['ajax']==='loan-calculator-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
        */


        if(isset($_POST['loan-calculator-form']))
        {
            $model->attributes=$_POST['loan-calculator-form'];

            if($model->validate())
            {
               // form inputs are valid, do something here
               print_r($_REQUEST);
               return;
            }
        }

        $this->render('loan-calculator',array('model'=>$model));

    }
}

这是我的网址管理器

'<view:(about|terms|faq|privacy)>' => 'site/page',
'<action:(contact|login|logout)>' => 'site/<action>',
'<action:(loan-calculator)>' => 'calculators/default/pages/view/<action>',
'<action:(registration|create)>' => 'user/<action>',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

我尝试在我的默认控制器中添加 missingAction() 函数以允许带有破折号的操作。但当我访问 domain.com/dev/loan-calculator

时,我仍然收到此错误

我得到的错误是

Undefined variable: model 

它会转到视图中的loan-calculator.php。但在我的默认控制器中没有通过

function actionLoanCalculator()
。知道如何解决这个问题吗?

php yii
1个回答
0
投票

通过 UrlManager 配置,您可以使用“页面”操作来呈现贷款计算器。这是针对静态页面的,没有预先加载模型。看起来您的视图期望控制器加载模型,因此出现错误。

我认为你在 urlManager conf 的第三行中重定向应该是

'<action:(loan-calculator)>' => 'calculators/default/loanCalculator',

那么你就不需要包罗万象了。或者使用

'' => '计算器/默认/贷款计算器',

让你的missingActions方法发挥作用。 但也许您应该在使用 urlManager 之前通过简单地输入您想要的路线来测试您的控制器。模块操作的路线如下所示:

moduleID/controllerID/actionID
,所以就你而言:

calculators/default/loan-calculator

处理带有破折号的操作的另一种方法可以是实现

beforeAction()
方法,并从那里的操作 ID 中删除破折号。

© www.soinside.com 2019 - 2024. All rights reserved.