Avec le patron de conception MVC, lorsqu'une vue doit afficher des données tirées de la base de données, c'est le contrôleur qui se chargera de retrouver les données et de les passer à la vue.
Prenons le cas d'une méthode d'action qui affiche une vue comme suit :
class ProduitsController extends Controller
{
/**
* Affiche tous les produits.
*
* @return \Illuminate\View\View
*/
public function index() : View
{
...
return view('produits.index');
}
...
}
Puisque c'est le travail du contrôleur d'interroger la base de données, il faut trouver une technique pour faire circuler les données entre le contrôleur et la vue.
Plusieurs techniques sont présentées ici. Elles sont toutes équivalentes. Je vous conseille cependant d'utiliser la fonction compact() pour sa simplicité.
Le contrôleur doit passer à la vue le nom de la variable qui contient les données ainsi que les données.
On regroupera ces deux informations dans un tableau associatif.
Ex :
class ProduitsController extends Controller
{
/**
* Affiche tous les produits.
*
* @return \Illuminate\View\View
*/
public function index() : View
{
$produits = Produit::orderBy('code')->get();
return View('produits.index', ['produits' => $produits]);
}
...
}
On obtiendra exactement le même résultat avec la syntaxe suivante :
class ProduitsController extends Controller
{
/**
* Affiche tous les produits.
*
* @return \Illuminate\View\View
*/
public function index() : View
{
$produits = Produit::orderBy('code')->get();
return View('produits.index')->with('produits', $produits);
}
...
}
Il est également possible d'utiliser la fonction PHP compact(). Il s'agit de la méthode privilégiée par de nombreux développeurs Laravel.
La fonction compact() crée automatiquement un tableau associatif dont la clé de chaque élément correspond à la chaîne reçue en paramètre et la valeur correspond à la valeur de la variable du même nom.
class ProduitsController extends Controller
{
/**
* Affiche tous les produits.
*
* @return \Illuminate\View\View
*/
public function index() : View
{
$produits = Produit::orderBy('code')->get();
return View('produits.index', compact('produits'));
}
...
}
Ainsi, compact('produits') retourne un tableau associatif avec un seul élément puisqu'un seul paramètre a été reçu. La clé de ce paramètre est 'produits' et sa valeur correspond à la variable $produits.
La variable $produits contient la liste des produits. Il s'agit en fait d'une collection puisque la requête Eloquent a été terminée par get().
array:1 [▼
"produits" => Collection {#351 ▼
#items: array:4 [▼
0 => Produit {#352 ▶}
1 => Produit {#353 ▶}
2 => Produit {#354 ▶}
3 => Produit {#355 ▶}
4 => Produit {#356 ▶}
]
}
]
Attention : dans les paramètres de compact(), ne laissez pas le signe $ devant le nom d'une variable sinon, vous obtiendrez un tableau vide.
Parfois, le contrôleur devra passer plusieurs informations à la vue. Il suffira, pour cela, de passer plusieurs variables à la fonction compact :
class ProduitsController extends Controller
{
/**
* Affiche tous les produits.
*
* @return \Illuminate\View\View
*/
public function index() : View
{
$produits = Produit::orderBy('code')->get();
$derniersAchats = ...
return View('produits.index', compact('produits', 'derniersAchats'));
}
...
}
« Passing Multiple Variables Into a Laravel 5 View ». Easy Laravel Book. http://www.easylaravelbook.com/blog/2015/03/09/passing-multiple-variables-into-a-laravel-5-view/
▼Publicité