我确实拥有当前状态,即我的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中获取活动项目(如此处的仪表板上所示)。这不是我要找的。 p>
public function index(Project $project)
{
return view('project.dashboard.index',[
'project' => $project
]);
}
我要找的是将$ project对象(包括所有信息)包含到layouts.project中,其中包括元标题和头标题信息,以及显示项目名称本身。
答案 0 :(得分:1)
编辑3:另一件事是你想在父视图中设置数据。即使扩展父级并将数据从控制器传递到子视图,也可以执行此操作。希望我已经为你澄清了聊天内容。
编辑2:您想在视图中自动加载对象。您可以通过创建视图编辑器并读取当前路径来完成此操作。如果路径匹配,则提取项目ID并加载项目模型。然后,您可以在视图中访问项目对象,而无需通过控制器传递它。虽然与通过控制器传递对象相比,这是太多的工作和不好的做法。
编辑:在完成所有评论和聊天后,我了解您正在尝试做什么。
这将使用路由模型绑定为您提供Project对象,同时忽略不需要的SEO字符串。这也适用于这两种情况。
http://app.com/project/7-exampleproject/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的变化比视图名称更频繁。