Yii:为什么我默认的控制器索引不起作用


Yii: why my default index of controller is not working?

我是一个Yiibie,陷入了一个问题。我已经安装了yii用户和权限。每当我试图运行localhost/webapp/table时,它都会给我一个错误,即"Error 404 The system is unable to find the requested action "list",但当我尝试运行localhost/webapp/table/index时,它会向我显示运行良好的索引操作视图。这是我的config/main.php

<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
     'theme' => 'bootstrap',
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'emergency response system',
    // preloading 'log' component
    'preload'=>array('log'),
'aliases' => array(
        'bootstrap' => 'ext.bootstrap'),
    // autoloading model and component classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
         'bootstrap.behaviors.*',
                'bootstrap.helpers.*',
                'bootstrap.widgets.*',
                'application.modules.user.models.*',
                'application.modules.user.components.*',
                'application.modules.rights.*',
                'application.modules.rights.components.*',
    ),
    'modules'=>array(
        // uncomment the following to enable the Gii tool
        'gii'=>array(
            'class'=>'system.gii.GiiModule',
            'password'=>'ers',
                     'generatorPaths' => array(
                'bootstrap.gii', ),
            // If removed, Gii defaults to localhost only. Edit carefully to taste.
            'ipFilters'=>array('127.0.0.1','::1'),
        ),
            'user' => array(
            'tableUsers' => 'user',
            'tableProfiles' => 'profiles',
            'tableProfileFields' => 'profiles_fields',
                # encrypting method (php hash function)
                'hash' => 'md5',
                # send activation email
                'sendActivationMail' => true,
                # allow access for non-activated users
                'loginNotActiv' => false,
                # activate user on registration (only sendActivationMail = false)
                'activeAfterRegister' => false,
                # automatically login from registration
                'autoLogin' => true,
                # registration path
               'registrationUrl' => array('/user/registration'),
                # recovery password path
                'recoveryUrl' => array('/user/recovery'),
                # login form path
                'loginUrl' => array('/user/login'),
                # page after login
                'returnUrl' => array('/user/profile'),
               # page after logout
               'returnLogoutUrl' => array('/user/login'),

    ),
             'rights'=>array(
             'install'=>true,
                 'superuserName'=>'Admin', // Name of the role with super user privileges. 
               'authenticatedName'=>'Authenticated',  // Name of the authenticated user role. 
               'userIdColumn'=>'id', // Name of the user id column in the database. 
               'userNameColumn'=>'username',  // Name of the user name column in the database. 
               'enableBizRule'=>true,  // Whether to enable authorization item business rules. 
               'enableBizRuleData'=>true,   // Whether to enable data for business rules. 
               'displayDescription'=>true,  // Whether to use item description instead of name. 
               'flashSuccessKey'=>'RightsSuccess', // Key to use for setting success flash messages. 
               'flashErrorKey'=>'RightsError', // Key to use for setting error flash messages. 
               'baseUrl'=>'/rights', // Base URL for Rights. Change if module is nested. 
               'layout'=>'rights.views.layouts.main',  // Layout to use for displaying Rights. 
               'appLayout'=>'application.views.layouts.main', // Application layout. 
               'cssFile'=>'rights.css', // Style sheet file to use for Rights. 
               'install'=>false,  // Whether to enable installer. 
               'debug'=>false, 
        ),
            ),
    // application components
    'components'=>array(
        'user'=>array(
                    'class'=>'RWebUser',
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
                    'loginUrl'=>array('/user/login'),
        ),
            'authManager'=>array(
                'class'=>'RDbAuthManager',
                'connectionID'=>'db',
                'defaultRoles'=>array('Authenticated', 'Guest'),
                'itemTable'=>'authitem',
                'itemChildTable'=>'authitemchild',
                'assignmentTable'=>'authassignment',
                'rightsTable'=>'rights',
        ),

        'bootstrap' => array(
            'class' => 'bootstrap.components.BsApi',),
        // uncomment the following to enable URLs in path-format
        'urlManager'=>array(
            'urlFormat'=>'path',
                     'showScriptName'=>false,
            'rules'=>array(
                 '<controller:'w+>'=>'<controller>/list',
                '<controller:'w+>/<action:'w+>'=>'<controller>/<action>',
                '<controller:'w+>/<id:'d+>/<title>'=>'<controller>/view',
                '<controller:'w+>/<id:'d+>'=>'<controller>/view',
            ),
        ),

        // database settings are configured in database.php
//      'db'=>require(dirname(__FILE__).'/database.php'),
        'db'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=response_system',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ),
        'errorHandler'=>array(
            // use 'site/error' action to display errors
            'errorAction'=>'site/error',
        ),
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning',
                ),
                // uncomment the following to show log messages on web pages
                array(
                    'class'=>'CWebLogRoute',
                ),
            ),
        ),
    ),
    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'=>array(
        // this is used in contact page
        'adminEmail'=>'webmaster@example.com',
    ),
);

这是我的模型文件

<?php
/**
 * This is the model class for table "story".
 *
 * The followings are the available columns in table 'story':
 * @property integer $id
 * @property string $title
 * @property string $story
 *
 * The followings are the available model relations:
 * @property UserWriteStory[] $userWriteStories
 */
class Story extends CActiveRecord
{
    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return Story the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'story';
    }
    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('title, story', 'required'),
            array('title', 'length', 'max'=>100),
            array('story', 'length', 'max'=>1000),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('id, title, story', 'safe', 'on'=>'search'),
        );
    }
    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'userWriteStories' => array(self::HAS_MANY, 'UserWriteStory', 'story_story_id'),
        );
    }
    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'id' => 'ID',
            'title' => 'Title',
            'story' => 'Story',
        );
    }
    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.
        $criteria=new CDbCriteria;
        $criteria->compare('id',$this->id);
        $criteria->compare('title',$this->title,true);
        $criteria->compare('story',$this->story,true);
        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }
}

这是我的相关管理员。

<?php
class StoryController extends RController
{
    /**
    * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
    * using two-column layout. See 'protected/views/layouts/column2.php'.
    */
    public $layout='//layouts/admin';
    /**
    * @return array action filters
    */
    public function filters()
    {
        return array(
//          'accessControl', // perform access control for CRUD operations
//          'postOnly + delete', // we only allow deletion via POST request
                    'rights',
        );
    }
    /**
    * Specifies the access control rules.
    * This method is used by the 'accessControl' filter.
    * @return array access control rules
    */
    public function accessRules()
    {
        return array(
            array('allow',  // allow all users to perform 'index' and 'view' actions
                'actions'=>array('index','view'),
                'users'=>array('*'),
            ),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions'=>array('create','update'),
                'users'=>array('@'),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions'=>array('admin','delete'),
                'users'=>array('admin'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }
    /**
    * Displays a particular model.
    * @param integer $id the ID of the model to be displayed
    */
    public function actionView($id)
    {
        $this->render('view',array(
            'model'=>$this->loadModel($id),
        ));
    }
    /**
    * Creates a new model.
    * If creation is successful, the browser will be redirected to the 'view' page.
    */
    public function actionCreate()
    {
        $model=new Story;
        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);
        if(isset($_POST['Story']))
        {
            $model->attributes=$_POST['Story'];
            if($model->save())
                $this->redirect(array('view','id'=>$model->id));
        }
        $this->render('create',array(
        'model'=>$model,
        ));
    }
    /**
    * Updates a particular model.
    * If update is successful, the browser will be redirected to the 'view' page.
    * @param integer $id the ID of the model to be updated
    */
    public function actionUpdate($id)
    {
        $model=$this->loadModel($id);
        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);
        if(isset($_POST['Story']))
        {
            $model->attributes=$_POST['Story'];
            if($model->save())
                $this->redirect(array('view','id'=>$model->id));
        }
        $this->render('update',array(
            'model'=>$model,
        ));
    }
    /**
    * Deletes a particular model.
    * If deletion is successful, the browser will be redirected to the 'admin' page.
    * @param integer $id the ID of the model to be deleted
    */
    public function actionDelete($id)
    {
        if(Yii::app()->request->isPostRequest)
        {
            // we only allow deletion via POST request
            $this->loadModel($id)->delete();
            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if(!isset($_GET['ajax']))
                $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
        }
        else
            throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
    }
    /**
    * Lists all models.
    */
    public function actionIndex()
    {
        $dataProvider=new CActiveDataProvider('Story');
        $this->render('index',array(
            'dataProvider'=>$dataProvider,
        ));
    }
    /**
    * Manages all models.
    */
    public function actionAdmin()
    {
        $model=new Story('search');
        $model->unsetAttributes();  // clear any default values
        if(isset($_GET['Story']))
            $model->attributes=$_GET['Story'];
        $this->render('admin',array(
            'model'=>$model,
        ));
    }
    /**
    * Returns the data model based on the primary key given in the GET variable.
    * If the data model is not found, an HTTP exception will be raised.
    * @param integer $id the ID of the model to be loaded
    * @return Story the loaded model
    * @throws CHttpException
    */
    public function loadModel($id)
    {
        $model=Story::model()->findByPk($id);
        if($model===null)
            throw new CHttpException(404,'The requested page does not exist.');
        return $model;
    }
    /**
    * Performs the AJAX validation.
    * @param Story $model the model to be validated
    */
    protected function performAjaxValidation($model)
    {
        if(isset($_POST['ajax']) && $_POST['ajax']==='story-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }
}

在UrlManager->规则中,您可以删除这行

'<controller:'w+>'=>'<controller>/list',

并设置控制器的defaultAction属性:

class StoryController extends RController
{
      public $defaultAction = 'list';

ruoting /rewrite规则中的config/main.php中,您已分配了类似默认action=list的操作,但控制器中不存在actionList。然后,当在url Yii中设置非操作时,调用list.php而不是index.php(错误404)

你需要改变这个:

'<controller:'w+>'=>'<controller>/list',

以这种方式更改

'<controller:'w+>'=>'<controller>/index',

或者像@Usman Daby Khan建议的那样,你可以删除它,这样Yii2就可以恢复正常工作了。

在配置文件的main.php中,注释掉这一行:

<controller:'w+>'=>'<controller>/list