2016-08-24 30 views
0

我工作的一個laravel站點,每一個頁面是由兩個部分可用的模型。我想一個辦法來抽象它會考慮多託管博客,格式{URL} .blog.com/{}類(我們可以假設的是,博客被進一步劃分爲類別,每個帖子必須屬於恰好一個類別)。Laravel - 我怎麼能有在每個控制器

目前,我有一個處理一個路由組{URL}{類別}對我來說,這是很好的,這意味着我有我的路看起來像這樣:

Route::get('/p/{post}', '[email protected]'); 
Route::get('/a/{author}', '[email protected]'); 

我的問題是,雖然,在我的控制每個單獨的方法看起來是這樣的:

function viewPost(Request $request, $url, $category, $post) 
function viewAuthor(Request $request, $url, $category, $author) 

這意味着我需要的一切傳遞到我看來,像這樣:

return view('posts/viewSingle', [ 
    'title' => $post->title, 
    'url' => $url, 
    'category' => $category, 
    'post' => $post 
]); 

我看到有很多重複的代碼在這裏,這將是巨大的,如果我能以某種方式來自我的每一個控制器方法去除網址類別,仍然可以訪問它(我想我可以在我的應用程序中使用Auth)。

的問題是,這是我在使用PHP框架的第一次嘗試,我沒有真正離開的最佳實踐。根據我的閱讀,我認爲我需要兩個服務提供商,但我不知道如何設置它們。

我想我的問題還在於,複雜的,我需要按順序訪問Request對象,以確定哪些網址什麼我需要從數據庫中獲取。

+0

您可以創建一個通用的服務文件,然後從任何控制器 –

回答

2

您正在尋找的功能被稱爲view composer

// Using a Closure based composer 
View::composer(['viewPost', 'viewAuthor'], function ($view) { 
    $post = Post::find(app('request')->get('post_id')); 

    $view->with('post', $post) 
     ->with('category', $post->category); 
}); 

作曲家的第一個參數是一個視圖名,視圖名稱的陣列,或者用於'*'所有視圖。

您可以在服務提供商註冊視圖作曲家。

+1

Upvoted調用。 @Garion,如果您需要在視圖之間共享邏輯,請使用它。如果您確實需要不同控制器中的相同內容,請編輯該問題,並且有人可以幫助您編寫自定義服務提供者。 –

+0

@Joel Hinz我想我確實需要在每個控制器的功能,它限制我的數據庫值(以確保只有相關的內容被返回)。我現在開始認爲我做錯了什麼,而我目前正在做的不是標準做法嗎? – Garion

+0

很難說如果沒有看到你的應用程序,但它聽起來像你正在做的事情是不應該的風險,是啊... –