2016-08-24 28 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

很难说如果没有看到你的应用程序,但它听起来像你正在做的事情是不应该的风险,是啊... –