这个目标可以通过不同的方法实现,
1.使用 BaseController
我喜欢设置的方式,我创建了一个扩展 Laravel 自己的 Controller 的 BaseController 类,并在那里设置了各种全局的东西。然后所有其他控制器都从 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 还有助于以不同的方式将特定数据绑定到视图。您可以直接将变量绑定到特定视图或所有视图。例如,您可以根据需要创建自己的目录来存储视图编写器文件。并且这些视图编写器文件通过 Service 提供与视图的交互。
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");
}
}
之后,将此提供程序添加到“提供程序”部分下的 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 Documentation
进一步澄清Laracast Episode
如果我还有什么不清楚的地方,请告诉我。