app\Providers\AppServiceProvider.php 파일의 AppServiceProvider클래스에서 boot()함수 View::share()를 통해서 blade템플릿에서 전역으로 사용 가능한 값들을 등록 가능하다.
그래서 아래처럼 boot()함수에 Auth::user()를 등록해놓고 user관련 값을 전역으로 쓰려고 했더니.. 안된다..
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Auth;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
}
public function boot()
{
View::share('user', Auth::user()->toArray());
View::share('login_chk', Auth::check());
}
}
해당 오브젝트가 없다는 에러가 뜰 뿐이다.
찾아보니, laravel에서 세션 요청은 미들웨어보다 먼저 실행되기 때문에, 아래처럼 콜백을 사용한뒤 쓰면 제대로 값을 가져 올 수 있다고 한다.
참고 링크
https://stackoverflow.com/questions/37372357/laravel-how-to-get-current-user-in-appserviceprovider
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Auth;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
}
public function boot()
{
view()->composer('*', function ($view){
// 세션이 만료 됐을 경우 Auth::user()가 없기때문에 toArray()를 쓸때 오류가 생긴다
if( Auth::user() ){
View::share('user', Auth::user()->toArray());
View::share('login_chk', Auth::check());
}
});
}
}
위처럼 작성후에는 어떤 blade파일에서든
{{ $user['id'] }} 방식으로 사용이 가능하다.
//----------- 추가 2019.03.15
어디서든 사용할 config를 만들고 싶을때는, 위의 boot()함수에 아래와 같이 설정하면 된다.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
if( Schema::hasTable('settings_table') ){
$rlt = DB::table('settings_table')->get()->toArray();
$settings = array();
foreach( $rlt as $tv ){
$settings[$tv->type][$tv->option] = $tv->explain;
}
config(['settings' => $settings]);
}
}
}
boot()함수에서 settings_table에 있는 setting내용들을 config에 등록해놓으면, model이나 controller에서
$settings = config("settings");
위와 같은 방식으로 바로 사용 가능하다.
Schema파사드(facade)로 해당 테이블이 존재하는지 체크해주지 않으면, 마이그레이션을 할때 오류가 뜨니 알아두기 바란다.