原文出處:https://jellybool.com/post/programming-with-yii2-getting-started-with-install-and-hello-world
嗯,今天起打算寫(xiě)一個(gè)系列教程來(lái)過(guò)一遍Yii2,沒(méi)錯(cuò),我就是來(lái)安利大家使用Yii2
的。至于最?lèi)?ài)的Laravel
,后面是打算會(huì)有教程的,只是不知道是系列博文還是直接錄視頻而已,因?yàn)?code>Laravel貌似想講的東西實(shí)在是太多了。給Laravel
發(fā)完金水之后,還是回到Yii2
本身吧。
額,如果你還沒(méi)聽(tīng)說(shuō)過(guò)什么是Yii
,可以直接看下面的鏈接:
打算從頭開(kāi)始,所以,連安裝Yii2
也稍微寫(xiě)一點(diǎn)吧。安裝Yii2
最好的方式就是使用composer
:
composer global require "fxp/composer-asset-plugin:~1.0.3"
composer create-project --prefer-dist yiisoft/yii2-app-basic helloYii
等待一小段時(shí)間之后(如果等太久或直接報(bào)錯(cuò),請(qǐng)使用VPN),在這兩步你應(yīng)該會(huì)看到類(lèi)似下面的信息:
Updating dependencies (including require-dev)
- Installing fxp/composer-asset-plugin (v1.0.3)
Downloading: 100%
Writing lock file
Generating autoload files
> yii\composer\Installer::postCreateProject
chmod('runtime', 0777)...done.
chmod('web/assets', 0777)...done.
chmod('yii', 0755)...done.
這里的第一條命令跟官方文檔的有稍微的差別,官方文檔還是停留在fxp/composer-asset-plugin:~1.0.0
,在我寫(xiě)這篇文章的時(shí)候,最新版本為fxp/composer-asset-plugin:~1.0.3
。所以這里會(huì)有一些些不一樣。
注,我直接將
helloYii
項(xiàng)目放在了桌面,你可以根據(jù)自己的喜好調(diào)整目錄
安裝完Yii2
之后,進(jìn)入到項(xiàng)目的web/
目錄:
cd helloYii/web
開(kāi)啟PHP內(nèi)置服務(wù)器:
php -S localhost:8999
然后再瀏覽器輸入localhost:8999
,你就可以看到下面的頁(yè)面了:
這里需要說(shuō)明的是:我是在mac下進(jìn)行的開(kāi)發(fā),并且處于便捷的原因,我后續(xù)也會(huì)一直使用PHP內(nèi)置服務(wù)器,也就是說(shuō)本教程的localhost:8999
是我默認(rèn)的首頁(yè)地址。至于用MAMP for OS X的用戶,你可以直接配置MAMP
cd /Applications/MAMP/htdocs
ln -s ~/Desktop/helloYii/ /Applications/MAMP/htdocs/helloYii
然后你可以訪問(wèn)這樣的地址:http://localhost:8888/helloYii/web
,不出意外,你也可以看Yii
默認(rèn)的可愛(ài)首頁(yè)了。
對(duì)于用Windows的同學(xué),我建議你們直接用WAMP,不過(guò)具體配置我倒是沒(méi)有實(shí)際操作過(guò),所以不做任何評(píng)論。
關(guān)于Yii2
MVC的支持就基本不用多說(shuō)了,之前發(fā)過(guò)一篇文章粗略地說(shuō)過(guò)一遍。而在這里我想說(shuō)明的是:在Yii2中,我們的單入口文件是web/index.php
,所以剛剛在開(kāi)啟PHP內(nèi)置服務(wù)器的時(shí)候需要來(lái)到這個(gè)目錄,不過(guò)如果你直接指定也是可以的。這個(gè)文件負(fù)責(zé)將Yii2項(xiàng)目所需要的東西全部加載完成之后,最后通過(guò)run
方法來(lái)使得整個(gè)項(xiàng)目可以跑起來(lái):
<?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();
默認(rèn)的情況下,我們看到的Yii2首頁(yè)是/controllers/SiteController.php
下的Index
方法:
public function actionIndex()
{
return $this->render('index');
}
通常情況下,控制器一般都會(huì)有比較多的方法來(lái)鏈接模型和視圖之間的橋梁,但是方法雖多,很多時(shí)候都只是一些簡(jiǎn)單的代碼和邏輯,所以,不用擔(dān)心。
上面的Index
方法渲染了index
這個(gè)模版,而這個(gè)模板位于/views/site/index.php
,至于控制器和視圖之間的命名規(guī)則,參考這里:
views/ControllerID/ViewName.php
ControllerID
?: 表示控制器的ID
,也就是控制器去掉Controller
的前綴,比如SiteController
就對(duì)應(yīng)site
ViewName
?: 是對(duì)應(yīng)方法的名字,但是不包括action
字眼,比如actionIndex
對(duì)應(yīng)的是index.php
而在使用render
方法來(lái)渲染視圖的時(shí)候,Yii2
默認(rèn)地也會(huì)渲染載入/views/layouts/main.php
這個(gè)文件,而這個(gè)文件做的事就是載入一些html頭部的共用文件,比如js
,css
,導(dǎo)航欄和底部繁榮導(dǎo)航欄等。這里其實(shí)我們最值得關(guān)心的其實(shí)就是下面這段代碼的<?= $content ?>
:
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
]) ?>
<?= $content ?>
</div>
這個(gè)<?= $content ?>
可以說(shuō)就是我們之后定義視圖的內(nèi)容,我們后續(xù)創(chuàng)建的視圖文件會(huì)被讀成字符串的形式賦給$content
,然后進(jìn)行渲染顯示。
有了上面的安裝和基本知識(shí)之后,我們就可以自己動(dòng)手來(lái)創(chuàng)建一個(gè)頁(yè)面了。不過(guò)在創(chuàng)建頁(yè)面之前,我們先來(lái)做一點(diǎn)簡(jiǎn)單的配置:開(kāi)啟Yii2的enablePrettyUrl
模式,因?yàn)檫@樣對(duì)于后續(xù)的開(kāi)發(fā)會(huì)便捷很多,而且開(kāi)啟之后,我們的url也會(huì)變得很簡(jiǎn)潔又好,不想現(xiàn)在這樣:
http://localhost:8999/index.php?r=site%2Fabout
這是我點(diǎn)擊首頁(yè)導(dǎo)航欄的About
出現(xiàn)的url
,一看到這個(gè),我是拒絕的,所以來(lái)到/config/web.php
這個(gè)配置文件中,找到'components' => []
這個(gè)數(shù)組,加入下面的兩行代碼:
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true
],
加入之后,正確的代碼配置是長(zhǎng)成這個(gè)樣子的:
'components' => [
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true
],
'request' => [
這樣開(kāi)啟enablePrettyUrl
模式之后,我們就可以通過(guò)http://localhost:8999/site/about
來(lái)訪問(wèn)我們的About
頁(yè)面了,這里的規(guī)律是這樣的:
http://localhost:8999/ControllerID/ActionName
比如,我們?cè)?code>/controllers/SiteController.php創(chuàng)建一個(gè)Say
操作方法:
public function actionSay($target = 'World')
{
return $this->render('say', ['target' => $target]);
}
我們要訪問(wèn)這個(gè)方法的正確路徑就是http://localhost:8999/site/say
?。
在Yii中使用action
關(guān)鍵字前綴來(lái)區(qū)分用于url操作方法和其他方法,這里的actionSay
接收一個(gè)參數(shù)$target
,如果用戶在訪問(wèn)的時(shí)候傳入target參數(shù),target
就為用戶傳入的值,而如果用戶沒(méi)有傳入,我們將其默認(rèn)值設(shè)為World。有了控制器的方法,從$this->render('say', ['target' => $target])
這行代碼來(lái)看,我們需要需要?jiǎng)?chuàng)建一個(gè)say.php
模板文件,這個(gè)文件是在哪里的呢?
根據(jù)前面說(shuō)的視圖模板規(guī)則,它應(yīng)該位于:/views/site/say.php
。在里面簡(jiǎn)單寫(xiě)上下面這一小段代碼:
<?php
use yii\helpers\Html;
?>
<h1>Hello <?= Html::encode($target) ?></h1>
<p>Welcome to your Yii2 demonstration application.</p>
出于安全的因素考慮,我們?cè)?code>say.php這個(gè)模版文件中使用了yii\helpers\Html
類(lèi)來(lái)對(duì)用戶傳入的數(shù)據(jù)進(jìn)行過(guò)濾,所以我們才有了這樣的輸出:
<?= Html::encode($target) ?>
我們來(lái)訪問(wèn)http://localhost:8999/site/say
試試,不出意外這時(shí)你看到的是這樣的:
然后我們?cè)賮?lái)訪問(wèn) : `http://localhost:8999/site/say?target=少年,還是用Yii吧
雖然說(shuō)在這里演示用中文不太和諧,但是沒(méi)辦法,我得安利一下各位少年,上手Yii2吧。
第一篇先寫(xiě)到這里了吧,下一篇打算再說(shuō)說(shuō)Yii2
的MVC
,Fomrs
?和Layouts
這幾個(gè)知識(shí)點(diǎn)。
Happy Hacking
源碼會(huì)放在Github:https://github.com/JellyBool/helloYii
更多建議: