2014-04-01 20 views
0

我已經做了一個類。該類的構造函數將一個值分配給一個類屬性。Laravel門面__constructor()用法

這裏的定義是:

class myClass 
{ 
    private $_value; 

    function __construct ($input) 
    { 
     $this->_value = $input; 
    } 

    function echoThat() 
    { 
     echo $this->_value; 
    } 
} 

和經常的用法是:

$x = new myClass("SimpleString"); 
$x->echoThat(); 

但我已經把全班學生分成一個門面型Laravel類,因此它被用於:

myClass::echoThat(); 

我該如何利用Laravel Facades中的__construct()方法,如上面的ex充足?

+0

好的告訴我這裏有什麼奇怪的東西 –

+0

@MT - 開發者:它只是一個靜態類。你爲什麼認爲這是一個*外觀*? – zerkms

回答

5

如果您確實想使用Laravel門面,您應該只創建一個Laravel門面。 Laravel Facades爲課程提供靜態接口。

這意味着要麼重寫你的類,這樣就可以通過你的字符串中像任何其它的方式:

MyClassFacade::echoThat('SimpleString'); 

當然,你也可以修改底層類例如使用另一種方法來傳遞字符串:

class MyClass 
{ 
    private $_value; 

    public function setValue($val) 
    { 
     $this->_value = $val; 

     return $this; 
    } 

    public function echoThat() 
    { 
     echo $this->_value; 
    } 
} 

然後調用它像:

MyClassFacade::setValue('SimpleString')->echoThat(); 

您可以CA LL你班「靜態」,如果你實例化類的任何地方Laravel門面訪問得到解決,例如在服務提供商的非靜態方法:

use Illuminate\Support\ServiceProvider; 

class MyClassServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     $this->app->bind('myclass', function() 
     { 
      return new MyClass(); 
     }); 
    } 

} 

Laravel將創建MyClass一個實例,每當一個方法你班級靜態使用__callStatic

或者不使用Laravel門面和intiantiate類手動喜歡你做的:

$x = new myClass("SimpleString"); 
$x->echoThat(); 
+0

你的解釋是相當清晰和直接,沒有任何侮辱......謝謝 –

+0

你的代碼是不正確的。你不能使用'$ this'並靜態調用非靜態類。 – zerkms

+0

@M T - 開發人員:在檢查答案之前,檢查提供的代碼是否有意義是有意義的。不是這裏的情況:-D – zerkms

1

我發現有關在Facede Lavarel FW模型類的一些古德信息在本頁面 http://laravel.com/docs/eloquent

我以爲這裏是你的ploblem主要說明,以創建數據庫輸入的方式......

// Create a new user in the database... 
$user = User::create(array('name' => 'John')); 

// Retrieve the user by the attributes, or create it if it doesn't exist... 
$user = User::firstOrCreate(array('name' => 'John')); 

// Retrieve the user by the attributes, or instantiate a new instance... 
$user = User::firstOrNew(array('name' => 'John')); 

這裏創建一個簡單的新實例,並初始化它的變量的方式:

$user = new User; 

$user->name = 'John'; 

$user->save(); 

基於此,我假設在Lavarel中沒有明確的方法來使用構造函數。

5

你必須先明白一個門面,在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");