2017-05-18 50 views
0

我确实有我的Laravel应用程序(存储在数据库中)中有多个项目的当前状态。我有以下URL结构: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\D[email protected] | web 

GET|HEAD | project/{project}{extra?}/news | project.news.index | App\Http\Controllers\Project\[email protected] | web 

GET|HEAD | project/{project}{extra?}/tournaments | project.tournaments.index | App\Http\Controllers\Project\[email protected] | web 


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

});

在我的每一个app.layouts.project得到由每个内容扩展这些观点,所以我们最终得到:

​​

但我想达到的目标是,每次/项目/ (项目)被调用,视图layouts.project应该得到它的活跃ID和$项目变量

==

我怎么想的数据可用:

在我的C ase,每个模块当前都从URL中获取活动项目(如此处在仪表板中所示),这已经来自URL。这不是我正在寻找的。

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

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

回答

1

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

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

编辑:在所有的评论和聊天后,我明白你想要做什么。

这会给你使用路由模型绑定的Project对象,而忽略不需要的SEO字符串。这也适用于这两种情况。

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

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

替换您的RouteServiceProvider

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

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

boot你的路线更改为

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

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

Route::get('/project/{project}/{module}', '[email protected]'); 

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

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

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

感谢您的快速答案。目前,我在NewsController @ show中为每个模块提供了自己的函数(例如$ module ='news')。我可以以某种方式在你的上层函数中调用这些函数吗? – Astinox

+0

你可以运行'php工匠路线:列表'并发布结果。是的,你可以在任何控制器中使用这个逻辑来提取该路径,并且不会有任何问题。 – Sandeesh

+0

将它作为上面的答案发布。 – Astinox

1

我认为你正在寻找ViewComposers,它不是基于url,而是基于视图名称。 我个人认为这比基于URL的方法更好,因为URL比视图名称更频繁地更改。

+0

这听起来像是我正在寻找的东西。在文档中我可以看到我可以使用通配符,我是否也可以使用带有视图名称的通配符?在我目前的结构中,这将包括项目。* - >如果可能的话,自动扩展layouts.project视图。另外,我怎么能够包含我目前的ID? – Astinox

+0

我用它是这样的:$ this-> app-> make('view') - > composer('*。dashboard','App \ Http \ ViewComposers \ DashIcons'); 这对我来说非常适合! –

+0

在这种情况下,我仍然没有活动项目的ID或对象,或者我可以从请求中获取ID吗? – Astinox