yii+php+當前目錄,Yii應用的目錄結構和入口腳本

以下是一個通過高級模版安裝后典型的Yii應用的目錄結構:

~~~

.

├── backend

├── common

├── console

├── environments

├── frontend

├── nbproject

├── tests

├── vendor

├── composer.json

├── composer.lock

├── init

├── init.bat

├── LICENSE.md

├── README.md

├── requirements.php

├── yii

└── yii.bat

~~~

對于高級應用而言,相當于有?backend?frontend?console?三個獨立的Yii應用。 由于?console?類的應用比較特殊,我們稍后再講。這里講典型的Web應用的目錄結構。

## 公共目錄[](http://www.digpage.com/app_struct.html#id1 "Permalink to this headline")

這里的公共目錄可不止?common?目錄,但這個目錄從字面上來看, 是所有公共目錄里最“公共”的。common?目錄下的東西, 對于本高級應用的任一獨立的應用而言,都是可見、可用的。一般情況下,common?具有以下結構:

~~~

.

├── config

├── mail

└── models

~~~

其中:

* config?就是通用的配置,這些配置將作用于前后臺和命令行。

* mail?就是應用的前后臺和命令行的與郵件相關的布局文件等。

* models?就是前后臺和命令行都可能用到的數據模型。 這也是?common?中最主要的部分。

除了?common?之外,還有一個很重要的公共目錄,?vendor?。 這個目錄從字面的意思看,就是各種第三方的程序。 這是Composer安裝的其他程序的存放目錄,包含Yii框架本身,也放在這個目錄下面。 如果你向?composer.json?目錄增加了新的需要安裝的程序,那么下次調用Composer的時候, 就會把新安裝的目錄也安裝在這個?vendor?下面。

好了,現在問題來了。對于?frontend?backend?console?等獨立的應用而言, 他們的內容放在各自的目錄下面,他們的運作必然用到Yii框架等?vendor?中的程序。 他們是如何關聯起來的?這個秘密,或者說整個Yii應用的目錄結構的秘密, 就包含在一個傳說中的稱為入口文件的地方。

但是在了解入口文件index.php之前,有必要先看看諸如?frontend?等獨立應用的目錄結構。 這比起整個Yii應用的目錄結構面言,更為重要。因為你往往是在?frontend?等目錄下寫代碼。 但是,不大會在path\to\digpage?目錄下寫代碼。

## 前臺的目錄結構[](http://www.digpage.com/app_struct.html#id2 "Permalink to this headline")

其實,前臺和后臺是一樣的,只是我們邏輯上的一個劃分。 典型的,?frontend?具有如下的一個目錄結構:

~~~

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');

require(__DIR__ . '/../../common/config/bootstrap.php');

require(__DIR__ . '/../config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(

require(__DIR__ . '/../../common/config/main.php'),

require(__DIR__ . '/../../common/config/main-local.php'),

require(__DIR__ . '/../config/main.php'),

require(__DIR__ . '/../config/main-local.php')

);

$application = new yii\web\Application($config);

$application->run();

~~~

### 設置調試模式和代碼環境[](http://www.digpage.com/app_struct.html#id3 "Permalink to this headline")

前兩行是兩個?define?語句::

~~~

defined('YII_DEBUG') or define('YII_DEBUG', true);

defined('YII_ENV') or define('YII_ENV', 'dev');

~~~

定義當前的運行模式和環境。如果定義了?YII_DEBUG?, 那么表示當前為調試狀態,應用在運行過程中,會有一些調試信息的輸出。 在拋出異常時,也會有一個詳細的調用棧的顯示。默認情況下,YII_DEBUG?為?false?。 但在開發過程中,最好按上面寫的那樣,定義為?true?這樣便于查找和分析錯誤。

如果定義了?YII_ENV?,那么就是指定了當前應用的運行環境。 上面的代碼顯示應用將運行于?dev?環境。默認情況下,?YII_ENV?為?prod?表示產品環境。

這些環境只是一個名稱,具體的意義和環境內容要看環境的定義。?dev?prod?是Yii安裝后默認的兩個環境,分別表示開發環境和最終的產品環境。 此外還有一個?test?環境,表示測試環境。

環境與模式的作用不同。環境在代碼中主要是影響配置文件。?YII_ENV?的?dev?prod?test?三種環境, 會分別使?YII_ENV_DEV?YII_ENV_PROD?YII_ENV_TEST?的值為?true?。 這樣,在應用的配置中,特別是在相同的一個配置文件中,可以對不同環境作出不同的配置。

比如,你希望在測試環境下,使用另一個數據庫。在開發環境下,啟用調試工作條,等等。那么,可以這么做:

~~~

$config = [...];

if (!YII_ENV_TEST) {

// 以下配置項僅在測試環境中起作用

$config['bootstrap'][] = 'debug';

$config['modules']['debug'] = 'yii\debug\Module';

$config['modules']['gii'] = 'yii\gii\Module';

}

~~~

其實,這個?YII_ENV?的定義就是一個與?init?腳本環境切換的相互補充。 如果各環境比較明晰,用init?來切換各種環境的配置是完全夠用的。 不必在腳本中再有如?YII_ENV_TEST?之類的判斷語句,這會使本來已經顯得很長的配置文件看上去更臃腫。

### 引入必要的文件[](http://www.digpage.com/app_struct.html#id4 "Permalink to this headline")

緊接著兩個?define?語句之后,就是4個?require?語句:

~~~

require(__DIR__ . '/../../vendor/autoload.php');

require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');

require(__DIR__ . '/../../common/config/bootstrap.php');

require(__DIR__ . '/../config/bootstrap.php');

~~~

這4個語句的前3個中都使用到了相對于當前目錄的叔伯目錄中的php文件, 第4個語句使用了相對于當前目錄的兄弟目錄。

我們知道,?__DIR__?表示當前文件?index.php?所在的目錄。?/../../?表示的是當前目錄的爺爺目錄。 若?index.php?的當前目錄是?/path/to/digpapge.com/frontend/web?, 那么爸爸目錄就是?frontend,爺爺目錄就是?digpage.com?了。

第一個require引入了?/path/to/digpage.com/vendor?下面的?autoload.php?。 這個是composer的類自動加載機制注冊文件。引入這個文件后,可以使用composer的類自動加載功能。

第二個引入了?vendor?下面的?yiisoft/yii2/Yii.php?,這是Yii的工具類文件。 引入了這個類文件后,才能使用Yii的提供的各種工具, 才有?Yii::createObject()?Yii::$app?之類的東東可以使用。

第三個引入了?/path/to/digpage.com/common?下面的?config/bootstrap.php?。 這個文件主要用于執行一些Yii應用引導的代碼,比如定義一系列的路徑別名:

~~~

Yii::setAlias('common', dirname(__DIR__));

Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend');

Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend');

Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console');

Yii::setAlias('vendor', dirname(dirname(__DIR__)) . '/vendor');

~~~

這是默認安裝后定義好的?common?frontend?backend?console?vendor?5個路徑別名, 如果你要新增一個用于表示插件的目錄?plugin?可以自己在這個文件里面加一行:

~~~

Yii::setAlias('plugin', dirname(dirname(__DIR__)) . '/plugins');

~~~

第四個require引入了?path/to/digpage.com/frontend?下面的?config/bootstrap.php?。 作用與上面類似,只是其中的代碼僅適用于當前應用(frontend)。 而第三個require中的,是適應于所有應用(common)。

再接下來,是一個函數?yii\helpers\ArrayHelper::merge()?。 這個函數的作用在于合并參數所指定的各個數組。其中,后面的數組會把前面數組中相同下標的元素覆蓋掉。 這個語句的作用,就是讀取、合并應用的各配置文件并保存在?$config?變量中。 這里我們看到一共是讀取了4個配置文件:

~~~

require('path/to/digpage.com/common/config/main.php'),

require('path/to/digpage.com/common/config/main-local.php'),

require('path/to/digpage.com/frontend/config/main.php'),

require('path/to/digpage.com/frontend/config/main-local.php')

~~~

依次是通用目錄common下的2個配置文件,和當前應用frontend下的2個配置文件。 在優先順序上,當前的配置覆蓋通用的配置。 同時,帶有?-local?的配置文件在后,所以,本地配置文件覆蓋團隊配置文件。

最后,以?$config?為參數,實例化了一個?Application?對象,并調用他的?run()?函數。 這時,Yii應用就跑起來了。

## 命令行應用入口腳本[](http://www.digpage.com/app_struct.html#id5 "Permalink to this headline")

命令行應用的入口腳本是?path/to/digpage.com/yii?文件。這個文件被?init?腳本設為可執行的。 他的內容如下:

~~~

#!/usr/bin/env php

defined('YII_DEBUG') or define('YII_DEBUG', true);

defined('YII_ENV') or define('YII_ENV', 'dev');

// fcgi doesn't have STDIN and STDOUT defined by default

defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));

defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));

require(__DIR__ . '/vendor/autoload.php');

require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');

require(__DIR__ . '/common/config/bootstrap.php');

require(__DIR__ . '/console/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(

require(__DIR__ . '/common/config/main.php'),

require(__DIR__ . '/common/config/main-local.php'),

require(__DIR__ . '/console/config/main.php'),

require(__DIR__ . '/console/config/main-local.php')

);

$application = new yii\console\Application($config);

$exitCode = $application->run();

exit($exitCode);

~~~

對比于Web應用的?index.php?入口腳本,?yii?并沒有太多的新東西,其中核心的東西根本就沒變。

我們先來看看這個這個?yii?是什么?

首先,它沒有擴展名,我們不好知道其具體類型。 但是從文件內容的第一行?#!/usr/bin/env?php?來看,這是一個bash腳本。 第一行在告訴bash,也在告訴我們,這是一個使用PHP運行的腳本。

但第二行的??又清楚的向我們表明,這貨其實也是個 PHP 文件,只是沒有加上PHP后綴而已 。

接下來,?define('STDIN')?和?define('STDOUT')?則為fcgi定義了標準輸入和標準輸出。

在各require語句中,由于?yii?的位置與?index.php?不同,是位于應用根目錄下,所以目錄結構上更簡單些。

最后,在Yii應用跑起來后,還要獲取其返回值,并以該返回值退出腳本,通知操作系統退出時的狀態。

對于Windows系統而言,命令行的入口腳本仍然是?yii?,但是命令行下無法直接運行。所以, 細心的Yii為我們準備了一個?yii.bat?。這個文件會以?php?yii?形式調用PHP來運行入口腳本 。

如果覺得《深入理解Yii2.0》對您有所幫助,也請[幫助《深入理解Yii2.0》](http://www.digpage.com/donate.html#donate)。 謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542510.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

8086 尋址方式_8086微處理器的不同尋址模式

8086 尋址方式Introduction: 介紹: Addressing mode tells us what is the type of the operand and the way they are accessed from the memory for execution of an instruction and how to fetch particular instruction from the memory. There are mainly 8 …

決策樹的value是什么意思_從零開始的機器學習實用指南(六):決策樹

類似SVM,決策樹也是非常多功能的機器學習算法,可以分類,回歸,甚至可以完成多輸出的任務,能夠擬合復雜的數據集(比如第二章的房價預測例子,雖然是過擬合了。)決策樹也是很多集成學習的…

Hive中生成隨機唯一標識ID的方法

2019獨角獸企業重金招聘Python工程師標準>>> HIVE中處理的數據往往比較多,在處理數據的時候希望給處理得到的數據一個ID標識,這時候可以用到UUID。 UUID的算法的核心思想是結合機器的網卡、當地時間、一個隨即數來生成UUID。從理論上講&#…

php從網頁獲得數據,php根據URL獲得網頁內容

php 中根據url來獲得網頁內容非常的方便,可以通過系統內置函數file_get_contents(),傳入url,即可返回網頁的內容,比如獲得百度首頁的內容代碼為:$html file_get_contents(http://www.baidu.com/);echo $html;就可以顯示出百度首頁的內容&…

2020知道python語言應用答案_2020知到Python語言應用答案章節期末答案

組合管理理論最早由哈維馬科維茲于1962年系統的提出,他開創了對投資進行整體管理的先 公司型基金和契約型基金的區別,下列不包括()。 A.資金的性質B.基金的營運依據C.基 我國(&#…

如何在Bootstrap中使用Jumbotron和頁面標頭類?

Introduction 介紹 In the previous article, we have learned how Responsive column, Nesting Columns and offset Columns work and how to use them? I hope now, you all are comfortable with the grid system; what is it, how to use it and how we can use it for c…

python中的數字類型格式與運算,python數字數據類型

python數字數據類型1. 數字在我們很小的時候,父母便開始教我們數數,從1數到10,聰明的孩子可以數的更多。python支持3中數值類型整型(int),通常稱之為整型或整數,這個概念與我們小學時學過的整數是相同的,py…

getprocaddress得到為0_基于ZU+系列MPSoC芯片的USB3.0/2.0接口硬件設計

本文主要介紹Zynq UltraScale MPSoC系列芯片的USB3.0/2.0接口硬件設計。ZU系列MPSoC要實現USB3.0/2.0的全部功能,需要同時使用MIO和GTR。因為GTR接口中的USB接口只支持USB3.0,對USB2.0的支持需要通過MIO接口外接USB PHY實現。ZU系列MPSoC包括兩個USB接口…

如何設置單詞第一個字母大寫_大寫一行中每個單詞的第一個和最后一個字母

如何設置單詞第一個字母大寫Problem statement: 問題陳述: Given an input line, capitalize first and last letter of each word in the given line. Its provided that the input line is in lowercase. 給定輸入行, 將給定行中每個單詞的第一個和最…

php如何編造簡歷,在簡歷里編造內容需要注意哪些問題?

在個人簡歷里編造內容可得有一定依據才行,總得為自己后期做個準備工作是不是?你編造的東西不只是給企業看一看而已,企業還會對這些內容作出進一步的判斷,并且可能就其對你進行提問,如果你答不出來而曝光自己是在欺騙企…

Java LinkedList公共對象pollLast()方法(帶示例)

LinkedList公共對象pollLast()方法 (LinkedList public Object pollLast() method) This method is available in package java.util.LinkedList.pollLast(). 軟件包java.util.LinkedList.pollLast()中提供了此方法。 This method is used to retrieves the last or ending ele…

python編寫學生成績排序_Python實現按學生年齡排序的實際問題詳解

前言 本文主要給大家了關于利用Python按學生年齡排序的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹: 問題:定義一個Class:包含姓名name、性別gender、年齡age,需要按…

前方危險-讓很多“高逼格”高管深刻反思的文章

在很多的時候,現實會讓我們每個人迷惑,周邊的人和事可以讓人極度的膨脹,你可以想吃了迷藥一樣,分不清是現實還是虛幻。很久以前,在公司的一次會議上,某主管告訴我們說,“他一個同事,…

oracle實例的概念組成,oracle體系結構的兩個基本概念:數據庫和實例

您可能感興趣的話題:oracle核心提示:要了解oracle體系結構必須先了解兩個基本的概念: 數據庫和實例.要了解oracle體系結構必須先了解兩個基本的概念: 數據庫和實例.一: 數據庫數據庫(database)是一個數據集合.無論數據庫是采用關系結構還是面向對象結構,…

c#二維數據最大最小值_C#| 打印類型,各種數據類型的最大值和最小值

c#二維數據最大最小值In the below example – we are printing types, min value, max value of various data types in C#, like integer data types, floating point data types, Boolean data type, Reference types, Nullable types. 在下面的示例中-我們正在打印C&#x…

自定義taglib引入失敗_小程序拼團總失敗?看看微信官方和開發者們怎么說

閱讀時間:6m最懂小程序生態商業的自媒體可怕... 剛過國慶,南方還在短袖短裙,北方竟然都下雪了!什么叫一天之內感受四季?曉程序觀察(yinghoo-tech)的小伙伴們算是深刻體驗了,穿著短袖上飛機,抵達…

微信公眾平臺開發5:翻譯功能

思路分析首先對用戶發送過來的消息進行判斷,判斷消息里是否含有“翻譯”關鍵字,如果有,則提取翻譯內容,然后調用網絡上開放的翻譯API 進行翻譯。我們用有道翻譯API:http://fanyi.youdao.com/openapi?pathdata-mode記下…

Linux之基礎I/O

目錄 一、C語言中的文件操作 二、系統文件操作I/O 三、文件描述符fd 1、文件描述符的引入 2、對fd的理解 3、文件描述符的分配規則 四、重定向 1、重定向的原理 2、重定向的系統調用dup2 五、Linux下一切皆文件 一、C語言中的文件操作 1、打開和關閉 在C語言的文…

moore和mealy_Mealy機和Moore機的比較研究 目錄

moore和mealyFinite automata may also have outputs corresponding to each input symbol. Such finite automata are known as finite automata with the output. 有限自動機還可以具有與每個輸入符號相對應的輸出。 這種有限自動機稱為輸出的有限自動機。 There are two fi…

oracle sys連接不上,oracle – 為什么我不能在SYS擁有的對象上創建觸發器?

在嘗試創建名為ghazal_current_bef_upd_row的觸發器時&#xff1a;create trigger ghazal_current_bef_upd_rowbefore update on ghazal_currentfor each rowwhen (new.Rating < old.Rating)begininsert into ghazal_current_audit(GhazalName,Old_Rating,New_Rating)values…