2015-09-29 48 views
0

在Laravel,我知道如何在Laravel中將變量傳遞給會話的「WITHANYTHING」方法?

return Redirect::back()->with(['Foo'=>'Bar']); 

相當於

return Redirect::back()->withFoo('Bar'); 

但是......它是如何工作的?我的意思是,創建一個新的功能withFoo即時傳遞變量?這個行爲在Laravel代碼中定義在哪裏?我在哪裏可以檢查它?

+1

這是'__set()'魔術方法(雖然我沒有檢查,我敢肯定是這樣的話)。 Laravel充滿了「魔力」。我錯了,請看KA_lin的答案。 – Andrew

+1

其實它是'__call()',在這裏檢查一個例子http://www.garfieldtech.com/blog/magical-php-call –

+1

你可以檢查'RedirectResponse.php'那裏你可以找到'with * ''Line No:191 _call()' –

回答

1

下面是它是如何實現的(source):

public function __call($method, $parameters) 
{ 
    if (Str::startsWith($method, 'with')) { 
     return $this->with(Str::snake(substr($method, 4)), $parameters[0]); 
    } 
    throw new BadMethodCallException("Method [$method] does not exist on Redirect."); 
} 

記住,魔術方法__call當一個人試圖調用難以接近的方法被觸發。第一個參數是方法的名稱,後面跟着參數傳遞。在這種特殊情況下,RedirectResponse->with()被觸發,建立閃存數據:

public function with($key, $value = null) 
{ 
    $key = is_array($key) ? $key : [$key => $value]; 
    foreach ($key as $k => $v) { 
     $this->session->flash($k, $v); 
    } 
    return $this; 
} 
+1

我個人認爲這種編程方式使得調試和代碼瀏覽功能非常地獄...... – Amarnasan

+1

嗯,每一枚硬幣都有兩面,特別是DRY。 – raina77ow

相關問題