ProgramingTip

Laravel 5- 모든 템플릿에서 사용 가능한 전역 블레이드 뷰 변수

bestdevel 2020. 12. 29. 07:41
반응형

Laravel 5- 모든 템플릿에서 사용 가능한 전역 블레이드 뷰 변수


Laravel 5에서 모든 블레이드 템플릿에서 사용할 수있는 전역 변수를 어떻게 만들 수 있습니까?


옵션 1 :

다음 view::share()과 같이 사용할 수 있습니다 .

<?php namespace App\Http\Controllers;

use View;

//You can create a BaseController:

class BaseController extends Controller {

    public $variable1 = "I am Data";

    public function __construct() {

       $variable2 = "I am Data 2";


       View::share ( 'variable1', $this->variable1 );
       View::share ( 'variable2', $variable2 );
       View::share ( 'variable3', 'I am Data 3' );
       View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
    }  

}

class HomeController extends BaseController {

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:

    public function __construct(){
       parent::__construct();
    }

    public function Index(){
      //All variable will be available in views
      return view('home');
    }

}

옵션 2 : 작곡가 사용 :

  1. 다음 위치에서 작곡가 파일 만들기 app\Composers\HomeComposer.php

주의 : app\Composers존재하지 않는 경우 생성

<?php namespace App\Composers;

class HomeComposer
{

    public function compose($view)
    {
        //Add your variables
        $view->with('variable1',      'I am Data')
             ->with('variable2',      'I am Data 2');
    }
}

그런 다음이 작업을 수행하여 임의의 뷰에 작곡가를 첨부 할 수 있습니다.

<?php namespace App\Http\Controllers;

use View;

class HomeController extends Controller{


    public function __construct(){

        View::composers([
            'App\Composers\HomeComposer'  => ['home'] //attaches HomeComposer to home.blade.php
        ]);

    }

    public function Index(){
        return view('home');
    }

}

여기에 제안 된대로 새 서비스 제공 업체를 만듭니다.

구성 파일 (config / app.php)에 새 서비스 공급자를 추가합니다.

새 서비스 공급자의 부팅 방법에서 다음을 사용합니다.

View::share( 'something_cool', 'this is a cool shared variable' );

이제 모든 뷰에서 $ something_cool을 사용할 준비가되었습니다.

도움이 되셨기를 바랍니다.


같은 문제의 해결을 찾고 Laravel 문서에서 해결책을 찾았습니다. 그냥 사용 View::share에서이 AppServiceProvider같은 :

View::share('key', 'value');

자세한 내용은 여기 .


뷰 컴포저 로이 작업을 수행 할 수 있습니다 . View Composers는 템플릿이로드 될 때 실행됩니다. 해당보기에 대한 추가 기능이있는 클로저를 사용할 수 있습니다. 보기 작성기를 사용하면 와일드 카드를 사용할 수 있습니다. 모든 뷰에 대한 뷰 작성기를 만들려면 *.

View::composer('*', function($view)
{
    $view->with('variable','Test value');
});

문서에서 볼 수 있습니다. 클로저 없이이 작업을 수행 할 수도 있습니다.

View::composer('*', 'App\Http\ViewComposers\ProfileComposer');

프로필 작성기 클래스에는 작성 방법이 있어야합니다.

뷰 작성기는 뷰가 될 때 실행됩니다. 라 라벨에는 뷰 크리에이터도 있습니다. 뷰가 인스턴스화 될 때 실행됩니다.

BaseControllersetupLayout 메서드와 함께 를 사용하도록 선택할 수도 있습니다 . 그런 다음로드 할 모든 뷰는 몇 가지 추가 데이터를 추가하는 setupLayout 메서드를 통해로드됩니다. 그러나 뷰 컴포저를 사용하면 코드가 실행된다는 것을 확신 할 수 있습니다. 그러나 BaseController 접근 방식을 사용하면 추가 데이터로드를 건너 뛸 수 있으므로 더 많은 유연성을 얻을 수 있습니다.

편집 : Nic Gutierrez가 언급했듯이 뷰 공유를 사용할 수도 있습니다.


또한 Route.php파일 에서이 작업을 수행 할 수 있습니다 .

view()->share('variableName', $variable);

그리고 당신은 배열을 줄 View::share('key', 'value'); 수 있습니다.View::share(['key'=>'value','key'=>'value'])


차라리 view()파사드 도우미 와 함께 미들웨어를 사용하고 싶습니다 . (라 라벨 5.x)

미들웨어는 관리하기 쉽고 컨트롤러 클래스 트리를 엉망으로 만들지 않습니다.

단계

미들웨어 생성

/app/Http/Middleware/TimezoneReset.php

미들웨어를 만들려면 다음을 실행할 수 있습니다. php artisan make:middleware GlobalTimeConfig

share() 공유해야하는 데이터

 <?php

    namespace App\Http\Middleware;

    use Closure;

    class GlobalTimeConfig
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $time_settings = [
                'company_timezone' => 'UTC',
                'company_date_format' => 'Y-m-d H:i:s',
                'display_time' => true,
            ];

            view()->share('time_settings', $time_settings);

            return $next($request);
        }
    }

새로 생성 된 미들웨어 등록

아래 예제에 따라 미들웨어 경로 그룹에 미들웨어를 추가하십시오.

/app/Http/Kernel.php

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\GlobalTimeConfig::class,
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

템플릿에서 데이터에 액세스

View :: share () 메서드 호출에서 주어진 키를 사용하여 템플릿의 데이터에 액세스합니다.

예 :

    Company timezone: {{ $time_settings['company_timezone'] }}

편집 : Nic Gutierrez의 서비스 공급자 답변이 더 나은 (또는 최상의) 솔루션 일 수 있습니다.


Controller.php파일에 추가 할 수 있습니다 .

use App\Category;

그리고:

class Controller extends BaseController {
     public function __construct() {
        $categories = Category::All();
        \View::share('categories', $categories);
     }
}

세션으로 플래시 할 수 있고 .env 파일 (정적 변수)에서 정의 할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates

반응형