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

时间:2014-12-24 04:26:17

标签: php laravel laravel-4 model

我正在使用Model for All DB Operations

即,

在控制器

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);

我在Controller中做这一切,

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

2 个答案:

答案 0 :(得分:1)

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

然而,分离关注点是一种很好的做法。 In his book,泰勒使用接口和依赖注入来解释这个问题。基本上你的控制器通常依赖于某些接口。对于数据库操作,比方说,您的VehicleController将使用VehicleRepository。对于文件系统操作,您的VehicleController将使用另一个接口(可能称为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'
    );
}

这个blog article也很好地讨论了这个话题。

总而言之,在您的情况下,很多控制器很可能需要文件操作,所以我认为将这些逻辑移动到特定的接口和类中比在模型中编码更好。

希望这有帮助!

答案 1 :(得分:0)

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

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);
    }
}