Minor【 PHP框架】4.服務容器與服務提供者

框架Github地址:github.com/Orlion/Minorphp

(若是以爲還不錯給個star哦(^-^)V)html

框架做者: Orliongit

知乎:https://www.zhihu.com/people/orliongithub

Github: https://github.com/Orlion設計模式

 

4.1 服務提供者app

  關於服務容器能夠參考個人另一篇文章:http://www.cnblogs.com/orlion/p/4797422.html框架

  Minor使用IoC(Inversion of Control,控制倒轉,這是一個設計模式,能夠先查看下百科)容器這個強有力的工具管理類依賴。依賴注入(也是一種設計模式,通常用於實現IoC)是 一個不用編寫固定代碼來處理類之間依賴的方法,相反的,這些依賴是在運行時注入的,這樣容許處理依賴時具備更大的靈活性。ide

  服務提供者是服務容器中的單元,是一個普通的類,任何類均可以被註冊爲服務,前提是這個類的依賴能夠被服務容器解析並且必須有一個boot()方法用於服務容器自動注入該服務提供者須要的依賴。(例如循環依賴就可能會致使應用異常)。函數

  4.1.1 建立一個服務提供者工具

  能夠在app/Lib/目錄下或者是其餘任何app目錄下建立一個服務提供者類:

<?php

namespace App\Lib;

class MailProvider
{
    private $from;

    private $username;

    private $password;

    public function boot($from, $username, $password)
    {
        $this->from = $from;
        $this->username = $username;
        $this->password = $password;
    }

    public function send($to)
    {
        echo '[MailProvider] send email from ' . $this->from . ' to ' . $to . ' use username:' . $this->username . ' and password:' . $this->password . '<br/><br/>';
    }
}

  這個服務提供者提供了一個發送郵件的服務,它的boot方法指明瞭這個類須要$from\$username\$password三個依賴。注意:服務提供者的構造函數不能帶有參數,由於服務容器在實例化服務提供者時並不會根據構造方法的參數去解析依賴。

  4.1.2 註冊服務

  上一步定義好了一個服務提供者,這一步就須要將這個服務提供者註冊到App中

  打開app/Config/providers.php文件,添加一下內容:

<?php
return [
    'mailer'    =>    [
                        'class'     =>    'App\\Lib\\MailProvider',
                        'arguments'    =>    ['orlionml@gmail.com', 'username', 'password'],
                        'singleton' =>  true,
                    ],
];

  class指的就是這個服務提供者的全名。這裏你也能夠指定一個匿名函數例:

'test'    => [
                 'class' => function(){
                                    $mail = new App\...\Mail;
                                    $mail->boot('...', '...' ,'...');
                                    return $mail;
                               }      
],                    

 

  arguments指的就是服務提供者的boot方法須要的參數。假如你的服務提供者依賴於另一個依賴,你也可使用'@serviceName'的語法來注入一個依賴,例Shop類依賴Mail:

<?php
return [
    'mailer'    =>    [
                        'class'     =>    'App\\Lib\\MailProvider',
                        'arguments'    =>    ['orlionml@gmail.com', 'username', 'password'],
                        'singleton' =>  true,
                    ],

    'shop'    =>        [
                        'class'    =>    'App\\Lib\\Shop',
                        'arguments'    =>    ['@mailer'],
                    ],
];

 

  singleton表示每次從服務容器中取出這個服務時都是同一個對象(單例),若是設置爲false則每次都會從新建立這個服務。

  4.1.3 獲取服務

  將服務註冊到App中後就能夠經過服務容器(Minor\Ioc\ServiceContainer)的get($serviceName)方法來獲取這個服務了,在控制器中能夠這樣獲取一個上邊咱們的"mailer"服務:

class HelloController extends Controller
{
    public function hello()
    {
       $container = $this-app->getServiceContainer();
         $mail = $container->get('mailer'); 
         $mail->send('somemsg');
         ... 
    }
}      

 

4.2 服務容器

  服務容器的初始化是在App的初始化時,即public/index.php文件中

$app = \Minor\Framework\App::getInstance(
   ...
    $providers  = require APP_DIR . 'Config/providers.php',
    ...
);

  這樣你就能夠經過調用App的getServiceContainer()方法來獲取服務容器。

class HelloController extends Controller
{
    public function hello()
    {
       $container = $this-app->getServiceContainer();
         ... 
    }
}  
相關文章
相關標籤/搜索