Natjeraj se da prosljedjuješ varijable u view template.
Može se i varijabla proslijediti a da sadrži klasu objekt.
Recimo da ovako nije neobično proslijediti iz kontrolera:
use new App\Services\CustomClass;
...
...
...
$customName = new CustomClass();
return view('home', compact('customName'));
a onda u view-u koristiš sa
{{ $customName->method() }}
Naravno u ovom primjeru se očekuje da ova metoda vraća nešto što može da prodje kroz echo
od blade-a tj da je string, int…
Ako bi bio slučaj da se treba raditi neka veća logika u metodi, to ipak ne bi trebalo raditi na nivou
view-a/template-a. Bar je moje mišljenje da u view ne ide ništa puno više od foreach-a i slično - držim se pravila šta je dostupno u Smarty-ju, ne treba preko toga ići. Odnosno prosta manipulacija sa varijablama proslijedjenim iz kontrolera.
E sad, ako imaš potrebu za odredjenom varijablom u sve i jednom blade template-u to se može proslijediti kroz boot metod service provider-a:
Recimo imaš klasu:
<?php
namespace App\Services;
class CustomClass
{
public function __construct()
{
//
}
/**
* @param int $a
* @param int $b
* @return int
*/
public static function add(int $a = 1, int $b = 2): int
{
return $a + $b;
}
}
Možeš da uvrstiš varijablu dostupnu u sve i jednom view-u kroz AppServiceProvider:
<?php
namespace App\Providers;
use App\Services\CustomClass;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
View::share('customName', (new CustomClass()));
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
tako da je možeš koristiti poput
@extends('layouts.app')
@section('content')
<div class="container">
<!-- Application Dashboard -->
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Adding</div>
<div class="panel-body">
<!--Object passed from AppServiceProvider-->
{{ $customName->add() }}
</div>
</div>
</div>
</div>
</div>
@endsection
Na ovaj će način (View::share('key', 'value')
) value
biti dostupan u sve i jednom view-u.
Ako želiš da ograničiš to na samo neke template-e, možeš da kreiraš custom ViewComposer i odrediš gdje da je dostupan.
Sharing.
View Composers.
Ako ti treba više od toga, onda bi trebalo da prodješ kroz Service Container i Service Providers
Primjer bi bio:
<?php
namespace App\Providers;
use App\Services\CustomClass;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// $this->app->singleton('customName', function () {
// return new CustomClass();
// });
$this->app->bind('customName', CustomClass::class);
}
}
K’o što vidiš, možeš vezati closure funkciju ili klasu za ime koje dodijeliš.
Onda bilo gdje na nivou aplikacije možeš da pozoveš app helper
app()['customName']
// ili
app('customName')
Vidi u dokumentaciji razliku izmedju singleton i bind metoda. Ovde isto imaš pojašnjenje.
Opet naglašavam da recimo iz sigurnosnih razloga dobre prakse (nije tol’ko nesigurno kol’ko treba steći naviku) u blade view ne treba prosljedjivati ništa osim potrebnih varijabli i to iz controller-a (pogotovo app helper imho), tako da bi primjer s početka mog’o izgledati
// controller method
$customClass = app('customName');
return view('home', compact('customName'));
Isto, resolving klasa na ovaj način nije uobičajen za klase koje nemaju dependencies.
Ja bi’ se drž’o prvog primjera iz svog posta.
Vidi i za kreiranje sopstvenog Service Provider-a i Facade/alias-a.