【问题标题】:Laravel - Possibility of having File Upload in ModelLaravel - 在模型中上传文件的可能性
【发布时间】:2015-02-22 06:01:19
【问题描述】:

我正在为所有数据库操作使用模型

即,

在控制器中

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 中做这一切,

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

【问题讨论】:

    标签: php laravel laravel-4 model


    【解决方案1】:

    您可以随心所欲地处理请求。 Laravel 不会强迫您以特定方式编写控制器代码。

    然而,关注点分离是一种很好的做法。 In his book,Taylor 使用接口和依赖注入阐明了这个问题。基本上你的控制器通常依赖于一些接口。对于数据库操作,假设您的 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也很好的讨论了这个话题。

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

    希望这会有所帮助!

    【讨论】:

    • 谢谢,函数__construct会自动获取$fileInput::file('InsurancePhoto');吗?
    • 我建议您在文件处理特定类中创建一个新函数,该函数负责保存文件。构造函数几乎是让 Laravel 将类注入控制器的地方。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2021-04-21
      • 1970-01-01
      • 2015-12-13
      相关资源
      最近更新 更多