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

資訊專欄INFORMATION COLUMN

運(yùn)用composer實(shí)現(xiàn)一個簡陋的MVC架構(gòu)

PiscesYE / 1164人閱讀

摘要:背景緣由網(wǎng)上有許多自己去編寫一些類來實(shí)現(xiàn)框架的有很多。這個是在我進(jìn)行項(xiàng)目改造的過程中操作的手法,搭建一個簡陋的的簡易架構(gòu)其中和是使用的中的。那基本上之后要調(diào)用某個控制器的某個方法就是用來實(shí)現(xiàn)例如就是調(diào)用控制器下的方法。

背景緣由

網(wǎng)上有許多自己去編寫一些類來實(shí)現(xiàn)MVC框架的有很多。這個是在我進(jìn)行項(xiàng)目改造的過程中操作的手法,搭建一個簡陋的MVC的簡易架構(gòu)其中model和view是使用的laravel中的。下列實(shí)現(xiàn)的方式在很多地方會跟laravel很相似哦,廢話不多說,直接上步驟。(這里假設(shè)你已經(jīng)按照了composer)

Step1 Composer init

直接執(zhí)行composer init,按照步驟一步步下去,創(chuàng)建composer.json文件

使用composer可以實(shí)現(xiàn)類的自動加載功能,運(yùn)用該功能是用來額,怎么說呢,偷懶的。將生成的composer文件按下圖修改,然后按下圖左邊目錄結(jié)構(gòu)創(chuàng)建。

修改完配置后執(zhí)行

composer install
composer dump-autoload
Step 2 構(gòu)建一些基本文件及功能

之后在helper.php文件中添加一個函數(shù),該函數(shù)是判斷函數(shù)及其controller存在與否

if (!function_exists("isAvailableController")) {

    function isAvailableController($controller,$method,$debug)
    {
        if(class_exists($controller)){
            $app =$controller::getinstance();
            //判斷調(diào)用的方法控制器類中是否存在
            if(!method_exists($controller,$method)){
                echo $controller."類不存在".$method."方法!";
                die();
            }
        } else {
            echo $controller."類不存在!";
            die();
        }
        return $app;
    }
}

Controllers目錄下新建一個Controller作為抽象類

init();
    }

    final protected function __clone(){}
    protected function init(){}
    //abstract protected function init();

    public static function getInstance(){
        if(static::$instance === null){
            static::$instance = new static();
        }
        return static::$instance;
    }

}

之后在Controllers目錄下新建控制器就行了,例如我實(shí)現(xiàn)一個TestController,請注意新建的控制器必須以Controller結(jié)尾并繼承上面的Controller,如下:

namespace AppControllers;


class TestController extends Controller
{
    public function index()
    {
        echo "link start ^_^";
    }
}

創(chuàng)建一個配置文件config.php

return [
    "DEBUG" => true,
    "timeZone" => "Asia/Shanghai",
    "APP_ROOT" => dirname(__FILE__),
    "VIEW_ROOT" => dirname(__FILE__)."/app/View",

];

之后呢,在項(xiàng)目根目錄(這里就是mvc目錄)下建立一個index.php

$method();
die();

從上面的代碼上其是可以看到如果沒有傳遞get參數(shù)為c的會自動調(diào)用BaseController,該控制器繼承自抽象類Controller,里面有個index方法,這里直接return一個字符串link start ^_^ 。那基本上之后要調(diào)用某個控制器的某個方法就是用url來實(shí)現(xiàn)例如http://localhost/mvc/?c=Test&... 就是調(diào)用TestController控制器下的index方法。現(xiàn)在來看下是否內(nèi)實(shí)現(xiàn):

看來沒有問題,其他比較深奧的什么路由重寫啊神馬的,先不考慮。

Step3 實(shí)現(xiàn)模板引擎

這里實(shí)現(xiàn)模板引擎的方式是使用laravel的blade模板引擎,如何引入呢,這里使用composer來引入一個包來解決。

composer require xiaoler/blade

這個包git上有比較詳細(xì)的說明,這個是xiaoler/blade包的連接

引入完這個包怎么實(shí)現(xiàn)模板引擎呢,我自己是根據(jù)包的說明實(shí)現(xiàn)了一個View類把他放到Cores目錄下內(nèi)容如下:

namespace AppCores;
use XiaolerBladeFileViewFinder;
use XiaolerBladeFactory;
use XiaolerBladeCompilersBladeCompiler;
use XiaolerBladeEnginesCompilerEngine;
use XiaolerBladeFilesystem;
use XiaolerBladeEnginesEngineResolver;
class View
{
    const VIEW_PATH = [APP_ROOT."/app/View"];
    const CACHE_PATH = APP_ROOT."/storage/framework/cache";

    public static function getView(){
        $file = new Filesystem;
        $compiler = new BladeCompiler($file, self::CACHE_PATH);
        $resolver = new EngineResolver;
        $resolver->register("blade", function () use ($compiler) {
            return new CompilerEngine($compiler);
        });
        $factory = new Factory($resolver, new FileViewFinder($file, self::VIEW_PATH));

        return $factory;
    }
}

測試一下,http://localhost/mvc/?c=Test&...,也就是調(diào)用TestController的index方法

該控制器的代碼如下:

namespace AppControllers;


use AppCoresView;

class TestController extends Controller
{
    public function index()
    {
        $str = "模板在哪里啊,模板在這里。";
        return View::getView()->make("index", ["str" => $str])->render();
    }
}

控制器中調(diào)用的模板是index.blade.php,內(nèi)容如下:




    
    home view


{{ $str }}

模板引擎功能OK啦,之后就可以愉快地使用blade模板引擎了,不過有些laravel中自帶的一些語法是不能用的哦,該包的git上有說明這里引用下

@inject @can @cannot @lang 關(guān)鍵字被移除了

不支持事件和中間件

Step4 實(shí)現(xiàn)Model

這里使用的是illuminate / database包來實(shí)現(xiàn)Model的,執(zhí)行以下命令安裝。

  composer require illuminate/database

Core目錄下新建一個DB類,代碼如下:

init();
    }

    final protected function __clone(){}
    protected function init(){
        $capsule = new Capsule;
        $capsule->addConnection([
            "driver" => "mysql",
            "host" => "localhost",
            "database" => "mes",
            "username" => "root",
            "password" => "12345678",
            "charset" => "utf8",
            "collation" => "utf8_unicode_ci",
            "prefix" => "",
        ]);

        // Make this Capsule instance available globally via static methods... (optional)
        $capsule->setAsGlobal();

        // Setup the Eloquent ORM... (optional; unless you"ve used setEventDispatcher())
        $capsule->bootEloquent();
    }
    //abstract protected function init();

    public static function linkStart(){
        if(static::$instance === null){
            static::$instance = new static();
        }
        return static::$instance;
    }
}

這樣在controller中就可以使用了,例如先在app目錄下建立Model目錄,在Model中新建一個Model文件Matter.php。


之后可以在控制器中這么使用:

 "TEST",
            "metal_name" => "test",
            "materiel_type" => 1,
            "enable" => 0,
            "deadline" => 30
        ]);
        $res= Metal::all()->toArray();

        var_dump($res);
        die();
        
    }
}

這里有一些限制,就是無法使用laravel中的DB::connect(),不過其他的基礎(chǔ)使用好像都可以。并且這里無法切換連接的數(shù)據(jù)庫,這個其實(shí)可以將DB類進(jìn)行修改,至于如何修改,自己想嘍。這個project放到了github上,點(diǎn)擊這里查看。

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

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

相關(guān)文章

  • Symfony2中創(chuàng)建數(shù)據(jù)模型

    摘要:今天我在這里給大家分享一下在中如何創(chuàng)建數(shù)據(jù)模型和基于的搭建。對象與數(shù)據(jù)庫的關(guān)系通常在電腦的世界里創(chuàng)建的數(shù)據(jù)模型會轉(zhuǎn)換為數(shù)據(jù)庫里的一條條記錄。 Symfony是一款優(yōu)秀的基于MVC架構(gòu)的PHP框架。今天我在這里給大家分享一下在Symfony中如何創(chuàng)建數(shù)據(jù)模型和基于RESTful api的搭建。重點(diǎn)是如何創(chuàng)建數(shù)據(jù)模型哦! 本教程使用的當(dāng)前Symfony的LTS版本(Symfony 2.8...

    rainyang 評論0 收藏0
  • 可落地DDD(2)-為什么說MVC工程架構(gòu)已經(jīng)過時(shí)

    摘要:的演進(jìn)按照上述的說明,在一個單體服務(wù)中,隨著業(yè)務(wù)的不斷迭代,可能會發(fā)生什么嚴(yán)重的問題。個人認(rèn)為造成這個原因的主要原因還是在于長期以來的這種模式只有縱向切分導(dǎo)致。摘要 mvc是一種軟件設(shè)計(jì)模式,最早由Trygve Reenskaug在1978年提出,他有效的解決了表示層,控制器層,邏輯層的代碼混合在一起的問題,很好的做到了職責(zé)分離。但是在實(shí)際的編碼實(shí)踐過程中,你會發(fā)現(xiàn)這個模式隨著業(yè)務(wù)的擴(kuò)展,變...

    JowayYoung 評論0 收藏0
  • 這兩年多我寫PHP業(yè)務(wù)代碼方式是如何進(jìn)化

    摘要:曾今誰都有過迷茫期,下面是我開始開發(fā)中,不斷改變的代碼組織方式。 曾今 誰都有過迷茫期,下面是我開始PHP開發(fā)中,不斷改變的代碼組織方式。 初期:所有代碼一股腦控制器controller 曾今只是簡單的理解MVC 中期:業(yè)務(wù)代碼抽象一部分到模型層model 開始覺得model層是否該做點(diǎn)什么了 后期:業(yè)務(wù)代碼控制器,模型層只寫db的curd方法 復(fù)雜的業(yè)務(wù)代碼使contro...

    qqlcbb 評論0 收藏0
  • 利用 Composer 一步一步構(gòu)建自己 PHP 框架(四)——使用 ORM

    摘要:引入了命名空間,這是規(guī)劃在中的功能,所以在一定程度上其實(shí)就是,的下一個版本是,即將發(fā)布,主要貢獻(xiàn)者是大名鼎鼎的鳥哥。使用修改為自動載入路由配置新增注意替換數(shù)據(jù)庫密碼修改無需改動。作者接受采訪時(shí)曾表示,是整個中最難實(shí)現(xiàn)的部分。 原文發(fā)表在我的個人網(wǎng)站:利用 Composer 一步一步構(gòu)建自己的 PHP 框架(四)——使用 ORM 本教程示例代碼見 https://github.com...

    FreeZinG 評論0 收藏0
  • 使用 mixphp 打造多進(jìn)程異步郵件發(fā)送

    摘要:消費(fèi)者開發(fā)本例我們使用的多進(jìn)程開發(fā)工具來完成這個需求,通常使用常駐進(jìn)程來處理隊(duì)列的消費(fèi),所以我們使用的類型,模式。中進(jìn)程負(fù)責(zé)執(zhí)行郵件發(fā)送任務(wù)。此時(shí)終端將打印成功收到測試郵件官網(wǎng) 注意:這個是 MixPHP V1 的范例 郵件發(fā)送是很常見的需求,由于發(fā)送郵件的操作一般是比較耗時(shí)的,所以我們一般采用異步處理來提升用戶體驗(yàn),而異步通常我們使用消息隊(duì)列來實(shí)現(xiàn)。 傳統(tǒng) MVC 框架由于缺少多進(jìn)程...

    EdwardUp 評論0 收藏0

發(fā)表評論

0條評論

PiscesYE

|高級講師

TA的文章

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