2017-05-18 63 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