運用composer實現一個簡陋的MVC架構

下面由composer使用教程欄目為大家介紹如何運用composer實現一個簡陋的mvc架構,希望對需要的朋友有所幫助!

運用composer實現一個簡陋的MVC架構

背景緣由

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

Step1 composer init

直接執行composer init,按照步驟一步步下去,創建composer.json文件

運用composer實現一個簡陋的MVC架構

使用composer可以實現類的自動加載功能,運用該功能是用來額,怎么說呢,偷懶的。將生成的composer文件按下圖修改,然后按下圖左邊目錄結構創建。

運用composer實現一個簡陋的MVC架構

修改完配置后執行

composer?install composer?dump-autoload

Step 2 構建一些基本文件及功能

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

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

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

<?php /**  * Created by PhpStorm.  * User: Damon  * Date: 2017/12/26  * Time: 2017/12/26  * Info: basic controller  */ namespace AppControllers; abstract class Controller {     protected static $instance = null;     final protected function __construct(){         $this->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目錄下新建控制器就行了,例如我實現一個TestController,請注意新建的控制器必須以Controller結尾并繼承上面的Controller,如下:

namespace?AppControllers; class?TestController?extends?Controller { ????public?function?index() ????{ ????????echo?'link?start?^_^'; ????} }

創建一個配置文件config.php

return?[ ????'DEBUG'?=&gt;?true, ????'timeZone'?=&gt;?'Asia/Shanghai', ????'APP_ROOT'?=&gt;?dirname(__FILE__), ????'VIEW_ROOT'?=&gt;?dirname(__FILE__).'/app/View', ];

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

<?php /**  * Created by PhpStorm.  * User: Damon  * Date: 2017/12/27  * Time: 15:37  */ $config = require(&#39;./config.php&#39;); define(&#39;APP_ROOT&#39;,$config[&#39;APP_ROOT&#39;]);//設定項目路徑 define(&#39;VIEW_ROOT&#39;,$config[&#39;VIEW_ROOT&#39;]);//設定視圖路徑 //composer自動加載 require __DIR__ . &#39;/vendor/autoload.php&#39;; date_default_timezone_set($config[&#39;timeZone&#39;]);//時區設定 //獲取控制器名稱 if (empty($_GET["c"])) {     $controller = &#39;AppControllersBaseController&#39;; } else {     $controller = &#39;AppControllers&#39; . $_GET["c"] . &#39;Controller&#39;; } $method = empty($_GET["m"]) ? &#39;index&#39; : $_GET["m"];//獲取方法名 $app = isAvailableController($controller, $method, $config[&#39;DEBUG&#39;]);//實例化controller echo $app->$method(); die();

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

運用composer實現一個簡陋的MVC架構

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

Step3 實現模板引擎

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

composer?require?xiaoler/blade

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

引入完這個包怎么實現模板引擎呢,我自己是根據包的說明實現了一個View類把他放到Cores目錄下內容如下:

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-&gt;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&…,也就是調用TestController的index方法

運用composer實現一個簡陋的MVC架構

該控制器的代碼如下:

namespace?AppControllers; use?AppCoresView; class?TestController?extends?Controller { ????public?function?index() ????{ ????????$str?=?'模板在哪里啊,模板在這里。'; ????????return?View::getView()-&gt;make('index',?['str'?=&gt;?$str])-&gt;render(); ????} }

控制器中調用的模板是index.blade.php,內容如下:

nbsp;html&gt;   ????<meta> ????<title>home?view</title> {{?$str?}}  

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

@inject @can @cannot @lang 關鍵字被移除了

不支持事件和中間件

Step4 實現Model

這里使用的是illuminate / database包來實現Model的,執行以下命令安裝。

??composer?require?illuminate/database

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

<?php /**  * Created by PhpStorm.  * User: Damon  * Date: 2017/12/28  * Time: 9:13  */ namespace AppCores; use IlluminateDatabaseCapsuleManager as Capsule; class DB {     protected static $instance = null;     final protected function __construct(){         $this->init(); ????} ????final?protected?function?__clone(){} ????protected?function?init(){ ????????$capsule?=?new?Capsule; ????????$capsule-&gt;addConnection([ ????????????'driver'?=&gt;?'mysql', ????????????'host'?=&gt;?'localhost', ????????????'database'?=&gt;?'mes', ????????????'username'?=&gt;?'root', ????????????'password'?=&gt;?'12345678', ????????????'charset'?=&gt;?'utf8', ????????????'collation'?=&gt;?'utf8_unicode_ci', ????????????'prefix'?=&gt;?'', ????????]); ????????//?Make?this?Capsule?instance?available?globally?via?static?methods...?(optional) ????????$capsule-&gt;setAsGlobal(); ????????//?Setup?the?Eloquent?ORM...?(optional;?unless?you've?used?setEventDispatcher()) ????????$capsule-&gt;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。

<?php /**  * Created by PhpStorm.  * User: Damon  * Date: 2017/12/28  * Time: 9:52  */ namespace AppModel; use IlluminateDatabaseEloquentModel; class Metal extends Model {     protected $fillable = [&#39;metal_code&#39;,&#39;metal_name&#39;,&#39;metal_type&#39;,&#39;enable&#39;,&#39;deadline&#39;];     protected $table = &#39;mes_metal&#39;;     public $timestamps = false; }

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

<?php /**  * Created by PhpStorm.  * User: Damon  * Date: 2017/12/27  * Time: 16:08  */ namespace AppControllers; use AppCoresDB; use AppCoresView; use AppModelMetal; class TestController extends Controller {     public function index()     {         DB::linkStart();//連接db         Metal::create([             &#39;metal_code&#39; =>?'TEST', ????????????'metal_name'?=&gt;?'test', ????????????'materiel_type'?=&gt;?1, ????????????'enable'?=&gt;?0, ????????????'deadline'?=&gt;?30 ????????]); ????????$res=?Metal::all()-&gt;toArray(); ????????var_dump($res); ????????die(); ???????? ????} }

這里有一些限制,就是無法使用laravel中的DB::connect(),不過其他的基礎使用好像都可以。并且這里無法切換連接的數據庫,這個其實可以將DB類進行修改,至于如何修改,自己想吧。

以上就是運用

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享