Php 具有多个变量的Laravel 5视图生成器
有没有更优雅的方式:Php 具有多个变量的Laravel 5视图生成器,php,laravel,laravel-5,Php,Laravel,Laravel 5,有没有更优雅的方式: abstract class Controller extends BaseController { use DispatchesJobs, ValidatesRequests; function __construct() { view()->composer('includes.topbar', function ($view) { $view->with('nav', $this->topNa
abstract class Controller extends BaseController
{
use DispatchesJobs, ValidatesRequests;
function __construct() {
view()->composer('includes.topbar', function ($view) {
$view->with('nav', $this->topNav());
});
view()->composer('includes.sidebar', function ($view) {
$view->with('sidebar', $this->sidebar());
});
}
...
}
?
使用视图生成器: NavigationComposer
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
class NavigationComposer
{
protected $user;
public function __construct()
{
$this->user = Auth::user();
}
public function compose(View $view)
{
$view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
public function sidebar()
{
return 'sidebar';
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
view()->composer(
'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
);
view()->composer(
'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
);
}
...
}
...
public function boot()
{
// Using class based composers...
view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
}
...
...
public function compose(View $view)
{
$view->with('nav', $this->topNav());
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
...
...
public function compose(View $view)
{
$view->with('sidebar', $this->sidebar());
}
public function sidebar()
{
return 'sidebar';
}
...
Composer服务提供商
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
class NavigationComposer
{
protected $user;
public function __construct()
{
$this->user = Auth::user();
}
public function compose(View $view)
{
$view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
public function sidebar()
{
return 'sidebar';
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
view()->composer(
'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
);
view()->composer(
'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
);
}
...
}
...
public function boot()
{
// Using class based composers...
view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
}
...
...
public function compose(View $view)
{
$view->with('nav', $this->topNav());
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
...
...
public function compose(View $view)
{
$view->with('sidebar', $this->sidebar());
}
public function sidebar()
{
return 'sidebar';
}
...
根据@Gal的建议,我已将它们一分为二 Composer服务提供商
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
class NavigationComposer
{
protected $user;
public function __construct()
{
$this->user = Auth::user();
}
public function compose(View $view)
{
$view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
public function sidebar()
{
return 'sidebar';
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
view()->composer(
'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
);
view()->composer(
'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
);
}
...
}
...
public function boot()
{
// Using class based composers...
view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
}
...
...
public function compose(View $view)
{
$view->with('nav', $this->topNav());
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
...
...
public function compose(View $view)
{
$view->with('sidebar', $this->sidebar());
}
public function sidebar()
{
return 'sidebar';
}
...
TopNavigationComposer
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
class NavigationComposer
{
protected $user;
public function __construct()
{
$this->user = Auth::user();
}
public function compose(View $view)
{
$view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
public function sidebar()
{
return 'sidebar';
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
view()->composer(
'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
);
view()->composer(
'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
);
}
...
}
...
public function boot()
{
// Using class based composers...
view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
}
...
...
public function compose(View $view)
{
$view->with('nav', $this->topNav());
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
...
...
public function compose(View $view)
{
$view->with('sidebar', $this->sidebar());
}
public function sidebar()
{
return 'sidebar';
}
...
SidebarComposer
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
class NavigationComposer
{
protected $user;
public function __construct()
{
$this->user = Auth::user();
}
public function compose(View $view)
{
$view->with(['nav' => $this->topNav(), 'sidebar' => $this->sidebar()]);
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
public function sidebar()
{
return 'sidebar';
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
view()->composer(
'includes.topbar', 'App\Http\ViewComposers\NavigationComposer'
);
view()->composer(
'includes.sidebar', 'App\Http\ViewComposers\NavigationComposer'
);
}
...
}
...
public function boot()
{
// Using class based composers...
view()->composer('includes.topbar', 'App\Http\ViewComposers\TopNavigationComposer');
view()->composer('includes.sidebar', 'App\Http\ViewComposers\SidebarComposer');
}
...
...
public function compose(View $view)
{
$view->with('nav', $this->topNav());
}
public function topNav()
{
$nav['Dashboard'] = [
'route' => 'dashboard'
];
$nav['Sales'] = [
'route' => 'sales',
'subitems' => [
'Enquiries' => 'sales.enquiries',
'Quotes' => 'sales.quotes',
'Orders' => 'sales.orders'
]
];
$nav['CRM'] = [
'route' => 'crm',
'subitems' => [
'Companies' => 'crm.companies',
'Conversion report' => 'crm.conversion-report'
]
];
return $nav;
}
...
...
public function compose(View $view)
{
$view->with('sidebar', $this->sidebar());
}
public function sidebar()
{
return 'sidebar';
}
...
如果只想在主布局中访问局部视图,可以执行以下操作 在主布局中,为局部视图创建剖面:
@section('partial_view_1')
@show
@section('partial_view_2')
@show
在控制器的构造函数中,执行此操作时,请确保声明$layout
$this -> layout = view('layouts.master');
$this -> layout -> partial_view_1 = view('includes.top_nav');
// -> with($data); if you want to pass data to the top nav.
$this -> layout -> partial_view_2 = view('includes.side_nav');
public function index(){
$this -> layout -> main_content = view('contents.main');
return $this -> layout;
}
现在,如果希望在调用视图时将数据绑定到视图,则可能需要使用视图生成器
。
希望这有帮助 试试这个。这是我的工作。
您可以在view composer函数中使用multiple with chain来检索变量
//For all views
\View::composer('*', function($views){
$views->with('users', App\User::all())
->with('roles', App\Role::all())
->with('publishers', Publisher::all());
});
有关更多信息:您所做的一切都没有问题。您正在将不同的变量绑定到不同的视图。我不会将view composer放在一个控制器中,而是创建一个服务提供程序,以便在您似乎将所有“全局”内容都放在主控制器中的那一刻使其更有条理。@Gal我已经这样做了,它正在工作,但我不确定boot()服务提供者中的节。我真的需要将同一个东西绑定到两个视图上两次吗?@imperium2335我不这么认为,这就是为什么我还要将
NavigationComposer
文件一分为二,一个用于topbar,一个用于侧栏,正如您发送到topbar
查看sidebar
变量和sidebar
查看nav
变量时一样。我不知道您的函数做了什么,但您可能会做一些事情两次。@Gal我有一些函数根据用户角色在其中生成导航,有关NavigationComposer的完整版本,请参见我的编辑