Yii2 错误:视图文件不存在

ste*_*ong 5 php yii2

我已经使用 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
Run Code Online (Sandbox Code Playgroud)

但是,http://localhost/web/index.php?r=paramA/paramB自从我开始使用 Yii2 以来,我已经能够浏览我的网站,而且我已经有一段时间没有编辑配置文件了,所以我不知道为什么会发生这种情况。

一些可能有用的文件:

/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();
Run Code Online (Sandbox Code Playgroud)

部分controllers/SiteController.php

public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
        ...
    ];
}

public function actionIndex()
{
    return $this->render('index');
}
Run Code Online (Sandbox Code Playgroud)

另外,在config/web.php我没有urlManager组件。

为什么会发生这种情况,我该怎么做?另外,由于我不知道在哪里搜索,我可能没有发布正确的代码来分析,但我当然可以在必要时添加代码。

此外,当我开始抛出一些UserExceptions(显示一些无效的帖子请求等)时,它就开始了。那立即显示了一个/views/site/error.php不存在的错误。我创建了那个 php 文件,但随后出现了上述问题。我删除了/views/site/error.php文件,但问题仍然存在。

我想这与 url 重写有关,但是在添加urlManager组件后没有任何反应/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);
}
Run Code Online (Sandbox Code Playgroud)

$viewFile返回找不到的路径 ( views\site\index.php)。

此外,在SiteController.php,$this->viewPathC:\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()
Run Code Online (Sandbox Code Playgroud)

编辑:

正如您现在可能已经看到的, my DOCUMENT_ROOTis C:\xampp\htdocs,并且我使用的是基本模板

编辑2:

配置/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;
Run Code Online (Sandbox Code Playgroud)

控制器\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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*ler 2

因此,默认情况下,当您调用render('index')控制器时site,Yii 将在文件夹中查找web/views/site名为index.php. 这包含您的site/index视图文件。当您创建网站时它应该就在那里,但如果您还没有得到它,那么它一定在某个阶段被删除了。创建文件并放入您的视图代码,然后就可以开始了。