控制器在PHP框架中构建

时间:2014-02-25 17:02:51

标签: php zend-framework yii laravel

我想举个例子来简化问题: 如果您正在实施Facebook,您希望将用户信息与帐户信息,帖子,来自之间分开,这意味着将有用户模型,用户信息模型,帖子模型,for for模型。

现在如果你转到用户配置文件,它会加载来自所有这些模型的信息,问题是如何构建控制器,当然你需要每个模型的控制器来定义它的独特动作,但是我如何处理渲染? 我是否制作了一个能够处理所有渲染的新控制器?或者我只是将渲染配置文件放在用户控制器中 - 这意味着它可以访问其他模型 - 或者我在每个控制器中放置它自己的渲染,然后将它们组合在一起...... 或者如果你有更好的方法?

我只是不知道我想到的每种方法的后果,我不知道是否有一种我没有想到的更好的方法。

3 个答案:

答案 0 :(得分:1)

  

当然,每个模型都需要控制器来定义它的独特动作

不,这是错误的。

控制器是您的表示层的一部分,有些人可能会说您需要为每个视图对象设置一个控制器,但是对于模型层,它与您拥有的控制器数量无关

一个View是一个切换多个模板的对象,再一次这与你的控制器无关,渲染是一个视图责任。 要了解更多信息,请查看hereherehere

这些是非常有用的信息。

答案 1 :(得分:1)

正如其他人所提到的,您不需要专门针对每个型号的控制器。但是,根据您的Facebook示例,it's quite simply done through relationships

过度简化将是:

用于保存用户帐户信息和关系的用户模型

class User extends Eloquent {
    public function posts() {
      return $this->hasMany('posts', 'from_user_id');
    }
}

用于保存内容和从/到关系到用户

的帖子模型
class Post extends Eloquent {
    public function from() {
      return $this->belongsTo('user', 'from_user_id'); 
    }

    public function to() {
      return $this->belongsTo('user', 'to_user_id');
    }
}

那么也许你会让UserController加载一个这样的视图:

class UserController extends BaseController {
  public function index($id) {
    $user = User::find($id);
    return View::make('user_page', array(
      'user' => $user, 
      'posts' => $user->posts()->with('to')->get()
    ));        
  }
}

答案 2 :(得分:0)

错误答案 - 控制器不是表示层的一部分 - 它们是传输层的一部分。他们的任务是对HTTP请求做出反应。 请求由路由器分派。要证明一下Laravel的来源。控制器是路由包的一部分。当你打电话给例如:

Route::get("/","HomeController");

您只是在 RouteCollection 中注册请求参数。但一切都发生在路由器中。控制器可以在没有任何视图层的情况下存在。