Я использую Yii2 в течение нескольких недель и получаю зависание. Однако сегодня по какой-то причине я не знаю, что Yii направил меня на неправильную страницу, вызвав ошибки, потому что веб-страницы не были найдены:
URL: http://localhost/web/index.php?r=site/index Error: Invalid Parameter – yii\base\InvalidParamException The view file does not exist: C:\xampp\htdocs\views\site\index.php
Тем не менее, я смог перемещаться по своему сайту с помощью http://localhost/web/index.php?r=paramA/paramB
так как я начал использовать Yii2, и я не редактировал файлы конфигурации в течение некоторого времени, поэтому Я не знаю, почему это произошло.
Несколько файлов, которые могут быть полезны:
/web/index.php
( /web/index.php
редактируется):
<?php require_once __DIR__.'/../util/Tools.php'; // comment out the following two lines when deployed to production defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/../config/web.php'); (new yii\web\Application($config))->run();
часть controllers/SiteController.php
:
public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], ... ]; } public function actionIndex() { return $this->render('index'); }
Кроме того, в config/web.php
у меня нет компонента urlManager
.
Почему это происходит и что я могу сделать против этого? Кроме того, поскольку я не знаю, где искать, я, вероятно, не разместил правильный код для анализа, но, конечно, я могу добавить код, когда это необходимо.
Более того, это началось, когда я начал бросать некоторые UserExceptions
(чтобы показать некоторые недопустимые почтовые запросы и т. Д.). Это мгновенно показало ошибку, что /views/site/error.php
не существует. Я создал этот файл php, но затем возникла проблема, описанная выше. Я удалил файл /views/site/error.php
, но проблема не устранена.
Я предполагаю, что это связано с переписыванием URL, но ничего не произошло после добавления компонента /config/web.php
в /config/web.php
(который я удалил после попытки)
Кроме того, в \vendor\yiisoft\yii2\base\View.php
есть этот код:
public function render($view, $params = [], $context = null) { $viewFile = $this->findViewFile($view, $context); return $this->renderFile($viewFile, $params, $context); }
И $viewFile
возвращает путь, который не может быть найден ( views\site\index.php
).
Кроме того, в SiteController.php
, $this->viewPath
– это C:\xampp\htdocs\views\site
(чего он не должен …?)
Трассировка стека:
1. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\View.php at line 226 2. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\View.php at line 149 – yii\base\View::renderFile('C:\xampp\htdocs\...', [], app\controllers\SiteController) 3. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\Controller.php at line 371 – yii\base\View::render('index', [], app\controllers\SiteController) 4. in C:\xampp\htdocs\controllers\SiteController.php at line 58 – yii\base\Controller::render('index') 5. app\controllers\SiteController::actionIndex() 6. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\InlineAction.php at line 55 – call_user_func_array([app\controllers\SiteController, 'actionIndex'], []) 7. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\Controller.php at line 151 – yii\base\InlineAction::runWithParams(['r' => 'site/index']) 8. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\Module.php at line 455 – yii\base\Controller::runAction('index', ['r' => 'site/index']) 9. in C:\xampp\htdocs\vendor\yiisoft\yii2\web\Application.php at line 84 – yii\base\Module::runAction('site/index', ['r' => 'site/index']) 10. in C:\xampp\htdocs\vendor\yiisoft\yii2\base\Application.php at line 375 – yii\web\Application::handleRequest(yii\web\Request) 11. in C:\xampp\htdocs\web\index.php at line 16 – yii\base\Application::run()
Редактировать:
как вы, возможно, уже видели, мой DOCUMENT_ROOT
– C:\xampp\htdocs
, и я использую базовый шаблон
Edit2:
конфиг / web.php
<?php defined('DOCUMENT_ROOT') or define('DOCUMENT_ROOT', $_SERVER['DOCUMENT_ROOT']."/"); require_once DOCUMENT_ROOT . "/util/Tools.php"; $params = require(__DIR__ . '/params.php'); $config = [ "modules" => [ "gridview" => [ "class" => '\kartik\grid\Module' ] ], 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 'cookieValidationKey' => 'SOMERANDOMSTRING', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'db' => require(__DIR__ . '/db.php'), 'authManager' => [ 'class' => 'app\components\MyPhpManager', ], ], 'params' => $params, ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
Контроллеры \ SiteController.php
<?php namespace app\controllers; use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\filters\VerbFilter; use app\models\LoginForm; use app\models\ContactForm; use app\models\UploadForm; use app\models\User; use app\models\Document; use app\components\XmlParser; class SiteController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['logout'], 'rules' => [ [ 'actions' => ['logout'], 'allow' => true, 'roles' => ['@'], ], ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post'], 'upload'=>['post'], 'assign'=>['post'], ], ], ]; } public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], 'captcha' => [ 'class' => 'yii\captcha\CaptchaAction', 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, ], ]; } public function actionIndex() { return $this->render('index'); } public function actionLogin() { if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } return $this->render('login', [ 'model' => $model, ]); } public function actionLogout() { Yii::$app->user->logout(); return $this->goHome(); } public function actionContact() { $model = new ContactForm(); if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh(); } return $this->render('contact', [ 'model' => $model, ]); } public function actionAbout() { return $this->render('about'); } public function actionAssign() { //custom method } public function actionUpload() { //custom method } public function beforeAction($action) { Yii::$app->controller->enableCsrfValidation = !($action->id == 'upload'); return parent::beforeAction($action); } }
из<?php namespace app\controllers; use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\filters\VerbFilter; use app\models\LoginForm; use app\models\ContactForm; use app\models\UploadForm; use app\models\User; use app\models\Document; use app\components\XmlParser; class SiteController extends Controller { public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['logout'], 'rules' => [ [ 'actions' => ['logout'], 'allow' => true, 'roles' => ['@'], ], ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post'], 'upload'=>['post'], 'assign'=>['post'], ], ], ]; } public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], 'captcha' => [ 'class' => 'yii\captcha\CaptchaAction', 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, ], ]; } public function actionIndex() { return $this->render('index'); } public function actionLogin() { if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } return $this->render('login', [ 'model' => $model, ]); } public function actionLogout() { Yii::$app->user->logout(); return $this->goHome(); } public function actionContact() { $model = new ContactForm(); if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh(); } return $this->render('contact', [ 'model' => $model, ]); } public function actionAbout() { return $this->render('about'); } public function actionAssign() { //custom method } public function actionUpload() { //custom method } public function beforeAction($action) { Yii::$app->controller->enableCsrfValidation = !($action->id == 'upload'); return parent::beforeAction($action); } }
Таким образом, по умолчанию, когда вы вызываете render('index')
в контроллере site
, Yii будет искать в папке web/views/site
файл с именем index.php
. Это файл вашего site/index
. Он должен был быть там, когда вы создали сайт, но если у вас его нет, он должен быть удален на каком-то этапе. Создайте файл и поместите в свой код просмотра, и вам должно быть хорошо идти.