Rag*_*son 111 php laravel laravel-5
我想在Laravel 5应用程序的所有视图中都可以访问一些默认数据.
我试图搜索它,但只找到Laravel 4的结果.我在这里阅读了文档"与所有视图共享数据" ,但我无法理解该怎么做.下面的代码应该放在哪里?
View::share('data', [1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
Saf*_*dar 192
这个目标可以通过不同的方法实现,
1.使用BaseController
我喜欢设置的方式,我创建了一个BaseController扩展Laravel自己的课程Controller,并在那里设置了各种全球性的东西.然后所有其他控制器都从BaseControllerLaravel的Controller 扩展而来.
class BaseController extends Controller
{
public function __construct()
{
//its just a dummy data object.
$user = User::all();
// Sharing is caring
View::share('user', $user);
}
}
Run Code Online (Sandbox Code Playgroud)
2.使用过滤器
如果您知道在整个应用程序中为每个请求设置了视图的事实,您也可以通过在请求之前运行的过滤器来实现 - 这就是我在Laravel中处理User对象的方式.
App::before(function($request)
{
// Set up global user object for views
View::share('user', User::all());
});
Run Code Online (Sandbox Code Playgroud)
要么
您可以定义自己的过滤器
Route::filter('user-filter', function() {
View::share('user', User::all());
});
Run Code Online (Sandbox Code Playgroud)
并通过简单的过滤器调用来调用它.
根据版本5更新.*
3.使用中间件
使用View::sharewithmiddleware
Route::group(['middleware' => 'SomeMiddleware'], function(){
// routes
});
class SomeMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
Run Code Online (Sandbox Code Playgroud)
4.使用View Composer
View Composer还有助于以不同方式绑定特定数据以进行查看.您可以直接将变量绑定到特定视图或所有视图.例如,您可以根据需要创建自己的目录来存储视图编辑器文件.而这些视图通过Service提供的composer文件提供了与视图的交互.
查看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");
}
}
Run Code Online (Sandbox Code Playgroud)
之后,将此提供程序添加到"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");
}
}
Run Code Online (Sandbox Code Playgroud)
ViewName.blade.php
Here you are... {{$ViewComposerTestVariable}}
Run Code Online (Sandbox Code Playgroud)
此方法仅对特定View有所帮助.但是如果您希望将ViewComposer触发到所有视图,我们必须将此单个更改应用于ServiceProvider.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
}
}
Run Code Online (Sandbox Code Playgroud)
参考
进一步澄清Laracast插曲
如果我身边还有不清楚的地方,请告诉我.
Mar*_*lln 60
您可以创建自己的服务提供商(ViewServiceProvider名称很常见),也可以使用现有服务提供商AppServiceProvider.
在您选择的提供程序中,将您的代码放在引导方法中.
public function boot() {
view()->share('data', [1, 2, 3]);
}
Run Code Online (Sandbox Code Playgroud)
这将使$data您的所有视图中都可以访问变量.
如果您更愿意使用Facade而不是帮助程序,请更改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()
{
//
}
}
Run Code Online (Sandbox Code Playgroud)
最好的方法是使用 View::share('var', $value);
使用撰写问题"*":
考虑以下方法:
<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);
$viewFacrory->compose('*', GlobalComposer::class);
Run Code Online (Sandbox Code Playgroud)
从示例刀片视图:
@for($i = 0; $i<1000; $i++)
@include('some_partial_view_to_display_i', ['toDisplay' => $i])
@endfor
Run Code Online (Sandbox Code Playgroud)
怎么了?
GlobalComposer类实例化1000采用倍
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());
}
}
Run Code Online (Sandbox Code Playgroud)
更新资料
如果您使用的是通过中间件管道计算的内容,则可以简单地侦听适当的事件,或者将视图共享中间件放在管道的最后。
小智 5
您有两个选择:
\n1. 通过 \xe2\x80\x8dBoot函数分享App\\Providers\\AppServiceProvider:
public function boot()\n{\n view()->share('key', 'value');\n}\nRun Code Online (Sandbox Code Playgroud)\n并访问$key任何视图文件中的变量。
Note:请记住,您无法在此处访问当前Session, Auth,Route数据。仅当您想共享静态数据时,此选项才适用。假设您想要基于当前用户、路线或任何自定义会话变量共享一些数据,您将无法执行此操作。
2.辅助类的使用:
\n在应用程序中的任何位置创建一个辅助类,并将其注册到文件夹app.php中文件的Alias 数组中config。
'aliases' => [ \n ...,\n 'Helper' => App\\HelperClass\\Helper::class,\n ],\nRun Code Online (Sandbox Code Playgroud)\nHelper.php并在 App 文件夹内的 HelperClass 文件夹中创建:
namespace App\\HelperClass;\n \nclass Helper\n{\n public static function Sample()\n {\n //Your Code Here\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n并在任何地方访问它,例如Helper::Sample().
您不会restricted在这里使用Auth、Route、Session或任何其他类。
| 归档时间: |
|
| 查看次数: |
88552 次 |
| 最近记录: |