下面由composer使用教程欄目為大家介紹如何運用composer實現一個簡陋的mvc架構,希望對需要的朋友有所幫助!
背景緣由
網上有許多自己去編寫一些類來實現MVC框架的有很多。這個是在我進行項目改造的過程中操作的手法,搭建一個簡陋的MVC的簡易架構其中model和view是使用的laravel中的。下列實現的方式在很多地方會跟laravel很相似哦,廢話不多說,直接上步驟。(這里假設你已經安裝了composer使用教程)
Step1 composer init
直接執行composer init,按照步驟一步步下去,創建composer.json文件
使用composer可以實現類的自動加載功能,運用該功能是用來額,怎么說呢,偷懶的。將生成的composer文件按下圖修改,然后按下圖左邊目錄結構創建。
修改完配置后執行
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'?=>?true, ????'timeZone'?=>?'Asia/Shanghai', ????'APP_ROOT'?=>?dirname(__FILE__), ????'VIEW_ROOT'?=>?dirname(__FILE__).'/app/View', ];
之后呢,在項目根目錄(這里就是mvc目錄)下建立一個index.php
<?php /** * Created by PhpStorm. * User: Damon * Date: 2017/12/27 * Time: 15:37 */ $config = require('./config.php'); define('APP_ROOT',$config['APP_ROOT']);//設定項目路徑 define('VIEW_ROOT',$config['VIEW_ROOT']);//設定視圖路徑 //composer自動加載 require __DIR__ . '/vendor/autoload.php'; date_default_timezone_set($config['timeZone']);//時區設定 //獲取控制器名稱 if (empty($_GET["c"])) { $controller = 'AppControllersBaseController'; } else { $controller = 'AppControllers' . $_GET["c"] . 'Controller'; } $method = empty($_GET["m"]) ? 'index' : $_GET["m"];//獲取方法名 $app = isAvailableController($controller, $method, $config['DEBUG']);//實例化controller echo $app->$method(); die();
從上面的代碼上其是可以看到如果沒有傳遞get參數為c的會自動調用BaseController,該控制器繼承自抽象類Controller,里面有個index方法,這里直接return一個字符串link start ^_^ 。那基本上之后要調用某個控制器的某個方法就是用url來實現例如http://localhost/mvc/?c=Test&… 就是調用TestController控制器下的index方法。現在來看下是否內實現:
看來沒有問題,其他比較深奧的什么路由重寫啊神馬的,先不考慮。
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->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方法
該控制器的代碼如下:
namespace?AppControllers; use?AppCoresView; class?TestController?extends?Controller { ????public?function?index() ????{ ????????$str?=?'模板在哪里啊,模板在這里。'; ????????return?View::getView()->make('index',?['str'?=>?$str])->render(); ????} }
控制器中調用的模板是index.blade.php,內容如下:
nbsp;html> ????<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->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。
<?php /** * Created by PhpStorm. * User: Damon * Date: 2017/12/28 * Time: 9:52 */ namespace AppModel; use IlluminateDatabaseEloquentModel; class Metal extends Model { protected $fillable = ['metal_code','metal_name','metal_type','enable','deadline']; protected $table = 'mes_metal'; 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([ 'metal_code' =>?'TEST', ????????????'metal_name'?=>?'test', ????????????'materiel_type'?=>?1, ????????????'enable'?=>?0, ????????????'deadline'?=>?30 ????????]); ????????$res=?Metal::all()->toArray(); ????????var_dump($res); ????????die(); ???????? ????} }
這里有一些限制,就是無法使用laravel中的DB::connect(),不過其他的基礎使用好像都可以。并且這里無法切換連接的數據庫,這個其實可以將DB類進行修改,至于如何修改,自己想吧。