添加到控制器的内容和添加到模型的内容
What add to controller and what to models
我有个小问题。哪些数据保存在控制器中,哪些保存在模型中?我知道在模型中保留了应用程序等的整个逻辑,但是什么是查询和帮助函数?例如
控制器:
public function add(Request $request)
{
$item = new Item()
$item->name = $request->name;
$item->save();
$this->makeDirectory();
}
private function makeDirectory()
{
//make a directory with photo this product
}
我应该将 "makeDirecory" 方法保存在控制器或模型中的什么位置?
这是另一种情况,我会从另一个 table 中删除产品和参考。
public function delete(Items $id)
{
$id->delete();
$this->deleteProperties($id->properties); // $id->properties is a method from Items model with references to table Properties
}
private function deleteProperties(Properties $id)
{
$id->delete();
}
我应该在控制器、项目模型还是属性模型中保留 "deleteProperties" 方法?并从此模型调用此方法?
您应该将 makeDirectory()
之类的方法保留在 service class 中,并使用以下方式调用它:
$this->fileService->makeDirectory($directory);
您应该 keep data related logic in model classes or repository classes 并在控制器中使用它:
$this->model->getSomeData();
您可能还想 google "Fat models, skinny controllers".
关于辅助函数,你应该只在你真正需要的时候使用它们。例如,isAdmin()
是一个非常方便的全局帮助器,但您永远不应该创建像 getAllUsers()
或 Helpers::getAllUsers()
这样的帮助器
我只使用控制器来验证传入数据并将数据传递给视图。
我添加了另一层 classes,我称之为部门。所以,我有一个部门负责个人资料、文章、信息页面等。每个部门都有自己的命名空间和一组与功能相关的 classes。
始终考虑 SoC - 关注点分离。如果将大量逻辑放入控制器中,它最终会变得庞大,难以维护和扩展。
示例:
控制器:
public function addItem (Request $request, Item $item, ItemStorage
$itemStorage) {
if ($item->verifyInput($request->all())) {
$itemStorage->createItem ($item, $request->all());
}
else {
// ... handle input error
}
// ... view
}
App\Departments\Items:
class ItemStorage {
public function createItem ($newItem, $attributes) {
$newItem->create($attributes);
// ... prepare data for creating a directory
$this->makeDirectory($directoryName);
}
private function makeDirectory ($directoryName) {
//... create directory
}
}
您 can/should 进一步分离任务。 ItemStorage 可能不需要处理实际的目录创建。您可以调用另一个 department/service class 名称,例如磁盘管理。该部门将包含 类,如 FileSystem。因此,在 makeDirectory() 方法内部,您可以从专门用于文件系统操作的 class 中调用一个方法。
我有个小问题。哪些数据保存在控制器中,哪些保存在模型中?我知道在模型中保留了应用程序等的整个逻辑,但是什么是查询和帮助函数?例如
控制器:
public function add(Request $request)
{
$item = new Item()
$item->name = $request->name;
$item->save();
$this->makeDirectory();
}
private function makeDirectory()
{
//make a directory with photo this product
}
我应该将 "makeDirecory" 方法保存在控制器或模型中的什么位置?
这是另一种情况,我会从另一个 table 中删除产品和参考。
public function delete(Items $id)
{
$id->delete();
$this->deleteProperties($id->properties); // $id->properties is a method from Items model with references to table Properties
}
private function deleteProperties(Properties $id)
{
$id->delete();
}
我应该在控制器、项目模型还是属性模型中保留 "deleteProperties" 方法?并从此模型调用此方法?
您应该将 makeDirectory()
之类的方法保留在 service class 中,并使用以下方式调用它:
$this->fileService->makeDirectory($directory);
您应该 keep data related logic in model classes or repository classes 并在控制器中使用它:
$this->model->getSomeData();
您可能还想 google "Fat models, skinny controllers".
关于辅助函数,你应该只在你真正需要的时候使用它们。例如,isAdmin()
是一个非常方便的全局帮助器,但您永远不应该创建像 getAllUsers()
或 Helpers::getAllUsers()
我只使用控制器来验证传入数据并将数据传递给视图。
我添加了另一层 classes,我称之为部门。所以,我有一个部门负责个人资料、文章、信息页面等。每个部门都有自己的命名空间和一组与功能相关的 classes。
始终考虑 SoC - 关注点分离。如果将大量逻辑放入控制器中,它最终会变得庞大,难以维护和扩展。
示例:
控制器:
public function addItem (Request $request, Item $item, ItemStorage
$itemStorage) {
if ($item->verifyInput($request->all())) {
$itemStorage->createItem ($item, $request->all());
}
else {
// ... handle input error
}
// ... view
}
App\Departments\Items:
class ItemStorage {
public function createItem ($newItem, $attributes) {
$newItem->create($attributes);
// ... prepare data for creating a directory
$this->makeDirectory($directoryName);
}
private function makeDirectory ($directoryName) {
//... create directory
}
}
您 can/should 进一步分离任务。 ItemStorage 可能不需要处理实际的目录创建。您可以调用另一个 department/service class 名称,例如磁盘管理。该部门将包含 类,如 FileSystem。因此,在 makeDirectory() 方法内部,您可以从专门用于文件系统操作的 class 中调用一个方法。