成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從頭開始擼一個 PHP 框架

nanfeiyan / 2828人閱讀

摘要:本文僅僅是用于自我學(xué)習(xí)記錄,參考了的原創(chuàng)文章隨著標(biāo)準和包管理工具的面世,普通開發(fā)者擼一個框架已經(jīng)不再是什么難事了。

本文僅僅是用于自我學(xué)習(xí)記錄,參考了JohnLui的原創(chuàng)文章: https://segmentfault.com/a/11...
隨著PHP標(biāo)準和Composer包管理工具的面世,普通開發(fā)者擼一個框架已經(jīng)不再是什么難事了。

無論是路由管理、ORM管理、還是視圖渲染都有許許多多優(yōu)秀的包可以使用。我們就像堆積木一樣把這些包用composer一個個堆積起來。

接下來我們便是簡單地實現(xiàn)一個MVC框架,來加深我們對框架的理解。

composer

創(chuàng)建一個空的 composer.json 文件。

{
  
}

或者在空目錄下執(zhí)行:

composer init

則可以生成一個類型如下的文件:

{
    "name": "charlie/my_first_framework",
    "description": "My First Framework",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Charlie",
            "email": "[email protected]"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}
安裝第一個包

我們接下來安裝一個管理路由的包: noahbuscher/macaw。 功能比這個更加強大的路由包有很多,但是為了簡單起見,我們選擇安裝這個包。

composer require noahbuscher/macaw

當(dāng)前目錄結(jié)構(gòu)為:

?  demo tree
.
├── composer.json
├── composer.lock
└── vendor
    ├── autoload.php
    ├── composer
    │?? ├── ClassLoader.php
    │?? ├── LICENSE
    │?? ├── autoload_classmap.php
    │?? ├── autoload_namespaces.php
    │?? ├── autoload_psr4.php
    │?? ├── autoload_real.php
    │?? ├── autoload_static.php
    │?? └── installed.json
    └── noahbuscher
        └── macaw
            ├── LICENSE.md
            ├── Macaw.php
            ├── README.md
            ├── composer.json
            ├── composer.lock
            └── config
                ├── Web.config
                └── nginx.conf
public/index.php

我們在根目錄下新建一個public文件夾,并在該文件夾下新建 index.phpindex.php 文件類似于一個大廈的入口,我們所有的請求都運行 index.php

下面是 index.php 文件的代碼:

// 自動加載vendor目錄下的包
require "../vendor/autoload.php";
routes.php

此時我們觀察 index.php,除了把vendor下面的包都 require 進來了外,其他啥都沒干。那么如何響應(yīng)各種各樣的請求呢?

我們需要定義路由。路由就有點像快遞分揀站,把寫著不同地址的請求分撥給不同的控制器處理。
那么我們在根目錄下創(chuàng)建一個 routes 文件夾,并在該文件夾下創(chuàng)建 web.php 文件。文件內(nèi)容:


然后我們啟動php內(nèi)置的開發(fā)服務(wù)器:

> cd public

> php -S localhost:8001

我們訪問 http://localhost:8001/hello 就能看到我們預(yù)期的 "hello world".

MVC

上面我們僅僅實現(xiàn)了訪問一個地址,返回一個字符串。下面我們來真正搭建MVC框架。MVC其實就是Model、View、Controller三個的簡稱。
不管怎么樣,我們先新建三個文件夾再說,即 views、modelscontrollers。

新建 controllersHomeController.php 文件,代碼如下:

This is Home Page";
    }

}

另外我們在 routes/web.php 中添加一條路由:

Macaw::get("", "AppControllersHomeController@home");

整體代碼為:


此時已經(jīng)綁定了一個路由至我們一個控制器的方法,但是我們?nèi)ピL問 http://localhost:8001 會出現(xiàn) Uncaught Error: Class "AppControllersHomeController" not found in 的錯誤。

為什么呢?

因為此時我們還并沒有將控制器加載進來,程序并不知道控制器在哪兒。我們可以用 composer 的 classmap 方法加載進來。修改 composer.json 中添加:

 "autoload": {
    "classmap": [
      "app/controllers",
      "app/models"
    ]
  }

我們順便把models也加載進來。

composer dump-autoload

刷新自動加載

Model連接數(shù)據(jù)庫

我們創(chuàng)建一個Article Model,這個 Model 對應(yīng)數(shù)據(jù)庫一張表。此時我們先用mysql 命令行工具新建一個 demo_database 的數(shù)據(jù)庫,里面有一張表 articles , 表的結(jié)構(gòu)大致如下:

mysql> desc articles;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| title   | varchar(256) | YES  |     | NULL    |                |
| content | varchar(256) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

我們再在表里面填入數(shù)據(jù):

mysql> select * from articles;
+----+--------+--------------+
| id | title  | content      |
+----+--------+--------------+
|  1 | hhhhh  | heheheheheh  |
|  2 | hhhhh2 | heheheheh2eh |
+----+--------+--------------+
2 rows in set (0.00 sec)

當(dāng)然了,我們現(xiàn)在是直接通過 MySQL 的 insert 命令直接填入數(shù)據(jù),后續(xù)我們可以通過我們的框架新建 model 。

接下來我們要做的就是怎么在 Model 中連接數(shù)據(jù)庫取到數(shù)據(jù)庫里面的數(shù)據(jù)啦! 本文使用的 php 7.1,我們使用 mysqli 來連接數(shù)據(jù)庫查詢數(shù)據(jù):

connect_errno) {
            echo "Failed to connect to Mysql: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error();
        }
        $mysqli->set_charset("utf-8");
        $result = $mysqli->query("SELECT * FROM articles limit 0,1");

        $article = $result->fetch_array();
        if ($article) {
            echo "

" . $article["title"] . "

"; echo "

" . $article["content"] . "

"; } $mysqli->close(); } }

這么一來我們就可以在控制器里面使用
`

Article::first();

`
來查詢 articles 表里面的第一條article數(shù)據(jù),然后我們再通過 echo 返回給瀏覽器。


View層

看上面的代碼,我們在 Article Model 中連續(xù)寫了兩條 echo 語句來格式化輸出。如果后續(xù)我們的頁面十分復(fù)雜的時候,我們把所有的格式化輸出的代碼都寫在 Model 里面感覺是個災(zāi)難。我們應(yīng)該把這些格式化輸出的代碼分離出來,這便是我們說的 MVC 層的 View 層。

我們在 views 目錄下新建 home.php:

" . $article["title"] . "

"; echo "

" . $article["content"] . "

";

我們再改寫一下 Article.php,刪除echo 那兩行,直接

return article;

然后我們在 HomeController 中指定要使用的 view:


我們這里的 view 層僅僅是用 PHP 拼接了 html,后續(xù)我們需要實現(xiàn)更加復(fù)雜的視圖的時候,我們可以引入模版引擎。

ORM

我們一路從一個空文件夾開始,打造一個自己的一個框架,感覺并沒有寫多少代碼,唯一寫了好幾行代碼感覺比較麻煩的就是連接數(shù)據(jù)庫來查詢數(shù)據(jù)了。我們我們有很多 Model,要實現(xiàn) 增刪改查的話,我們豈不是要重復(fù) 連接,查詢、插入、刪除、更新,然后關(guān)閉連接?我們應(yīng)該把這些功能分裝一下。

怎么封裝?有其他人寫好的包了,直接拿來用吧~ 當(dāng)然如果你想自己造輪子的話,也可以自己實現(xiàn)一下。

我們這里使用 illuminate/database:

composer require illuminate/database

然后我們在 public/index.php 中引入:

use IlluminateDatabaseCapsuleManager as Capsule;

require "../vendor/autoload.php";

// Eloquent ORM
$capsule = new Capsule();
$capsule->addConnection(require "../config/database.php");
$capsule->bootEloquent();

//路由配置
require "../routes/web.php";

我們在連接數(shù)據(jù)的時候,使用了 config/database.php 的數(shù)據(jù)庫配置文件。

 "mysql",
    "host" => "localhost",
    "database" => "demo_database",
    "username" => "root",
    "password" => "secret",
    "charset" => "utf8",
    "collation" => "utf8_general_ci",
    "prefix" => ""
];

接下來我們就可以刪掉 models/Article.php 文件中我們寫的大部分代碼,而僅僅需要繼承IlluminateDatabaseEloquentModel 來使用 Eloquent ORM 的功能:


更多Eloquent ORM的功能,您也可以自己查閱文檔。

總結(jié)

好了,我們一個 MVC 框架基本上就搭建完了,我們回頭看一下整個框架目錄結(jié)構(gòu),是不是跟 Laravel 有點像呢?

?  myFirstFramework git:(master) ? tree
.
├── README.md
├── app
│?? ├── controllers
│?? │?? ├── BaseController.php
│?? │?? └── HomeController.php
│?? ├── models
│?? │?? └── Article.php
│?? └── views
│??     └── home.php
├── composer.json
├── composer.lock
├── config
│?? └── database.php
├── public
│?? └── index.php
├── routes
│?? └── web.php
└── vendor ...

本文用到的示例代碼已經(jīng)上傳到github:https://github.com/charliex2/...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28470.html

相關(guān)文章

  • grpc - 使用 golang 帶你從頭一套 RPC 服務(wù)(二)

    摘要:緊接上一篇,下面用作為客戶端調(diào)用的服務(wù)端。安裝插件插件可以幫助我們自動生成客戶端封裝了的服務(wù)接口,方便我們直接引入調(diào)用,否則只生成服務(wù)請求響應(yīng)的實體類,用起來不太方便。打包解包客戶端發(fā)送至服務(wù)端服務(wù)端接收數(shù)據(jù)后使用對應(yīng)的實體解包服務(wù)端 緊接上一篇,下面用PHP作為客戶端調(diào)用Go的服務(wù)端。 安裝 grpc_php_plugin 插件 grpc_php_plugin插件可以幫助我們自動生成...

    raise_yang 評論0 收藏0
  • 來!我們一起來從頭開始構(gòu)建自己的JavaScript模塊化工具

    摘要:能達到一個積木塊模塊的要求。接下來我們將改進它。結(jié)尾到此,我們自己構(gòu)建了一個很實用的模塊化工具,項目的源碼在這里,喜歡的話,給個。 前言 希望編寫程序能像玩積木一樣,首先規(guī)劃要產(chǎn)出怎樣的作品,然后在積木堆中挑選合適的積木塊,最后一組合就完工了。 于是JavaScript需要類似這樣模塊化,每個模塊都隱藏內(nèi)部細節(jié)并且對外暴露接口,再處理好模塊之間的依賴關(guān)系,就可以達到玩積木的效果了。 雖...

    AaronYuan 評論0 收藏0
  • 那是我夕陽下的奔跑--一個萌新的覺醒

    摘要:晚上又不想看書屋里光線不好,最近正好在跟著權(quán)哥學(xué)習(xí)和,不如自己寫一個以后能用到的后臺模板來玩玩練練手。把重寫成不太確定,明天去問問權(quán)哥,哎呀寫文檔是真的有用把這個文件和文件都拖到網(wǎng)站根目錄下,然后把中的加載框架引導(dǎo)文件改成正確讀取的路徑。 今天下班回來走在路上,剛下過雨,又出了太陽。 步行從公司到租的房子里,路過人民公園,空氣一度讓人覺的這根本不是鄭州的樣子。公司里有些讓人不快的事情也...

    MiracleWong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<