Laravel:如何与父视图共享变量

时间:2017-05-18 15:49:15

标签: php laravel

我确实拥有当前状态,即我的Laravel应用程序中有多个项目(存储在数据库中)。我有以下网址结构:

http://app.com/project/7-exampleproject/news

,其中

https://app.com/project/ {ID} - {seostring} / {模块}

这背后有什么想法。我需要的是项目变量应该在{id}部分之后的任何视图(模块)上可用。我怎样才能实现它?

==

其他信息

这是路线列表:

GET|HEAD | project/{project}{extra?} | project.dashboard.index | App\Http\Controllers\Project\DashboardController@index | web

GET|HEAD | project/{project}{extra?}/news | project.news.index | App\Http\Controllers\Project\NewsController@index | web

GET|HEAD | project/{project}{extra?}/tournaments | project.tournaments.index | App\Http\Controllers\Project\TournamentController@index | web


Route::group(['prefix' => 'project', 'namespace' => 'Project'], function(){
Route::get('/{project}{extra?}', 'DashboardController@index')->name('project.dashboard.index')->where(['id', '[0-9+]','extra' => '-[A-Za-z0-9]+']);
Route::get('/{project}{extra?}/news', 'NewsController@index')->name('project.news.index')->where(['id', '[0-9+]','extra' => '-[A-Za-z0-9]+']);
Route::get('/{project}{extra?}/tournaments', 'TournamentController@index')->name('project.tournaments.index')->where(['id', '[0-9+]','extra' => '-[A-Za-z0-9]+']);

});

在每个视图中,我的app.layouts.project都会被每个视图的内容扩展,所以我们最终得到:

@extends('layouts.project')

@section('content')
<h3>Welcome to <br>{{ $project->name }}!</h3>
@endsection

但我想要实现的是,每次调用/ project / {project}时,视图layouts.project都应该获得它的活动ID和$ project变量

==

我希望数据如何可用:

在我的情况下,每个模块当前都从URL中获取活动项目(如此处的仪表板上所示)。这不是我要找的。

public function index(Project $project)
{
    return view('project.dashboard.index',[
        'project' => $project
    ]);
}

我要找的是将$ project对象(包括所有信息)包含到layouts.project中,其中包括元标题和头标题信息,以及显示项目名称本身。

2 个答案:

答案 0 :(得分:1)

编辑3:另一件事是你想在父视图中设置数据。即使扩展父级并将数据从控制器传递到子视图,也可以执行此操作。希望我已经为你澄清了聊天内容。

编辑2:您想在视图中自动加载对象。您可以通过创建视图编辑器并读取当前路径来完成此操作。如果路径匹配,则提取项目ID并加载项目模型。然后,您可以在视图中访问项目对象,而无需通过控制器传递它。虽然与通过控制器传递对象相比,这是太多的工作和不好的做法。

编辑:在完成所有评论和聊天后,我了解您正在尝试做什么。

这将使用路由模型绑定为您提供Project对象,同时忽略不需要的SEO字符串。这也适用于这两种情况。

http://app.com/project/7-exampleproject/news

http://app.com/project/7/news

替换boot

中的RouteServiceProvider
// app/Providers/RouteServiceProvider.php
public function boot()
{
    parent::boot();

    Route::bind('project', function ($value) {
        $id = explode('-', $value)[0];
        return \App\Project::findOrFail($id);
    });
}

将路线更改为

// routes/web.php
Route::group(['prefix' => 'project', 'namespace' => 'Project'], function () {
    Route::get('/{project}', 'DashboardController@index')->name('project.dashboard.index');
    Route::get('/{project}/news', 'NewsController@index')->name('project.news.index');
    Route::get('/{project}/tournaments', 'TournamentController@index')->name('project.tournaments.index');
});

路径必须作为单个参数传递,您可以将其拆分到控制器中以分别获取ID和seotring。这样的事情。

Route::get('/project/{project}/{module}', 'SomeController@show');

public function show($project, $module)
{
    $data = explode('-', $project, 2);

    $id = $data[0];
    $name = $data[1];

    return view('someview')->with(compact('id', 'name'));
}

答案 1 :(得分:1)

我认为您正在寻找ViewComposers,它不是基于网址而是基于视图名称。 我个人认为这是一种比基于URL的更好的方法,因为URL的变化比视图名称更频繁。