PHP Yii gii自动生成的模块代码无法执行,报错:Internal Server Error include(Controller.php)

来源:互联网 发布:中国最大的程序员社区 编辑:程序博客网 时间:2024/05/21 17:35

使用PHP的Yii框架的gii自动代码生成工具,可以为我们生成控制器、数据库操作、表单、模型和模块代码,在使用模块代码生成器生成模块代码后,模块却无法执行,不知道大家是否也遇到过该问题。

首先,使用gii自动代码生成工具生成module代码,代码会自动生成在项目工程中:

使用“Module Generator”生成模块代码后,会自动将生成的模块代码嵌入项目工程中,如下:

代码生成后,运行该模块,报错:


意思是找不到Controller.php文件,那什么地方使用了该文件呢?在自动生成的模板文件中,controllers文件夹下的DefaultController.php文件继承了Controller类,导致该错误产生:

<?phpclass DefaultController extends Controller{public function actionIndex(){$this->render('index');}}
真奇怪,gii自动生成的代码,居然找不到Yii framework的系统文件。那为什么在创建Yii工程时,默认生成的×××controller.php文件不会报这个错误呢?因为该文件继承的是CController类,而不是Controller类。而且,在index.php中,还添加了yii.php和main.php文件的引用。比如,在Yii提供的实例代码Hangman中,自动生成的GameController.php,部分代码如下:

class GameController extends CController{/** * @var string sets the default action to be 'play' */public $defaultAction='play';
它继承了CController类,而不是Controller类。为什么继承了CController类不会报错,而继承了Controller类就会报错呢?还得从Yii的核心类自动加载机制说起,一般来说,创建好Yii工程后,会生成一个index.php文件,文件内容大概如下:

<?php$yii=dirname(__FILE__).'/../../framework/yii.php';$config=dirname(__FILE__).'/protected/config/main.php';require_once($yii);Yii::createWebApplication($config)->run();
通常,我们会把yii框架的framework文件夹放置在项目工程的protected文件夹下,见上面的工程目录图。这时我们要修改一下$yii的目录为:

$yii=dirname(__FILE__)."/protected/framework/yii.php";
为什么要加载这个yii.php文件呢,因为它是Yii框架的起始执行文件,文件内容如下:

<?php/** * Yii bootstrap file. * * @author Qiang Xue <qiang.xue@gmail.com> * @link http://www.yiiframework.com/ * @copyright 2008-2013 Yii Software LLC * @license http://www.yiiframework.com/license/ * @package system * @since 1.0 */require(dirname(__FILE__).'/YiiBase.php');/** * Yii is a helper class serving common framework functionalities. * * It encapsulates {@link YiiBase} which provides the actual implementation. * By writing your own Yii class, you can customize some functionalities of YiiBase. * * @author Qiang Xue <qiang.xue@gmail.com> * @package system * @since 1.0 */class Yii extends YiiBase{}
注意,yii.php中的:

require(dirname(__FILE__).'/YiiBase.php');
加载YiiBase.php文件,关键就在该文件中,查阅一下该文件代码,我们只看关键的几处,如下是定义Yii框架的目录位置:

/** * Defines the Yii framework installation path. */defined('YII_PATH') or define('YII_PATH',dirname(__FILE__));/** * Defines the Zii library installation path. */defined('YII_ZII_PATH') or define('YII_ZII_PATH',YII_PATH.DIRECTORY_SEPARATOR.'zii');
一旦我们在index.php添加了yii.php的引用,Yii框架本身就知道了它在文件系统中的具体位置。

既然Yii框架已经知道了自己的位置,为什么还会出现找不到框架文件的情况呢?这是因为Yii是一个高效框架,体现在它的懒加载(lazy load)模式,即,引用的文件只有在使用到时才会加载,未使用到不加载。但是如果什么都不加载,似乎框架要运行不起来吧。所以,为了提高Yii框架的运行效率,它使用了一种核心类自动加载的机制,即最常用、最核心的框架文件,在Yii框架运行时先加载上来。

那么,核心类有哪些呢?在YiiBase.php文件中有定义:

/** * @var array class map for core Yii classes. * NOTE, DO NOT MODIFY THIS ARRAY MANUALLY. IF YOU CHANGE OR ADD SOME CORE CLASSES, * PLEASE RUN 'build autoload' COMMAND TO UPDATE THIS ARRAY. */private static $_coreClasses=array('CApplication' => '/base/CApplication.php','CApplicationComponent' => '/base/CApplicationComponent.php','CBehavior' => '/base/CBehavior.php','CComponent' => '/base/CComponent.php','CErrorEvent' => '/base/CErrorEvent.php','CErrorHandler' => '/base/CErrorHandler.php','CException' => '/base/CException.php','CExceptionEvent' => '/base/CExceptionEvent.php','CHttpException' => '/base/CHttpException.php','CModel' => '/base/CModel.php','CModelBehavior' => '/base/CModelBehavior.php','CModelEvent' => '/base/CModelEvent.php','CModule' => '/base/CModule.php','CSecurityManager' => '/base/CSecurityManager.php','CStatePersister' => '/base/CStatePersister.php','CApcCache' => '/caching/CApcCache.php','CCache' => '/caching/CCache.php','CDbCache' => '/caching/CDbCache.php','CDummyCache' => '/caching/CDummyCache.php','CEAcceleratorCache' => '/caching/CEAcceleratorCache.php','CFileCache' => '/caching/CFileCache.php','CMemCache' => '/caching/CMemCache.php','CRedisCache' => '/caching/CRedisCache.php','CWinCache' => '/caching/CWinCache.php','CXCache' => '/caching/CXCache.php','CZendDataCache' => '/caching/CZendDataCache.php','CCacheDependency' => '/caching/dependencies/CCacheDependency.php','CChainedCacheDependency' => '/caching/dependencies/CChainedCacheDependency.php','CDbCacheDependency' => '/caching/dependencies/CDbCacheDependency.php','CDirectoryCacheDependency' => '/caching/dependencies/CDirectoryCacheDependency.php','CExpressionDependency' => '/caching/dependencies/CExpressionDependency.php','CFileCacheDependency' => '/caching/dependencies/CFileCacheDependency.php','CGlobalStateCacheDependency' => '/caching/dependencies/CGlobalStateCacheDependency.php','CAttributeCollection' => '/collections/CAttributeCollection.php','CConfiguration' => '/collections/CConfiguration.php','CList' => '/collections/CList.php','CListIterator' => '/collections/CListIterator.php','CMap' => '/collections/CMap.php','CMapIterator' => '/collections/CMapIterator.php','CQueue' => '/collections/CQueue.php','CQueueIterator' => '/collections/CQueueIterator.php','CStack' => '/collections/CStack.php','CStackIterator' => '/collections/CStackIterator.php','CTypedList' => '/collections/CTypedList.php','CTypedMap' => '/collections/CTypedMap.php','CConsoleApplication' => '/console/CConsoleApplication.php','CConsoleCommand' => '/console/CConsoleCommand.php','CConsoleCommandBehavior' => '/console/CConsoleCommandBehavior.php','CConsoleCommandEvent' => '/console/CConsoleCommandEvent.php','CConsoleCommandRunner' => '/console/CConsoleCommandRunner.php','CHelpCommand' => '/console/CHelpCommand.php','CDbCommand' => '/db/CDbCommand.php','CDbConnection' => '/db/CDbConnection.php','CDbDataReader' => '/db/CDbDataReader.php','CDbException' => '/db/CDbException.php','CDbMigration' => '/db/CDbMigration.php','CDbTransaction' => '/db/CDbTransaction.php','CActiveFinder' => '/db/ar/CActiveFinder.php','CActiveRecord' => '/db/ar/CActiveRecord.php','CActiveRecordBehavior' => '/db/ar/CActiveRecordBehavior.php','CDbColumnSchema' => '/db/schema/CDbColumnSchema.php','CDbCommandBuilder' => '/db/schema/CDbCommandBuilder.php','CDbCriteria' => '/db/schema/CDbCriteria.php','CDbExpression' => '/db/schema/CDbExpression.php','CDbSchema' => '/db/schema/CDbSchema.php','CDbTableSchema' => '/db/schema/CDbTableSchema.php','CCubridColumnSchema' => '/db/schema/cubrid/CCubridColumnSchema.php','CCubridSchema' => '/db/schema/cubrid/CCubridSchema.php','CCubridTableSchema' => '/db/schema/cubrid/CCubridTableSchema.php','CMssqlColumnSchema' => '/db/schema/mssql/CMssqlColumnSchema.php','CMssqlCommandBuilder' => '/db/schema/mssql/CMssqlCommandBuilder.php','CMssqlPdoAdapter' => '/db/schema/mssql/CMssqlPdoAdapter.php','CMssqlSchema' => '/db/schema/mssql/CMssqlSchema.php','CMssqlSqlsrvPdoAdapter' => '/db/schema/mssql/CMssqlSqlsrvPdoAdapter.php','CMssqlTableSchema' => '/db/schema/mssql/CMssqlTableSchema.php','CMysqlColumnSchema' => '/db/schema/mysql/CMysqlColumnSchema.php','CMysqlCommandBuilder' => '/db/schema/mysql/CMysqlCommandBuilder.php','CMysqlSchema' => '/db/schema/mysql/CMysqlSchema.php','CMysqlTableSchema' => '/db/schema/mysql/CMysqlTableSchema.php','COciColumnSchema' => '/db/schema/oci/COciColumnSchema.php','COciCommandBuilder' => '/db/schema/oci/COciCommandBuilder.php','COciSchema' => '/db/schema/oci/COciSchema.php','COciTableSchema' => '/db/schema/oci/COciTableSchema.php','CPgsqlColumnSchema' => '/db/schema/pgsql/CPgsqlColumnSchema.php','CPgsqlCommandBuilder' => '/db/schema/pgsql/CPgsqlCommandBuilder.php','CPgsqlSchema' => '/db/schema/pgsql/CPgsqlSchema.php','CPgsqlTableSchema' => '/db/schema/pgsql/CPgsqlTableSchema.php','CSqliteColumnSchema' => '/db/schema/sqlite/CSqliteColumnSchema.php','CSqliteCommandBuilder' => '/db/schema/sqlite/CSqliteCommandBuilder.php','CSqliteSchema' => '/db/schema/sqlite/CSqliteSchema.php','CChoiceFormat' => '/i18n/CChoiceFormat.php','CDateFormatter' => '/i18n/CDateFormatter.php','CDbMessageSource' => '/i18n/CDbMessageSource.php','CGettextMessageSource' => '/i18n/CGettextMessageSource.php','CLocale' => '/i18n/CLocale.php','CMessageSource' => '/i18n/CMessageSource.php','CNumberFormatter' => '/i18n/CNumberFormatter.php','CPhpMessageSource' => '/i18n/CPhpMessageSource.php','CGettextFile' => '/i18n/gettext/CGettextFile.php','CGettextMoFile' => '/i18n/gettext/CGettextMoFile.php','CGettextPoFile' => '/i18n/gettext/CGettextPoFile.php','CChainedLogFilter' => '/logging/CChainedLogFilter.php','CDbLogRoute' => '/logging/CDbLogRoute.php','CEmailLogRoute' => '/logging/CEmailLogRoute.php','CFileLogRoute' => '/logging/CFileLogRoute.php','CLogFilter' => '/logging/CLogFilter.php','CLogRoute' => '/logging/CLogRoute.php','CLogRouter' => '/logging/CLogRouter.php','CLogger' => '/logging/CLogger.php','CProfileLogRoute' => '/logging/CProfileLogRoute.php','CSysLogRoute' => '/logging/CSysLogRoute.php','CWebLogRoute' => '/logging/CWebLogRoute.php','CDateTimeParser' => '/utils/CDateTimeParser.php','CFileHelper' => '/utils/CFileHelper.php','CFormatter' => '/utils/CFormatter.php','CLocalizedFormatter' => '/utils/CLocalizedFormatter.php','CMarkdownParser' => '/utils/CMarkdownParser.php','CPasswordHelper' => '/utils/CPasswordHelper.php','CPropertyValue' => '/utils/CPropertyValue.php','CTimestamp' => '/utils/CTimestamp.php','CVarDumper' => '/utils/CVarDumper.php','CBooleanValidator' => '/validators/CBooleanValidator.php','CCaptchaValidator' => '/validators/CCaptchaValidator.php','CCompareValidator' => '/validators/CCompareValidator.php','CDateValidator' => '/validators/CDateValidator.php','CDefaultValueValidator' => '/validators/CDefaultValueValidator.php','CEmailValidator' => '/validators/CEmailValidator.php','CExistValidator' => '/validators/CExistValidator.php','CFileValidator' => '/validators/CFileValidator.php','CFilterValidator' => '/validators/CFilterValidator.php','CInlineValidator' => '/validators/CInlineValidator.php','CNumberValidator' => '/validators/CNumberValidator.php','CRangeValidator' => '/validators/CRangeValidator.php','CRegularExpressionValidator' => '/validators/CRegularExpressionValidator.php','CRequiredValidator' => '/validators/CRequiredValidator.php','CSafeValidator' => '/validators/CSafeValidator.php','CStringValidator' => '/validators/CStringValidator.php','CTypeValidator' => '/validators/CTypeValidator.php','CUniqueValidator' => '/validators/CUniqueValidator.php','CUnsafeValidator' => '/validators/CUnsafeValidator.php','CUrlValidator' => '/validators/CUrlValidator.php','CValidator' => '/validators/CValidator.php','CActiveDataProvider' => '/web/CActiveDataProvider.php','CArrayDataProvider' => '/web/CArrayDataProvider.php','CAssetManager' => '/web/CAssetManager.php','CBaseController' => '/web/CBaseController.php','CCacheHttpSession' => '/web/CCacheHttpSession.php','CClientScript' => '/web/CClientScript.php','CController' => '/web/CController.php','CDataProvider' => '/web/CDataProvider.php','CDataProviderIterator' => '/web/CDataProviderIterator.php','CDbHttpSession' => '/web/CDbHttpSession.php','CExtController' => '/web/CExtController.php','CFormModel' => '/web/CFormModel.php','CHttpCookie' => '/web/CHttpCookie.php','CHttpRequest' => '/web/CHttpRequest.php','CHttpSession' => '/web/CHttpSession.php','CHttpSessionIterator' => '/web/CHttpSessionIterator.php','COutputEvent' => '/web/COutputEvent.php','CPagination' => '/web/CPagination.php','CSort' => '/web/CSort.php','CSqlDataProvider' => '/web/CSqlDataProvider.php','CTheme' => '/web/CTheme.php','CThemeManager' => '/web/CThemeManager.php','CUploadedFile' => '/web/CUploadedFile.php','CUrlManager' => '/web/CUrlManager.php','CWebApplication' => '/web/CWebApplication.php','CWebModule' => '/web/CWebModule.php','CWidgetFactory' => '/web/CWidgetFactory.php','CAction' => '/web/actions/CAction.php','CInlineAction' => '/web/actions/CInlineAction.php','CViewAction' => '/web/actions/CViewAction.php','CAccessControlFilter' => '/web/auth/CAccessControlFilter.php','CAuthAssignment' => '/web/auth/CAuthAssignment.php','CAuthItem' => '/web/auth/CAuthItem.php','CAuthManager' => '/web/auth/CAuthManager.php','CBaseUserIdentity' => '/web/auth/CBaseUserIdentity.php','CDbAuthManager' => '/web/auth/CDbAuthManager.php','CPhpAuthManager' => '/web/auth/CPhpAuthManager.php','CUserIdentity' => '/web/auth/CUserIdentity.php','CWebUser' => '/web/auth/CWebUser.php','CFilter' => '/web/filters/CFilter.php','CFilterChain' => '/web/filters/CFilterChain.php','CHttpCacheFilter' => '/web/filters/CHttpCacheFilter.php','CInlineFilter' => '/web/filters/CInlineFilter.php','CForm' => '/web/form/CForm.php','CFormButtonElement' => '/web/form/CFormButtonElement.php','CFormElement' => '/web/form/CFormElement.php','CFormElementCollection' => '/web/form/CFormElementCollection.php','CFormInputElement' => '/web/form/CFormInputElement.php','CFormStringElement' => '/web/form/CFormStringElement.php','CGoogleApi' => '/web/helpers/CGoogleApi.php','CHtml' => '/web/helpers/CHtml.php','CJSON' => '/web/helpers/CJSON.php','CJavaScript' => '/web/helpers/CJavaScript.php','CJavaScriptExpression' => '/web/helpers/CJavaScriptExpression.php','CPradoViewRenderer' => '/web/renderers/CPradoViewRenderer.php','CViewRenderer' => '/web/renderers/CViewRenderer.php','CWebService' => '/web/services/CWebService.php','CWebServiceAction' => '/web/services/CWebServiceAction.php','CWsdlGenerator' => '/web/services/CWsdlGenerator.php','CActiveForm' => '/web/widgets/CActiveForm.php','CAutoComplete' => '/web/widgets/CAutoComplete.php','CClipWidget' => '/web/widgets/CClipWidget.php','CContentDecorator' => '/web/widgets/CContentDecorator.php','CFilterWidget' => '/web/widgets/CFilterWidget.php','CFlexWidget' => '/web/widgets/CFlexWidget.php','CHtmlPurifier' => '/web/widgets/CHtmlPurifier.php','CInputWidget' => '/web/widgets/CInputWidget.php','CMarkdown' => '/web/widgets/CMarkdown.php','CMaskedTextField' => '/web/widgets/CMaskedTextField.php','CMultiFileUpload' => '/web/widgets/CMultiFileUpload.php','COutputCache' => '/web/widgets/COutputCache.php','COutputProcessor' => '/web/widgets/COutputProcessor.php','CStarRating' => '/web/widgets/CStarRating.php','CTabView' => '/web/widgets/CTabView.php','CTextHighlighter' => '/web/widgets/CTextHighlighter.php','CTreeView' => '/web/widgets/CTreeView.php','CWidget' => '/web/widgets/CWidget.php','CCaptcha' => '/web/widgets/captcha/CCaptcha.php','CCaptchaAction' => '/web/widgets/captcha/CCaptchaAction.php','CBasePager' => '/web/widgets/pagers/CBasePager.php','CLinkPager' => '/web/widgets/pagers/CLinkPager.php','CListPager' => '/web/widgets/pagers/CListPager.php',);}
我们从自动加载的核心类中,可以看到:

'CController' => '/web/CController.php',
但是我们没有看到Controller.php的影子,所以,这就是为什么,我们在index.php中配置了正确的yii目录,工程就可以正常运行,但是生成的模块代码中就报错找不到Controller类。

那Controller类到底在什么地方呢?Yii框架中是有这个文件的,它的位置在framework/cli/views/webapp/protected/components/Controller.php,那么,我们在index.php中把该文件引入进来:

<?php$yii=dirname(__FILE__)."/protected/framework/yii.php";//'/../../framework/yii.php';$config=dirname(__FILE__).'/protected/config/main.php';echo $yii;require_once($yii);require_once (dirname(__FILE__)."/protected/framework/cli/views/webapp/protected/components/Controller.php");Yii::createWebApplication($config)->run();
再运行该工程,就可以正常打开了:



















0 0
原创粉丝点击