用過框架的都知道,框架必然有一個入口文件index.php,來初始化環境。
1. yii2框架中自帶site控制器,一進入網站,默認就會訪問site控制器中index 這個action中的內容。
剛開始的時候很困惑,為什么一進入就會默認執行該控制器下面的方法。原來是因為yii2有個默認設置:
public $defaultRoute = 'site';
為什么為執行這個設置呢?是因為入口文件初始化環境的時候,我們要通過
(new yii\web\Application($config))->run();使用$config作為參數去創建Application對象實例。其中Application這個類有一些屬性,其中就有
$defaultRoute,該屬性就決定了默認執行的controller以及方法。
如果想默認使用自己編寫的控制器,就可以改變該屬性,那怎么改呢?
我們先看一下入口文件中的代碼:
1 defined('YII_DEBUG') or define('YII_DEBUG', true); 2 defined('YII_ENV') or define('YII_ENV', 'dev'); 3
4 require(__DIR__ . '/vendor/autoload.php'); 5 require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php'); 6 require(__DIR__ . '/common/config/bootstrap.php'); 7 require(__DIR__ . '/frontend/config/bootstrap.php'); 8
9 $config = yii\helpers\ArrayHelper::merge( 10 require(__DIR__ . '/common/config/main.php'),
11 require(__DIR__ . '/common/config/main-local.php'),
12 require(__DIR__ . '/frontend/config/main.php'),
13 require(__DIR__ . '/frontend/config/main-local.php') 14 ); 15
16 (new yii\web\Application($config))->run();
首先會引入一些配置文件,然后定義了變量$config,然后傳參數給 yii\web\Application類的構造函數,然后實例化。此時我們就可以在上面的配置文件中修改 defaultRoute參數,
return [ 'id' => 'app-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'defaultRoute'=>'main',]
這樣就改成了默認執行main控制器下面的index action。當然了,其實也可以更改site控制器中的內容,一般可以修改site控制器index 方法對應的index模板,更改模板中顯示的內容也可以。
2.
在做網站的過程中,大部分的頁面結構都是相似的。如都有相同的頭部和底部。各個頁面這樣僅僅是中間的部分不同。
Yii中的布局文件就是用來實現這樣的功能。如:
布局文件:@app/views/layouts/main.php
默認我們使用的就是該布局文件,從而讓網站的頭部底部統一起來,為什么為默認為該布局文件呢?可不可以不適用這個布局文件?
答案是可以使用你想使用的任何布局文件,為什么為默認為main.php,原因與上述第一點類似,因為Application類中有個屬性
public $layout = 'main';
所以其實我們可以修改該屬性值,可以在layouts下面新建一個布局文件比如new.php,我們可以在controller里面修改$layout的值為new,或者修改main.php中的內容
1 public function actionIndex() 2 { 3 $this->layout = 'new'; // 設置通用的模版為views/layouts/new.php
4 return $this->render('login'); //render()會將views/site/new.php拼接到通用模版中
5 }
也可以不適用模板文件,需要設置layout =false,可以在配置文件中添加,比如config/main.php中添加,亦可以在controller中作為屬性修改,如
1 class AccountController extends Controller 2 { 3 public $layout = false; 4 }
然后可以自己在各個view模板中設置自己想要的效果,可以自己定義一些樣式。