如何在 laravel 上以一种形式使用两个控制器方法?
Posted
技术标签:
【中文标题】如何在 laravel 上以一种形式使用两个控制器方法?【英文标题】:How to use two controllers method in one form on laravel? 【发布时间】:2019-02-21 19:38:48 【问题描述】:我有一个 productsController,它基本上可以很好地完成 CRUD。但是有一个问题。我的控制器方法变得太长了。所以我决定将 ImageController 和 Image 表与产品分开。因为图像需要在 CRUD 上。
但是,上传此商品的表单与上传图片的表单相同。那么,从一种形式制作两个控制器的最佳做法是什么?路线应该是什么样的?
注意:这是一个一般性问题。代码也太长了。这就是为什么我没有在这里添加代码。
【问题讨论】:
【参考方案1】:这是一个非常广泛的问题,但您似乎需要在 Product 和 Image 模型之间建立关系(假设您正在使用带有您在问题中提到的控制器的模型),以便 Product 具有一个 Image。然后当你保存一个产品时,你可以像这样在 Image 上调用 store Image 方法:
$product->image->storeImage($img);
其中 $img 是您要上传的图像文件。关系如下所示:
Products.php:
public function image()
return $this->hasOne('App\Image');
Image.php:
public function product()
return $this->belongsTo('App\Product');
这不是一个详尽的答案,但希望能让您走上正确的道路。当然,您仍然需要在 Image 模型上添加其他代码,例如自定义“store”功能,并确保您有正确的迁移(Image 模型上的 article_id,Product 模型上的 image_id),但是这将是分离代码并使控制器更轻的一种方法。下面是在 Image.php 模型中存储图像的示例:
class Image extends Model
public function storeImage($img)
//code goes here to store image
【讨论】:
感谢您的回答,我建立了关系,但我不应该调用其他控制器方法吗?我的意思是这个方法控制器是如何知道它被调用的?我从路由调用并形成 ProductsController@store 方法但是 imagesController@store 呢? 问题是您正在使用控制器来处理应该在模型中直接处理的内容。你当然可以用控制器完成你想要做的事情,但是你不能以你想要的方式直接跨控制器调用方法。这就是为什么模型之间的关系是必要的。一旦关系存在,您就可以直接从其他模型调用方法,而无需使用 ajax 或其他允许控制器相互通信的系统。 澄清一下,“store”方法将在图像模型中,而不是在 imageController 中。我已经编辑了我的答案以显示这一点。 只想说清楚。如果我错了,请纠正我。通常我有带图像的产品。比我决定分开数据库和控制器。所以,我创建了一个 Image 模型,create_image_table 和 imageController。我唯一应该做的就是建立关系并调用“$product->relationshipname->store()”就可以了吗? 是的,但是您都需要将 $image 路径传递给 Image 模型以便能够存储图像,并且您必须在 Image 模型上定义 storeImage() 函数,正如我在上面展示的那样。如果没有看到您的代码,很难解决这些类型的细节,但尽我所能提供帮助!以上是关于如何在 laravel 上以一种形式使用两个控制器方法?的主要内容,如果未能解决你的问题,请参考以下文章