Solución:
Normalmente uso View Composers para que sea más claro y legible.
Por ejemplo, si quiero compartir una variable con la barra de navegación principal para todas mis vistas, sigo las siguientes reglas:
1. Cree un nuevo proveedor de servicios
Puedes crear un proveedor de servicios con artisan cli:
php artisan make:provider ViewComposerServiceProvider
En el ViewComposerServiceProvider crear archivo composeNavigation método en el que tiene la plantilla de la hoja main.nav-menu que representa el menú de navegación con variables compartidas.
los ViewComposerServiceProvider parece:
<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->composeNavigation();
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
private function composeNavigation()
{
view()->composer('main.nav-menu', 'AppHttpViewComposersNavComposer');
}
}
2. Crear compositor
Como vio en el archivo de arriba, tenemos Aplicación Http ViewComposers NavComposer.php así que creemos ese archivo. Crea la carpeta VerCompositores en el Aplicación Http y luego adentro crea NavComposer.php expediente.
los NavComposer.php expediente:
<?php
namespace AppHttpViewComposers;
use AppRepositoriesNavMenuRepository;
use IlluminateViewView;
class NavComposer
{
protected $menu;
public function __construct(NavMenuRepository $menu)
{
$this->menu = $menu;
}
public function compose(View $view)
{
$thing= $this->menu->thing();
$somethingElse = $this->menu->somethingElseForMyDatabase();
$view->with(compact('thing', 'somethingElse'));
}
}
3. Crear repositorio
Como viste arriba en el NavComposer.php archivo tenemos repositorio. Por lo general, creo un repositorio en el Aplicación directorio, así que crea Repositorios directorio en el Aplicación y luego, crea adentro NavMenuRepository.php expediente.
Este archivo es el corazón de ese patrón de diseño. En ese archivo tenemos que tomar el valor de nuestras variables que queremos compartir con todas nuestras vistas.
Eche un vistazo al archivo a continuación:
<?php
namespace AppRepositories;
use AppThing;
use DB;
class NavMenuRepository
{
public function thing()
{
$getVarForShareWithAllViews = Thing::where('name','something')->firstOrFail();
return $getVarForShareWithAllViews;
}
public function somethingElseForMyDatabase()
{
$getSomethingToMyViews = DB::table('table')->select('name', 'something')->get();
return $getSomethingToMyViews;
}
}
Para personas con proyecto pequeño:
En primer lugar, ¡la respuesta aceptada es increíble!
Para usuarios de Laravel 5.2:
Simplemente use la nueva directiva blade @inject
dentro de sus puntos de vista como este
@inject('shared','AppUtilitiesSharedWithView')
entonces puedes usarlo:
{{ $shared->functionName() }}
Y SharedWithView es una clase simple como esta:
namespace AppUtilities;
use AppRepositoriesSomeRepositoryLikeArticlesRepository;
class SharedWithView {
public function functionName() {
$properNameHere = new SomeRepositoryLikeArticlesRepository();
return $properNameHere->forEaxmpleGetMostViewedArticles( 10 );
}
}