成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

從頭開(kāi)始擼一個(gè) PHP 框架

nanfeiyan / 2872人閱讀

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

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

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

接下來(lái)我們便是簡(jiǎn)單地實(shí)現(xiàn)一個(gè)MVC框架,來(lái)加深我們對(duì)框架的理解。

composer

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

{
  
}

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

composer init

則可以生成一個(gè)類(lèi)型如下的文件:

{
    "name": "charlie/my_first_framework",
    "description": "My First Framework",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Charlie",
            "email": "demo@qq.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {}
}
安裝第一個(gè)包

我們接下來(lái)安裝一個(gè)管理路由的包: noahbuscher/macaw。 功能比這個(gè)更加強(qiáng)大的路由包有很多,但是為了簡(jiǎn)單起見(jiàn),我們選擇安裝這個(gè)包。

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

我們?cè)诟夸浵滦陆ㄒ粋€(gè)public文件夾,并在該文件夾下新建 index.php。index.php 文件類(lèi)似于一個(gè)大廈的入口,我們所有的請(qǐng)求都運(yùn)行 index.php。

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

// 自動(dòng)加載vendor目錄下的包
require "../vendor/autoload.php";
routes.php

此時(shí)我們觀察 index.php,除了把vendor下面的包都 require 進(jìn)來(lái)了外,其他啥都沒(méi)干。那么如何響應(yīng)各種各樣的請(qǐng)求呢?

我們需要定義路由。路由就有點(diǎn)像快遞分揀站,把寫(xiě)著不同地址的請(qǐng)求分撥給不同的控制器處理。
那么我們?cè)诟夸浵聞?chuàng)建一個(gè) routes 文件夾,并在該文件夾下創(chuàng)建 web.php 文件。文件內(nèi)容:


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

> cd public

> php -S localhost:8001

我們?cè)L問(wèn) http://localhost:8001/hello 就能看到我們預(yù)期的 "hello world".

MVC

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

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

This is Home Page";
    }

}

另外我們?cè)?routes/web.php 中添加一條路由:

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

整體代碼為:


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

為什么呢?

因?yàn)榇藭r(shí)我們還并沒(méi)有將控制器加載進(jìn)來(lái),程序并不知道控制器在哪兒。我們可以用 composer 的 classmap 方法加載進(jìn)來(lái)。修改 composer.json 中添加:

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

我們順便把models也加載進(jìn)來(lái)。

composer dump-autoload

刷新自動(dòng)加載

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

我們創(chuàng)建一個(gè)Article Model,這個(gè) Model 對(duì)應(yīng)數(shù)據(jù)庫(kù)一張表。此時(shí)我們先用mysql 命令行工具新建一個(gè) demo_database 的數(shù)據(jù)庫(kù),里面有一張表 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)

我們?cè)僭诒砝锩嫣钊霐?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)在是直接通過(guò) MySQL 的 insert 命令直接填入數(shù)據(jù),后續(xù)我們可以通過(guò)我們的框架新建 model 。

接下來(lái)我們要做的就是怎么在 Model 中連接數(shù)據(jù)庫(kù)取到數(shù)據(jù)庫(kù)里面的數(shù)據(jù)啦! 本文使用的 php 7.1,我們使用 mysqli 來(lái)連接數(shù)據(jù)庫(kù)查詢數(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(); } }

這么一來(lái)我們就可以在控制器里面使用
`

Article::first();

`
來(lái)查詢 articles 表里面的第一條article數(shù)據(jù),然后我們?cè)偻ㄟ^(guò) echo 返回給瀏覽器。


View層

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

我們?cè)?views 目錄下新建 home.php:

" . $article["title"] . "

"; echo "

" . $article["content"] . "

";

我們?cè)俑膶?xiě)一下 Article.php,刪除echo 那兩行,直接

return article;

然后我們?cè)?HomeController 中指定要使用的 view:


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

ORM

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

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

我們這里使用 illuminate/database:

composer require illuminate/database

然后我們?cè)?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";

我們?cè)谶B接數(shù)據(jù)的時(shí)候,使用了 config/database.php 的數(shù)據(jù)庫(kù)配置文件。

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

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


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

總結(jié)

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

?  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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28470.html

相關(guān)文章

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

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

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

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

    AaronYuan 評(píng)論0 收藏0
  • 那是我夕陽(yáng)下的奔跑--一個(gè)萌新的覺(jué)醒

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

    MiracleWong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<