laravel - 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;
}
}
解决方案
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
。
或者,您可以使用该方法创建一个抽象模型类,并让两个模型都继承自它。但特质将是我的第一选择。
推荐阅读
- wpf - 与自定义转换器绑定时,枚举被强制转换为字符串
- wpf - 在 App.config 中设置 PrintPreviewDialog 控件的初始状态
- javascript - 角度:重定向后重新加载页面
- react-native - 导航到不同的堆栈 - 无法对未安装的组件执行更新(无操作)
- r - 使用 SSlogis 将逻辑曲线拟合到数据:错误 NA/NaN/Inf
- php - PHP $_GET 没有获得任何价值
- html - 无法使用 html 播放压缩的 wav 文件
- java - 更改活动时 Android 应用程序崩溃
- .htaccess - .htaccess 重定向新域和新 url 结构
- python-3.x - 将 python 列表传递给 keras model.fit