如何在 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 上以一种形式使用两个控制器方法?的主要内容,如果未能解决你的问题,请参考以下文章

Int在CentOS 7.1和Laravel 5.1上以PHP形式处理

如何在 django 中以一种形式组合多个模型? [复制]

使用 Ajax 以一种形式上传数据和文件?

使用 Ajax 以一种形式上传数据和文件?

使用 Ajax 以一种形式上传数据和文件?

如何在 Bootstrap 3 中以一种形式混合垂直和水平表单元素?