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");
}
}
참고
추가 설명을 위해 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_i
는 1000 번 처리
됩니다. - 클래스
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를 듣지만 분해하겠습니다.
-
디렉토리를 찾아 응용 프로그램 \ 공급자 응용 프로그램의 루트 디렉토리 및 파일 생성 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() { // } }
-
애플리케이션의 루트에서 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'
);
- 응용 프로그램을 새로 고치면 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 방식으로 어떻게 할 수 있는지 알고 싶다면 내 대답 => 모든 뷰에서 변수를 공유하는 방법을 읽으십시오 .