2016-12-05 145 views
1

我從頭開始構建MVC PHP框架,並且我在模型層有一些問題。PHP MVC:我應該在哪裏放置模型搜索邏輯?

我所現在是一個比較基本的MVC實現,這裏是我的入口點(的index.php):

//get the URI 
$uri = isset($_SERVER['REQUEST_URI']) 
      ? $_SERVER['REQUEST_URI'] 
      : '/'; 
//Initializes the request abstraction from URI 
$request = new request($uri); 

//getting the view class from the request 
$viewFactory = new viewFactory(); 
$view = $viewFactory->getView($request); 
$view->setDefaultTemplateLocation(__DIR__ . '/templates'); 

//getting the data mapper from the connection string 
$connectionString = "mysql:host=localhost;dbname=test;username=root;"; 
$dataMapperFactory = new dataMapperFactory($connectionString); 
$dataMapper = $dataMapperFactory->getDataMapper(); 

$modelFactory = new modelFactory($dataMapper); 

//getting controller and feeding it the view, the request and the modelFactory. 
$controllerFactory = new controllerFactory(); 
$controller = $controllerFactory->getController($request,$view,$modelFactory); 

//Execute the necessary command on the controller 
$command = $request->getCommand(); 
$controller->{$command}($request); 

//Produces the response 
echo $view->render(); 

我覺得這是自我解釋,但如果你沒有得到的東西,或者如果您認爲我犯了一個可怕的錯誤,請隨時告訴我。

無論如何,modelFactory負責返回控制器可能需要的任何模型。我現在需要實現「模型研究」邏輯,在我看來有兩種方法可以實現它:

第一種方法:實現一個包含所有研究邏輯的modelSearch類,然後讓我的模型繼承它(如在Yii2中) 。我不喜歡這種方法,因爲它會讓我實例化一些模型,並讓它返回自己的其他實例。因此,我有相同的模型實例化一次,研究和一次(或更多)與所有數據,並沒有使用搜索方法。 所以我的控制器看起來就像是:

class site extends controller{ 

    public function __construct($view, $modelFactory){ 
     parent::__construct($view, $modelFactory); 
     /* code here */ 
    } 

    public function index() 
    { 
     $searchModel = $this->modelFactory->buildModel("exemple"); 
     $model = $searchModel->get(["id"=>3])->one(); 
     $this->render('index',['model' => $model]); 
    } 
} 

方式二:實現包含所有的研究邏輯,然後在輸入點,而不是實例化modelFactory一個modelSearch類,我可以istantiate的modelSearch,並已經將它的DataMapper的。然後我給modelSearch到控制器,控制器會通過詢問modelSearch(這將使用modelFactory實例模型和返回他們)得到他想要的任何模型,這樣的:

class site extends controller{ 

    public function __construct($view, $searchModel){ 
     parent::__construct($view, $searchModel); 
    } 

    public function index() 
    { 
     $model = $this->searchModel->get("exemple",["id"=>3])->one(); 
     $this->render('index',['model' => $model]); 
    } 
} 

這種方式似乎更對我來說是正確的,但有一個缺點,就是不得不調用modelSearch類來返回任何模型,甚至是空模型。

想法?

TL; DR:modelSearch:我是使用它作爲獨立工具來獲取模型,還是使模型繼承它?

+0

是的沒有。這不是你設置MVC的鋤頭。 TBH,我甚至不確定什麼「搜索邏輯」是基於你的例子。搜索的抽象應該放在負責任的服務實例中,然後由負責的服務實例進行內部處理,使用各種持久性抽象來抽象結果集合和檢索集合。 –

回答

-1

搜索邏輯應該在模型本身內,因爲MVC描述了模型,查看&控制器。模型應該只有一個與數據庫本身一起工作的職責。而控制器應負責處理數據並傳遞數據。

+0

確實。該模型雖然是一個圖層,但問題是關於searchModel類的:我是否將它作爲獨立工具來搜索和返回模型,還是使模型繼承它? –

+0

對於小型搜索,返回模型會很好,但對於更大和更復雜的搜索,將搜索作爲獨立模塊會更好。 –

+0

控制器不應對「操縱和傳遞數據」負責。一個模型層是一個複雜得多,然後只是一個愚蠢的數據庫抽象。 –

-1

首先讀取任何MVC模式PHP框架作爲CI,CakePHP和YII,然後您將看到模型(它如何與數據庫一起工作)。你可以創建自我模型搜索邏輯,你可以看到YII框架模型中的最佳搜索邏輯和控制器的可用性。

+0

Yii在其模型中使用靜態方法。我不喜歡它,因爲實例化的模型也會使用這些方法,而不會使用它們。 這是最佳方式嗎?把研究邏輯放在另一個班上是不是更好? –

+0

從PHP框架學習MVC就像學習順勢療法的藥物,或者從Deepak Chopra學習量子物理學。 –