2013-10-30 33 views
1

我正在建设一个使用Codeigniter的网站,我真的很喜欢MVC模式中的URL如何用于引用控制器方法。这看起来非常符合逻辑和直观,但我似乎正在用这种模式运行一系列问题!MVC的URL问题(Codeigniter)

所以我建立了活动网站,目前我传递的一切通过一个主站点控制器,传递一些参数:

public function index($page = NULL, $city = NULL, $type_venue = NULL, $slug = NULL) 
{ 
    // if the page argument is empty show the homepage 
    if(! ($page)) 
    { 
     $page = 'home'; 
    } 

    // create an array for passing to the views 
    $data = array(
     'title_city' => $city, 
     'title_type_venue' => str_replace('-', ' ', $type_venue), 
     'locations' => $this->locations_model->load(), 
     'events' => $this->events_model->load($city, $type_venue, $slug), 
     'venues' => $this->venues_model->load($city, $slug) 
    ); 

    // construct the page layout with the following views 
    $this->load->view('partials/head', $data); 
    $this->load->view('partials/header', $data); 
    $this->load->view('content/'.$page, $data); 
    $this->load->view('partials/footer'); 
} 

这工作得很好,因为它为以下URL加载内容:

site.com/events/bristol/open-mic/city-varieties/another-incredible-event 
site.com/events/bristol/open-mic/city-varieties/ 
site.com/events/bristol/open-mic/ 
site.com/events/bristol/ 

但是如果我想通过这个控制器通过其他任何不是一个事件,即注册/用户,我必须写这个特定的路线!

值得注意我的路由是:

$route['(:any)'] = 'site/index/$1'; 

我可以写不同的控制器为每个实体,即事件,场馆,城市,但每个人看起来在很大程度上类似于上述(正确吗?),每个都需要获取数据的参数。

我的问题是 - 什么是开发像这样的长查询字符串的最佳做法?单个控制器是否正确?它不喜欢它,但是随后多个控制器会违反DRY,只是因为它们都需要非常类似的数据。任何帮助感谢!

+1

虽然它可能不是DRY,即使代码相同,我也倾向于将我的代码拆分为单独的控制器。它降低了代码的复杂性,并且意味着对一个部分进行更改或添加独特功能并不意味着改变影响整个网站的代码。 – Jeemusu

回答

1

避免将所有东西放到一个控制器中;更进一步,在每个控制器中,避免将所有内容都放入单个索引函数中。

无需为Codeigniter中的每个功能编写特定的控制器 - 建议您在手册中再次阅读该部分。如果遵循正常的指导原则,大部分路由将自动完成。

您尝试使用单个控制器或函数的次数越多,稍后您将不得不添加不可测,不可管理,不可扩展的条件代码。

+0

我知道这一点,但我提出这个问题是因为它不觉得独立的控制器会是最有效的方式,因为会有太多的重复。这是一个相当具体的问题,但它绝不是唯一的,这就是为什么我对缺乏我能找到的答案感到沮丧的原因。 –

+2

如果您正确设置了控制器,则不是。阅读:http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY – jmadsen

+0

谢谢,我用MY_Controller设置咆哮了这棵树,我只是不确定如何使用它。将着眼于实现这一点。 –