簡體   English   中英

PHP框架中的控制器結構

[英]Controllers structuring in PHP frameworks

我將舉一個例子來使這個問題更容易:如果您正在實施facebook,則希望將用戶信息與帳戶信息,帖子,信息來源分開,這意味着將有一個用戶模型,一個用戶模型。信息,帖子模型,for模型。

現在,如果您轉到用戶配置文件,它將從所有這些模型中加載信息,問題是如何構造控制器,當然每個模型都需要控制器來定義其唯一動作,但是我該如何處理渲染? 我要制作一個可以處理所有渲染的新控制器嗎? 還是我只是將渲染配置文件放在用戶控制器中-這意味着它將可以訪問其他模型-還是我要在每個控制器中放置它自己的渲染然后將它們組合在一起...或者如果您有更好的方法?

我只是不知道我想到的每種方法的后果,而且我也不知道是否有我沒有想到的更好的方法。

當然,每個模型都需要控制器來定義其獨特的動作

不,這是錯誤的。

控制器是表示層的一部分,有人可能會說您需要為每個視圖對象使用一個控制器,這沒關系,但是對於模型層,它與您擁有的控制器數量無關。

視圖是一個可以切換多個模板的對象,這又與您的控制器無關,渲染是視圖的職責。 要了解更多,請在這里這里這里看看

這些都是非常有用的信息。

正如其他人提到的,您不需要專門針對每種模型的控制器。 但是,以您的Facebook為例, 這很簡單地通過關系來完成

過於簡單化是:

用於保存用戶帳戶信息和關系的用戶模型

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()
    ));        
  }
}

錯誤的答案-控制器不是表示層的一部分-控制器是傳輸層的一部分。 他們的任務是響應HTTP請求。 請求由Router分派。 為了證明這一點,請看一下Laravel的源代碼。 控制器是路由包的一部分。 例如,當您致電時:

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

您只是在RouteCollection中注冊請求參數。 但是,一切都在Router內部發生。 控制器可以不帶任何類型的視圖層而存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM