
批改狀態(tài):合格
老師批語:
C: Controller(控制層),是middile層, 它負責根據(jù)用戶從”視圖層”輸入的指令,選取”數(shù)據(jù)層”中的數(shù)據(jù),然后對其進行相應(yīng)的操作,產(chǎn)生最終結(jié)果。
仿站: V - M - C
容器和依賴注入
ThinkPHP使用容器來更方便的管理類依賴及運行依賴注入,新版的容器支持PSR-11規(guī)范。
容器類的工作由think\Container類完成,但大多數(shù)情況我們只需要通過app助手函數(shù)或者think\App類即可容器操作,如果在服務(wù)類中可以直接調(diào)用this->app進行容器操作。
依賴注入其實本質(zhì)上是指對類的依賴通過構(gòu)造器完成自動注入,例如在控制器架構(gòu)方法和操作方法中一旦對參數(shù)進行對象類型約束則會自動觸發(fā)依賴注入,由于訪問控制器的參數(shù)都來自于URL請求,普通變量就是通過參數(shù)綁定自動獲取,對象變量則是通過依賴注入生成。
依賴注入的對象參數(shù)支持多個,并且和順序無關(guān)。
支持使用依賴注入的場景包括(但不限于):
<?php
namespace my_Model;
use PDO;
//模型層 獲取數(shù)據(jù)表中數(shù)據(jù)
class Model
{
public function getData()
{
return (new PDO('mysql:host=localhost;dbname=zwz','zwz1230','a123456'))->query("SELECT `id`,`uname` FROM `user` ORDER BY `id` asc LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
}
}
print_r((new Model())->getData());
<?php
namespace my_Model;
//視圖層 生成可視化表格
class View
{
public function fetch($data)
{
$table = '<table>';
$table.= '<caption>用戶信息表</caption>';
$table.= '<tr><th>編號</th><th>姓名</th></tr>';
foreach ($data as $key => $user) {
$table.= '<tr>';
$table.= '<td>'.$user['id'].'</td>';
$table.= '<td>'.$user['uname'].'</td>';
$table.= '</tr>';
}
$table.= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:lightblue;}
td,th {border: 1px solid; padding:5px}
</style>';
<?php
namespace my_Model;
require 'Model.php';
require 'View.php';
//中間橋梁 控制器
class Controller
{
//依賴注入外部對象
public function index(Model $Model,View $View)
{
//1.獲取數(shù)據(jù)
$data = $Model->getData();
//2.模板渲染
return $View->fetch($data);
}
}
$model = new Model() ;
$view = new View();
$controller = new Controller($model,$view);
echo $controller->index($model,$view);
__construct()
,可以在類方法中共享方法
<?php
namespace my_Model;
require 'Model.php';
require 'View.php';
//中間橋梁 控制器
class Controller
{
protected $Model;
protected $View;
//依賴注入 使用構(gòu)造器進行傳參可以在類方法中共享
public function __construct(Model $Model,View $View)
{
$this->Model = $Model;
$this->View = $View;
}
public function index(Model $Model,View $View)
{
$data = $this->Model->getData();
return $this->View->fetch($data);
}
}
$model = new Model() ;
$view = new View();
$controller = new Controller($model,$view);
//采用異步回調(diào)方式進行輸出
echo call_user_func_array([$controller,"index"],[$model,$view]);
綁定
容器:container :依賴注入的類統(tǒng)一由容器進行管理,容器 數(shù)組
<?php
namespace my_Model;
/**
* 容器:container :依賴注入的類統(tǒng)一由容器進行管理,容器 數(shù)組
*
* 如果當前類依賴的對象很多, 可以將這些依賴的對象 , 類,閉包,放到一個"服務(wù)容器"中進行統(tǒng)一管理 bind make
*/
use Closure;
require 'Model.php';
require 'View.php';
//服務(wù)容器 : 一個自動生產(chǎn)類/對象的工廠
class Container
{
//1.對象容器 數(shù)組
protected $instances = [];
/**
* 2.往對象容器數(shù)組中去綁定 對象
* 綁定一個類、閉包、實例、接口實現(xiàn)到容器
* @access public
* @param string|array $abstract 類標識、接口的別名 alias
* @param mixed $concrete 要綁定的類、閉包或者實例
* @return $this
*/
public function bind($abstract,Closure $concrete)
{
//初始化對象容器,健是別名,鍵值是對象
$this->instances[$abstract] = $concrete;
}
//3. 從對象容器中取出 對象并調(diào)用
public function make($abstract,$params=[])
{
return call_user_func_array($this->instances[$abstract],$params);
}
}
$container = new Container;
//綁定一個閉包到容器 : 我們使用這個model對象的時候 再去實例化
$container->bind('model',function(){
return new Model();
});
$container->bind('view',function(){
return new View();
});
class Controller
{
public function index(Container $container)
{
$data = $container->make('model')->getData();
return $container->make('view')->fetch($data);
}
}
//客戶端代碼
$contrl = new Controller;
echo $contrl->index($container);
facade 門面技術(shù) 實現(xiàn)類成員訪問靜態(tài)化
// facade 門面技術(shù)
class Facade {
//為容器中的類提供一種靜態(tài)調(diào)用方式
protected static $container;
public static function initialize(Container $container)
{
static::$container = $container;
}
}
//模型類成員的訪問靜態(tài)化
class UserModel extends Facade
{
public static function getData()
{
//后期靜態(tài)綁定
return static::$container->make('model')->getData();
}
}
//視圖層類成員訪問靜態(tài)化
class UserView extends Facade
{
public static function fetch($data)
{
//后期靜態(tài)綁定
return static::$container->make('view')->fetch($data);
}
}
class Controller
{
public function __construct(Container $container)
{
Facade::initialize($container);
}
public function index()
{
$data = UserModel::getData();
return UserView::fetch($data);
}
}
//客戶端代碼
echo (new Controller($container))->index();
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號