2013-10-09 2 views
22

Secondo Laravel 4 documentation.Differenza tra View Composer e Creator in Laravel 4?

Composer è:

Visualizza compositori sono callback o metodi di classe che vengono chiamati quando la vista viene eseguito il rendering. Se si dispone di dati che si desidera associare a una determinata vista ogni volta che tale visualizzazione viene sottoposta a rendering nell'intera applicazione, un compositore di viste può organizzare quel codice in un'unica posizione. Pertanto, i compositori possono funzionare come "modelli di visualizzazione" o "presentatori".

View::composer('profile', function($view) 
{ 
    $view->with('count', User::count()); 
}); 

E

Creator è:

Visualizza creatori funzionano quasi esattamente come la vista compositori; tuttavia, vengono immediatamente attivati ​​quando la vista viene istanziata. Per registrare un creatore vista, semplicità di utilizzo il metodo creatore

View::creator('profile', function($view) 
{ 
    $view->with('count', User::count()); 
}); 

Quindi la domanda è: Qual è la differenza?

risposta

46

Quando si utilizza View::creator, è possibile sovrascrivere le variabili di visualizzazione nel controller. Come questo:

View::creator('layout', function($view) { 
    $view->with('foo', 'bar'); 
}); 

// in controller 
return View::make('layout')->with('foo', 'not bar at all'); 

// it's defined as 'not bar at all' in the view 

-

View::composer('hello', function($view) { 
    $view->with('foo', 'bar'); 
}); 

// in controller 
return View::make('hello')->with('foo', 'not bar at all'); 

// it's defined as 'bar' in the view 
+1

Questa è una buona risposta perché fornisce un esempio concreto. Grazie! –

+1

Buono a sapersi perché conta. Grazie +1 – isimmons

+0

Questa risposta ha senso – Hafiz

16

Mi ci è voluto un po 'per capirlo, ho dovuto scavare nel codice sorgente per risolverlo. La differenza è a quale punto del ciclo dell'applicazione Laravel si desidera eseguire il comando.

Ci sono un certo numero di punti nel ciclo di Laravel che coinvolgono le visualizzazioni.

È possibile effettuare una visualizzazione utilizzando View::make(). Questo è quando una vista viene istanziata - e durante il comando-viene chiamato qualsiasi View::creators(), prima che la funzione venga restituita.

In genere è sufficiente eseguire return View::make() - il che significa che la vista è 'creata', e quindi restituita al core Laravel dove viene quindi 'composta' sullo schermo. Questo è quando viene chiamato il View::composer() (vale a dire dopo che la vista è tornata).

Non sono sicuro del perché si vorrebbe usare l'uno o l'altro, ma questo spiega la differenza tra i due.

+2

Se sei curioso di sapere perché sono stati aggiunti creatori (in origine erano solo i compositori), vedere [laravel/quadro Issue # 1822] (https://github.com/laravel/framework/issues/1822) –

+0

@PhpMyCoder Sei fantastico! Grazie! –

3

Un'altra differenza è che un'eccezione gettata all'interno di un ViewCreator sarà bolla indietro fino al Controller. Questo è utile per le autorizzazioni. Nel ViewCreator è possibile ottenere i dati delle autorizzazioni, quindi se l'utente non è autorizzato per quella pagina, lanciare un'eccezione e lasciare che sia gestita dal controller. Per esempio:

class MyController { 
    public function MyAction { 
     try { 
      return view('my_view'); 
     } catch (\Exception $e) { 
      echo "<h1>Exception</h1>"; 
      echo $e->getMessage(); 
     } 
    } 
} 

class MyViewCreator { 
    public function create(View $view) { 
     $loggedInUser = User::with('permissions')->find(Auth::user()->id); 
     if (! $loggedInUser->hasPermission('MY_PERMISSION')) { 
      throw new \Exception("You are not authorized"); 
     } 
     ... 
    } 
}