Laravel-在模型中上传文件的可能性


Laravel - Possibility of having File Upload in Model

>我正在使用模型进行所有数据库操作

即,

在控制器中

public function VehicleProcess()
{
$VehicleData = Input::all();
$validation = Validator::make($VehicleData, VehicleModel::$rules);  // using model for validation
if ($validation->passes())
   {
     VehicleModel::create($VehicleData);   //using model for creating table
     return Redirect::to('vehicle')->withErrors('Vehicle Details Saved Succesfully');
   }

现在我正在使用文件上传

因此,获取文件

$file = Input::file('photo');

并将其存储在我自己的目标路径中

Input::file('photo')->move($destinationPath, $fileName);

我正在控制器中做这一切,

是否可以在模型中执行这些操作,例如将$file发送到模型,如果是,我该怎么做?

您可以根据需要处理请求。Laravel不会强迫您以特定方式对控制器进行编码。

然而,将关注点分开是一种很好的做法。在他的书中,Taylor使用接口和依赖注入来阐明这个问题。基本上,您的控制器通常依赖于某些接口。对于数据库操作,假设您的车辆控制器将使用车辆存储库。对于文件系统操作,您的车辆控制器将使用另一个接口(可能称为ImageManager)。所有这些接口及其实现都应由您自己编写。

控制器中的代码示例:

class VehicleController extends BaseController {

protected $vehicle;
protected $imageManager;

function __construct(VehicleRepositoryInterface $vehicle, ImageManager $imageManager)
{
    $this->vehicle = $vehicle;
    $this->imageManager = $imageManager;
}

接下来,您必须编写一个 ServiceProvider 类以将实现绑定到您的接口,以便 Laravel 可以在运行时自动加载该实现并将其注入控制器。

class RepositoryServiceProvider extends ServiceProvider{
/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    $this->app->bind(
        'VehicleRepositoryInterface',
        'EloquentVehicleRepository'
    );
}

这篇博客文章也很好地讨论了这个话题。

总之,在您的情况下,许多控制器很可能需要文件操作,因此我认为最好将此类逻辑移动到特定的接口和类中,而不是在模型中对其进行编码。

希望这有帮助!

你可以覆盖模型的创建方法

class VehicleModel extends 'Eloquent {

public static function create(array $attributes) {
        if(isset($attributes['photo'])){
            //put you file tranfer code
            $attributes['photo'] = "demo.jpg";
        }
        return parent::create($attributes);
    }
}