你必須先明白一個門面,在Laravel,是不是真的你的類,你必須看正如其名稱所述,它是您班級的前沿或臨街。門面就是你的班級的服務定位器。
要使用你必須創建一個服務提供商這一服務定位器,這將提供該門面使用的服務:
<?php namespace App\MyApp;
use Illuminate\Support\ServiceProvider;
class MyClassServiceProvider extends ServiceProvider {
protected $defer = true;
public function register()
{
$this->app['myclass'] = $this->app->share(function()
{
return new MyClass('the values you need it to instantiate with');
});
}
public function provides()
{
return array('myclass');
}
}
需要注意的是你的類的方法register()
實例化,現在是提供給您的通過IoC容器的應用程序,所以你可以做這樣的事情:
App::make('myclass')->echoThat();
現在你還可以創建你的門面使用它:
<?php namespace App\MyApp;
use Illuminate\Support\Facades\Facade as IlluminateFacade;
class ExtendedRouteFacade extends IlluminateFacade {
protected static function getFacadeAccessor()
{
return 'myclass';
}
}
Facade只有一個方法,它的唯一目的是返回IoC容器中類實例的名稱。
現在你可以打開你的app/config/app.php
並添加的ServiceProvider:
'App\MyApp\MyClassServiceProvider',
也實際門面別名:
'MyClass' => 'App\MyApp\MyClassFacade',
,你要善於利用你的門面:
echo MyClass::echoThat();
但請注意,它的方式使你的班級__constructor
將永遠是c在您的ServiceProvider中調用相同的參數,這就是Facade的工作方式,但您有一些選擇:
使用setter爲您的類實例中的數據設置新值。
public function setValue($value)
{
$this->_value = $value;
}
使用Laravel自動類分辨率爲類dinamically提供參數:
function __construct (MyFooClass $foo)
{
$this->_foo = $foo;
}
,並改變你的ServiceProvider提供沒有參數到類:
$this->app['myclass'] = $this->app->share(function()
{
return new MyClass();
});
Laravel將自動爲你自動提供MyFooClass
,如果它可以在y的可用源代碼中找到它我們的應用程序或者它是否綁定到IoC容器。
請注意,所有這一切都假設您不只是在構造函數中傳遞字符串,IoC容器的自動解析假定您的類具有其他類依賴項並自動注入這些依賴項(依賴注入)。
如果你真的需要只通過串或單值類的構造函數,只是做了一些計算,你並不真的需要創建外立面對他們來說,你可以:
$x = (new myClass("SimpleString"))->echoThat();
使用簡單的二傳手:
$x = new myClass();
$x->setValue("SimpleString");
$x->echoThat();
,或者你已經在做的,這是可以接受的:
$x = new myClass("SimpleString");
$x->echoThat();
而且你還可以使用IoC容器來實例化類您在其他類中:
<?php
class Post {
private $myClass;
public function __construct(MyClass $myClass)
{
$this->myClass = $myClass;
}
public function doWhateverAction($value)
{
$this->myClass->setValue($value);
// Do some stuff...
return $this->myClass->echoThat();
}
}
Laravel會自動將您的類的實例,你可以使用它你需要的方式:
$post = new Post;
echo $post->doWhateverAction("SimpleString");
好的告訴我這裏有什麼奇怪的東西 –
@MT - 開發者:它只是一個靜態類。你爲什麼認爲這是一個*外觀*? – zerkms