国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從頭開始擼一個 PHP 框架

nanfeiyan / 2814人閱讀

摘要:本文僅僅是用于自我學習記錄,參考了的原創文章隨著標準和包管理工具的面世,普通開發者擼一個框架已經不再是什么難事了。

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

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

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

composer

創建一個空的 composer.json 文件。

{
  
}

或者在空目錄下執行:

composer init

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

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

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

composer require noahbuscher/macaw

當前目錄結構為:

?  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 進來了外,其他啥都沒干。那么如何響應各種各樣的請求呢?

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


然后我們啟動php內置的開發服務器:

> cd public

> php -S localhost:8001

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

MVC

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

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

This is Home Page";
    }

}

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

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

整體代碼為:


此時已經綁定了一個路由至我們一個控制器的方法,但是我們去訪問 http://localhost:8001 會出現 Uncaught Error: Class "AppControllersHomeController" not found in 的錯誤。

為什么呢?

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

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

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

composer dump-autoload

刷新自動加載

Model連接數據庫

我們創建一個Article Model,這個 Model 對應數據庫一張表。此時我們先用mysql 命令行工具新建一個 demo_database 的數據庫,里面有一張表 articles , 表的結構大致如下:

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)

我們再在表里面填入數據:

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

當然了,我們現在是直接通過 MySQL 的 insert 命令直接填入數據,后續我們可以通過我們的框架新建 model 。

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

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數據,然后我們再通過 echo 返回給瀏覽器。


View層

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

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

" . $article["title"] . "

"; echo "

" . $article["content"] . "

";

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

return article;

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


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

ORM

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

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

我們這里使用 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";

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

 "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的功能,您也可以自己查閱文檔。

總結

好了,我們一個 MVC 框架基本上就搭建完了,我們回頭看一下整個框架目錄結構,是不是跟 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 ...

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28470.html

相關文章

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

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

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

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

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

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

    MiracleWong 評論0 收藏0

發表評論

0條評論

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