php - formato - twig document
¿Cómo compartir una variable en todas las vistas? (2)
Para personas con proyectos pequeños:
En primer lugar, ¡la respuesta aceptada es asombrosa!
Para usuarios de Laravel 5.2:
Simplemente use la nueva directiva de cuchilla @inject
dentro de sus puntos de vista como este
@inject(''shared'',''App/Utilities/SharedWithView'')
entonces puedes usarlo: {{ $shared->functionName() }}
Y SharedWithView es una clase simple como esta:
namespace App/Utilities;
use App/Repositories/SomeRepositoryLikeArticlesRepository;
class SharedWithView {
public function functionName() {
$properNameHere = new SomeRepositoryLikeArticlesRepository();
return $properNameHere->forEaxmpleGetMostViewedArticles( 10 );
}
}
Quiero que la información sobre la configuración regional del sistema esté disponible en todas las vistas, por lo que podría resaltar el idioma seleccionado actualmente por un usuario. Después de buscar en Google, encontré el tema de compartir valores abordado en la documentación oficial . Sin embargo, después de poner el código en el boot()
esta manera:
class AppServiceProvider extends ServiceProvider{
public function boot(){
view()->share(''locale'', /Lang::getLocale());
}
}
la variable $locale
, cuando se accede a ella en vistas, siempre contiene la configuración regional predeterminada del sistema, no la que está seleccionada actualmente . ¿Por qué?
Usualmente uso View Composers para que sea más claro y legible.
Por ejemplo, si deseo compartir una variable con la barra de navegación principal a todas mis vistas, sigo las siguientes reglas:
1. Crear un nuevo proveedor de servicios
Puede crear un proveedor de servicios con cli artesanal:
php artisan make:provider ViewComposerServiceProvider
En el archivo ViewComposerServiceProvider crea el método composeNavigation en el que tiene la plantilla de blade main.nav-menu que representa el menú de navegación con variables compartidas.
ViewComposerServiceProvider se ve así:
<?php
namespace App/Providers;
use Illuminate/Support/ServiceProvider;
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'', ''App/Http/ViewComposers/NavComposer'');
}
}
2. Crear Compositor
Como vimos en el archivo anterior, tenemos la aplicación / Http / ViewComposers / NavComposer.php, así que creemos ese archivo. Cree la carpeta ViewComposers en la aplicación / Http y luego dentro de crear el archivo NavComposer.php .
El archivo NavComposer.php :
<?php
namespace App/Http/ViewComposers;
use App/Repositories/NavMenuRepository;
use Illuminate/View/View;
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 archivo NavComposer.php tenemos repositorio. Por lo general, creo un repositorio en el directorio de la aplicación , así que crea el directorio Repositories en la aplicación y luego, crea dentro del archivo NavMenuRepository.php .
Este archivo es el corazón de ese patrón de diseño. En ese archivo debemos tomar el valor de nuestras variables que queremos compartir con todos nuestros puntos de vista.
Echa un vistazo al archivo de abajo:
<?php
namespace App/Repositories;
use App/Thing;
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;
}
}