動(dòng)手創(chuàng)建自己第一個(gè)MVC框架項(xiàng)目【一】

背景:

在日常使用中我們泽艘,以在沒(méi)有框架的時(shí)候我們?nèi)粘J褂煤苈闊?/p>

1.類很多沒(méi)有歸類匯總

2.每次使用代碼總是要重寫辩越,沒(méi)有達(dá)到代碼復(fù)用的目的

3.在協(xié)作的時(shí)候,每個(gè)人由于代碼文件擺放習(xí)慣不一,會(huì)造成很混亂

4.如果代碼除了問(wèn)題,無(wú)法精確到到底那塊有問(wèn)題

于是:

MVC 設(shè)計(jì)思想橫空出世

M - Model 模型 數(shù)據(jù)庫(kù)的交互

V - view 視圖(有html文件或自定義的模板文件)

C - Controller 控制器 與用戶的交互(接收參數(shù)沛硅,控制跳轉(zhuǎn)等。绕辖。)

image

點(diǎn)擊鏈接跳轉(zhuǎn)查看腦圖詳情

疑問(wèn)

Q:在這里我們發(fā)現(xiàn)多了一個(gè)我們前面沒(méi)講到了index.php(入口文件)摇肌,為什么要有一個(gè)入口文件的概念呢?

A:我們來(lái)個(gè)例子讓我們更好知道為什么仪际。假設(shè)你開(kāi)了一個(gè)動(dòng)物園或者電影院之類的使用門票進(jìn)行收費(fèi)的項(xiàng)目围小,如果你不設(shè)置任何圍墻,欄桿之類的防護(hù)措施树碱,根本不會(huì)有人理會(huì)“需要買票才能進(jìn)入” 這個(gè)概念肯适,所以我們這個(gè)項(xiàng)目也是同理,先關(guān)閉所有可能進(jìn)入的地方成榜,僅僅留下一個(gè)買票進(jìn)入的入口框舔,這樣就可以方便收費(fèi),別人必須買票才能進(jìn)得去赎婚。

我們這個(gè)項(xiàng)目也是同理刘绣。


我們?cè)诨疽呀?jīng)具備了一個(gè)項(xiàng)目的基本雛形但是僅僅一個(gè)index.php是不夠的,因?yàn)楣庖粋€(gè)文件怎么實(shí)現(xiàn)挣输,我們不可能把整個(gè)項(xiàng)目所有代碼放在入口文件中這樣違背了MVC的基本概念额港。

那怎么實(shí)現(xiàn)呢?

我們這里引入另一個(gè)概念---路由

路由的本質(zhì)就是讓鏈接中帶的參數(shù)與對(duì)應(yīng)控制器中的方法產(chǎn)生關(guān)聯(lián)

在此教程中我僅僅講了某幾個(gè)參數(shù)就是控制器名與方法名歧焦,這樣也會(huì)有一定的安全隱患移斩,我后面也會(huì)繼續(xù)出教程講解關(guān)于參數(shù)與方法不一樣但是也能產(chǎn)生對(duì)應(yīng)關(guān)系的教程我們后續(xù)會(huì)講到

我們由于目錄關(guān)系,我們來(lái)約定三個(gè)參數(shù)

1.p -> platform 平臺(tái)(前绢馍、后臺(tái))

2.c -> Controller 控制器名(或控制器名的一部分比如 IndexController 我們只穿Index即可

3.a -> Action 就是某個(gè)控制中的某個(gè)方法

前面的鋪墊后我們現(xiàn)在正式開(kāi)始向瓷!

補(bǔ)充

關(guān)鍵!舰涌!關(guān)鍵2巍!關(guān)鍵4砂摇朱躺!我們這個(gè)項(xiàng)目有一個(gè)關(guān)鍵就是除index.php和一般的php文件之外,所有類文件都使用命名空間搁痛,空間地址就是路徑地址


我們現(xiàn)在在Core目錄下創(chuàng)建一個(gè)App.php

代碼如下:

<?php
namespace  Core;

class  App
{
        /**
         * 1.這個(gè)基礎(chǔ)功能的入口只要在index.php中靜態(tài)訪問(wèn)即可
         * 2.我們這個(gè)方法靜態(tài)的理由是不想new 占用過(guò)多的內(nèi)存空間
         * 3.我們項(xiàng)目的命名空間必須等于路徑
         */

  public static function run(){}

}

并在根目錄的index.php中引入App.php 并靜態(tài)訪問(wèn)run方法长搀。

require_once './Core/App.php';

\Core\App::run();

繼續(xù)在App.php中增加init靜態(tài)方法,為了設(shè)置請(qǐng)求頭等一般初始化配置別忘了還要在run中調(diào)用

namespace Core;
class App
{
    /**
     * 初始化項(xiàng)目
     * 設(shè)置請(qǐng)求頭
     */
    public static function init(){
        header('content-type:text/html;charset=utf-8');
    }
    /**
     * 1.這個(gè)基礎(chǔ)功能的入口只要在index.php中靜態(tài)訪問(wèn)即可
     * 2.我們這個(gè)方法靜態(tài)的理由是不想new 占用過(guò)多的內(nèi)存空間
     * 3.我們項(xiàng)目的命名空間必須等于路徑
     */
    public static function run(){
        self::init();
    }
}

增加了setDir靜態(tài)方法-讓以后文件加載更加精確


/**
 * 定義目錄方便以后文件加載更精確
 */
public static function setDir(){
    //這里使用了str_replace鸡典,由于windows目錄會(huì)有\(zhòng) 這種斜杠源请,但是如果去到linux或者unix系統(tǒng)會(huì)轉(zhuǎn)義所以還是先替換了
    define('ROOT_PATH',str_replace('\\','/',dirname(__DIR__).'/'));
    define('APP_PATH',ROOT_PATH.'App/');
    define('CONF_PATH',ROOT_PATH.'Conf/');
    define('PUBLIC_PATH',ROOT_PATH.'Public/');
    define('VEND_PATH',ROOT_PATH.'Vendor/');
}

在Conf目錄中創(chuàng)建app.php

return [
    'mysql'=>[
      'type'=>'mysql',
      'server'=>'localhost',
      'username'=>'root',
      'password'=>'root',
      'dbname'=>'ecframe',
      'charset'=>'utf8'
    ],
];

并在Core/App.php中增加getConf方法讀取配置文件靜態(tài)方法

/**
 * 讀取配置文件方便后面使用
 */
public static function getConf(){
    $GLOBALS['conf']=include CONF_PATH.'app.php';
    
}

總結(jié)代碼:

index.php

<?php
require_once './Core/App.php';
\\Core\\App::run();

Core/App.php  

<?php
/**
 *
 * App.php
 * User: kalvin
 * Date: 2018/1/29
 * Time: 下午4:17
 */
namespace Core;
class App
{

    /**
     * 初始化項(xiàng)目
     * 設(shè)置請(qǐng)求頭
     */
    public static function init(){
        header('content-type:text/html;charset=utf-8');
    }

    /**
     * 定義目錄方便以后文件加載更精確
     */
    public static function setDir(){
        //這里使用了str_replace,由于windows目錄會(huì)有\(zhòng) 這種斜杠,但是如果去到linux或者unix系統(tǒng)會(huì)轉(zhuǎn)義所以還是先替換了
        define('ROOT_PATH',str_replace('\\','/',dirname(__DIR__).'/'));
        define('APP_PATH',ROOT_PATH.'App/');
        define('CONF_PATH',ROOT_PATH.'Conf/');
        define('PUBLIC_PATH',ROOT_PATH.'Public/');
        define('VEND_PATH',ROOT_PATH.'Vendor/');
    }

    /**
     * 讀取配置文件方便后面使用
     */
    public static function getConf(){
        $GLOBALS['conf']=include CONF_PATH.'app.php';

    }
    /**
     * 1.這個(gè)基礎(chǔ)功能的入口只要在index.php中靜態(tài)訪問(wèn)即可
     * 2.我們這個(gè)方法靜態(tài)的理由是不想new 占用過(guò)多的內(nèi)存空間
     * 3.我們項(xiàng)目的命名空間必須等于路徑
     */
    public static function run(){
        self::init();
        self::setDir();
        self::getConf();
    }
}

Conf/app.php



<?php
/**
 *
 * app.php
 * User: kalvin
 * Date: 2018/1/29
 * Time: 下午4:35
 */
return [
    'mysql'=>[
      'type'=>'mysql',
      'server'=>'localhost',
      'username'=>'root',
      'password'=>'root',
      'dbname'=>'ecframe',
      'charset'=>'utf8'
    ],
];

如果覺(jué)得我的文章對(duì)你有幫助又或者喜歡,別忘了關(guān)注.喜歡加轉(zhuǎn)發(fā),當(dāng)然如果可以打賞我一下奶茶錢也是可以的哦(#.#)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谁尸,一起剝皮案震驚了整個(gè)濱河市舅踪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良蛮,老刑警劉巖抽碌,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異决瞳,居然都是意外死亡货徙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門瞒斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)破婆,“玉大人,你說(shuō)我怎么就攤上這事胸囱〉灰ǎ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵烹笔,是天一觀的道長(zhǎng)裳扯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谤职,這世上最難降的妖魔是什么饰豺? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮允蜈,結(jié)果婚禮上冤吨,老公的妹妹穿的比我還像新娘。我一直安慰自己饶套,他們只是感情好漩蟆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著妓蛮,像睡著了一般怠李。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛤克,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天捺癞,我揣著相機(jī)與錄音,去河邊找鬼构挤。 笑死髓介,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的儿倒。 我是一名探鬼主播版保,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呜笑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夫否!你這毒婦竟也來(lái)了彻犁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凰慈,失蹤者是張志新(化名)和其女友劉穎汞幢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體微谓,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡森篷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豺型。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仲智。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姻氨,靈堂內(nèi)的尸體忽然破棺而出钓辆,到底是詐尸還是另有隱情,我是刑警寧澤肴焊,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布前联,位于F島的核電站,受9級(jí)特大地震影響娶眷,放射性物質(zhì)發(fā)生泄漏似嗤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一届宠、第九天 我趴在偏房一處隱蔽的房頂上張望烁落。 院中可真熱鬧,春花似錦豌注、人聲如沸伤塌。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寸谜。三九已至,卻和暖如春属桦,著一層夾襖步出監(jiān)牢的瞬間熊痴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工聂宾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留果善,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓系谐,卻偏偏與公主長(zhǎng)得像巾陕,于是被迫代替她去往敵國(guó)和親讨跟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評(píng)論 25 707
  • 用兩張圖告訴你鄙煤,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料晾匠? 從這篇文章中你...
    hw1212閱讀 12,699評(píng)論 2 59
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 人生本就是孤獨(dú)的流浪梯刚。 不要回頭尋找過(guò)去凉馆。 也請(qǐng)微笑歡迎未來(lái)。
    風(fēng)凌阿姨閱讀 222評(píng)論 1 1
  • 把沒(méi)能實(shí)現(xiàn)的夢(mèng)想掛在衣柜里 偶爾會(huì)打開(kāi)來(lái)看看 看看那些為夢(mèng)想奮斗的歲月 看到的都是千瘡百孔 只是不會(huì)再因此而難過(guò)了...
    會(huì)疼這思念閱讀 159評(píng)論 0 2