[php] Laravel 5의 모든 뷰에 데이터를 전달하는 방법은 무엇입니까?

Laravel 5 애플리케이션의 모든 뷰에서 일부 기본 데이터에 액세스하고 싶습니다.

검색을 시도했지만 Laravel 4에 대한 결과 만 찾습니다. 여기에서 ‘모든 뷰와 데이터 공유’문서를 읽었 지만 어떻게해야할지 이해할 수 없습니다. 다음 코드는 어디에 배치해야합니까?

View::share('data', [1, 2, 3]);

당신의 도움을 주셔서 감사합니다.



답변

이 목표는 다른 방법을 통해 달성 할 수 있습니다.

1. BaseController 사용

내가 설정하는 방식 BaseController은 라 라벨 자체를 확장 하는 클래스를 만들고 Controller거기에 다양한 글로벌 사물을 설정합니다. 다른 모든 컨트롤러 BaseController는 Laravel의 컨트롤러 가 아닌 확장됩니다 .

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();

    // Sharing is caring
    View::share('user', $user);
  }
}

2. 필터 사용

전체 애플리케이션의 모든 요청에 ​​대한 뷰에 대해 무언가를 설정하려는 사실을 알고 있다면 요청 전에 실행되는 필터를 통해 수행 할 수도 있습니다. 이것이 제가 Laravel에서 User 객체를 처리하는 방법입니다.

App::before(function($request)
{
  // Set up global user object for views
  View::share('user', User::all());
});

또는

자신 만의 필터를 정의 할 수 있습니다.

Route::filter('user-filter', function() {
    View::share('user', User::all());
});

간단한 필터 호출을 통해 호출합니다.

버전 5. *에 따라 업데이트

3. 미들웨어 사용

View::share와 함께 사용middleware

Route::group(['middleware' => 'SomeMiddleware'], function(){
  // routes
});



class SomeMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

4. View Composer 사용

View Composer는 특정 데이터를 다른 방식으로보기에 바인딩하는데도 ​​도움이됩니다. 변수를 특정보기 또는 모든보기에 직접 바인딩 할 수 있습니다. 예를 들어 요구 사항에 따라보기 작성기 파일을 저장할 고유 한 디렉터리를 만들 수 있습니다. 이러한 View Composer 파일은 서비스를 통해보기와 상호 작용을 제공합니다.

View composer 메서드는 다른 방식으로 사용할 수 있습니다. 첫 번째 예제는 다음과 유사합니다.

App\Http\ViewComposers디렉토리를 만들 수 있습니다 .

서비스 제공자

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
    }
}

그런 다음 “providers”섹션에서 config / app.php에이 공급자를 추가합니다.

TestViewComposer

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class TestViewComposer {

    public function compose(View $view) {
        $view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
    }
}

ViewName.blade.php

Here you are... {{$ViewComposerTestVariable}}

이 방법은 특정보기에만 도움이 될 수 있습니다. 그러나 모든 뷰에 ViewComposer를 트리거하려면이 단일 변경 사항을 ServiceProvider에 적용해야합니다.

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
    }
}

참고

Laravel 문서

추가 설명을 위해 Laracast 에피소드

내 편에서 여전히 불분명 한 것이 있으면 알려주십시오.


답변

고유 한 서비스 제공 업체 를 만들거나 ( ViewServiceProvider이름이 일반적 임) 기존 AppServiceProvider.

선택한 공급자에서 부팅 방법에 코드를 입력합니다.

public function boot() {
    view()->share('data', [1, 2, 3]);
}

이렇게하면 $data모든 뷰에서 변수에 액세스 할 수 있습니다.

당신은 오히려 외관 대신 도우미, 변경 사용하려는 경우 view()->에을 View::하지만이하는 것을 잊지 마세요 use View;파일의 상단에.


답변

나는 이것이 가장 쉬운 것임을 알았다. 새 공급자를 만들고 '*'와일드 카드를 사용하여 모든보기에 연결합니다. 5.3에서도 작동합니다 🙂

<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     * @return void
     */
    public function boot()
    {
        view()->composer('*', function ($view)
        {
            $user = request()->user();

            $view->with('user', $user);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}


답변

가장 좋은 방법은 다음을 사용하여 변수를 공유하는 것입니다. View::share('var', $value);

다음을 사용하여 작성하는 데 문제가 있습니다 "*".

다음 접근 방식을 고려하십시오.

<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);

$viewFacrory->compose('*', GlobalComposer::class);

예제 블레이드보기에서 :

  @for($i = 0; $i<1000; $i++)
    @include('some_partial_view_to_display_i', ['toDisplay' => $i])
  @endfor

무슨 일이야?

  • GlobalComposer클래스의 인스턴스가 1,000 사용 시간을
    App::make.
  • 이벤트 composing:some_partial_view_to_display_i1000 번 처리
    됩니다.
  • 클래스 compose내부 의 함수 GlobalComposer는 1000 번 호출됩니다.

그러나 부분보기 some_partial_view_to_display_i는로 구성된 변수와 관련이 GlobalComposer없지만 렌더링 시간이 크게 늘어납니다.

최선의 접근 방식?

View::share그룹화 된 미들웨어와 함께 사용 .

Route::group(['middleware' => 'WebMiddleware'], function(){
  // Web routes
});

Route::group(['prefix' => 'api'], function (){

});

class WebMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

최신 정보

미들웨어 파이프 라인을 통해 계산되는 것을 사용 하는 경우 적절한 이벤트수신 하거나 파이프 라인의 마지막 하단에 뷰 공유 미들웨어를 배치 할 수 있습니다.


답변

문서에서 :

일반적으로 서비스 공급자의 부팅 메서드 내에서 공유 메서드를 호출합니다. AppServiceProvider에 추가하거나이를 수용 할 별도의 서비스 공급자를 생성 할 수 있습니다.

Marwelln에 동의 AppServiceProvider합니다. 부팅 기능에 넣습니다 .

public function boot() {
    View::share('youVarName', [1, 2, 3]);
}

다른 ‘전역’변수가없는 혼동이나 실수를 피하기 위해 변수에 특정 이름을 사용하는 것이 좋습니다.


답변

문서는 https://laravel.com/docs/5.4/views#view-composers를 듣지만 분해하겠습니다.

  1. 디렉토리를 찾아 응용 프로그램 \ 공급자 응용 프로그램의 루트 디렉토리 및 파일 생성 ComposerServiceProvider.php을 복사하고 그것에과 저장 아래의 텍스트 과거.

    <?php
        namespace App\Providers;
        use Illuminate\Support\Facades\View;
        use Illuminate\Support\ServiceProvider;
    
        class ComposerServiceProvider extends ServiceProvider
        {
            /**
            * Register bindings in the container.
            *
            * @return void
            */
        public function boot()
        {
            // Using class based composers...
            View::composer(
                'profile', 'App\Http\ViewComposers\ProfileComposer'
            );
    
            // Using Closure based composers...
            View::composer('dashboard', function ($view) {
                //
            });
        }
    
        /**
        * Register the service provider.
        *
        * @return void
        */
        public function register()
        {
            //
        }
    }
  2. 애플리케이션의 루트에서 Config / app.php를 열고 파일에서 Providers 섹션을 찾은 다음이 ‘App \ Providers \ ComposerServiceProvider’를 복사 하여 배열에 붙여 넣습니다 .

이를 통해 Composer 서비스 공급자를 만들었습니다. http : // yourdomain / something / profile 과 같이 프로필보기를 사용하여 애플리케이션을 실행 하면 서비스 공급자 ComposerServiceProvider 가 호출되고 App \ Http \ ViewComposers \ ProfileComposer 클래스가 아래 코드로 인해 Composer 메서드를 호출하여 인스턴스화됩니다. 부팅 방법 또는 기능.

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. 응용 프로그램을 새로 고치면 App \ Http \ ViewComposers \ ProfileComposer 클래스 가 아직 존재하지 않기 때문에 오류가 발생 합니다. 이제 만들어 보겠습니다.

디렉토리 경로 app / Http로 이동하십시오.

  • ViewComposers 라는 디렉터리를 만듭니다.

  • ProfileComposer.php 파일을 만듭니다 .

    class ProfileComposer
    {
        /**
        * The user repository implementation.
        *
        * @var UserRepository
        */
        protected $users;
    
        /**
        * Create a new profile composer.
        *
        * @param  UserRepository  $users
        * @return void
        */
        public function __construct(UserRepository $users)
        {
            // Dependencies automatically resolved by service container...
            $this->users = $users;
        }
    
        /**
        * Bind data to the view.
        *
        * @param  View  $view
        * @return void
        */
        public function compose(View $view)
        {
            $view->with('count', $this->users->count());
        }
    }

이제보기 또는이 경우 Profile.blade.php로 이동하여

{{ $count }}

프로필 페이지의 사용자 수가 표시됩니다.

모든 페이지 변경 횟수를 표시하려면

// Using class based composers...
View::composer(
    'profile', 'App\Http\ViewComposers\ProfileComposer'
);

// Using class based composers...
View::composer(
    '*', 'App\Http\ViewComposers\ProfileComposer'
);


답변

가장 좋은 방법은 View Composers. 누군가 여기에 와서 View Composers 방식으로 어떻게 할 수 있는지 알고 싶다면 내 대답 => 모든 뷰에서 변수를 공유하는 방법을 읽으십시오 .