首页 > 解决方案 > Laravel - 避免模型中的代码重复

问题描述

我有一种方法可以在我的模型中保存一些文件,我不想再复制它了,这是在 Laravel 中避免这种代码重复的最好方法吗?

您可以在下面看到一些重复的示例,其中有 Product 和 Articles 模型,它们都有 saveFile 方法。

如何隔离此代码并重用它?

// App/Article.php
class Product extends Model {
    protected static $storageFolders = "public/products";

    public static function saveFile($file, Array $options = []) {
        $filename = "";
        if (isset($options["name"])) {
            $filename .= $options["name"];
        }
        if ($options["unique"]) {
            $filename .= "-" . time();
        }
        $picture_path = "";
        if ($filename) {
            $extension = $file->getClientOriginalExtension();
            $filename .= ".$extension";
            $picture_path = $file->storeAs(SELF::$storageFolders, $filename);
        } else {
            $picture_path = $file->store(SELF::$storageFolders);
        }
        $storage_url = Storage::url($picture_path);
        return $storage_url;
    }
}

// App/Article.php
class Article extends Model {
    protected static $storageFolders = "public/articles";

    public static function saveFile($file, Array $options = []) {
        $filename = "";
        if (isset($options["name"])) {
            $filename .= $options["name"];
        }
        if ($options["unique"]) {
            $filename .= "-" . time();
        }
        $picture_path = "";
        if ($filename) {
            $extension = $file->getClientOriginalExtension();
            $filename .= ".$extension";
            $picture_path = $file->storeAs(SELF::$storageFolders, $filename);
        } else {
            $picture_path = $file->store(SELF::$storageFolders);
        }
        $storage_url = Storage::url($picture_path);
        return $storage_url;
    }

}

标签: laravellaravel-5php-7

解决方案


Traits允许您在不同的类之间共享方法。如果您将该方法放在一个特征中并让两个类都使用它,那应该可以实现您想要的。

例如:

trait SavesFiles
{
    public static function saveFile($file, Array $options = []) {
        $filename = "";
        if (isset($options["name"])) {
            $filename .= $options["name"];
        }
        if ($options["unique"]) {
            $filename .= "-" . time();
        }
        $picture_path = "";
        if ($filename) {
            $extension = $file->getClientOriginalExtension();
            $filename .= ".$extension";
            $picture_path = $file->storeAs(SELF::$storageFolders, $filename);
        } else {
            $picture_path = $file->store(SELF::$storageFolders);
        }
        $storage_url = Storage::url($picture_path);
        return $storage_url;
    }
}

然后,您的模型可以按如下方式使用它:

class Product extends Model
{
    use SavesFiles;
    ...
}

模型之间的任何不同之处,例如文件夹,都可以在类上定义,例如public $folder = 'products';,然后在特征中使用,例如$this->folder

或者,您可以使用该方法创建一个抽象模型类,并让两个模型都继承自它。但特质将是我的第一选择。


推荐阅读