当您没有为该功能指定模型时,在哪里放置业务逻辑? Laravel

时间:2018-03-12 10:59:06

标签: php laravel oop laravel-5.2

我试图明智地改进我的代码OOP。 我倾向于将我的一些业务逻辑放在我的控制器中。

有些人告诉我这不可取。

我知道当你使用Posts时。您可以简单地将商务逻辑放在Post.php模型中。

我现在有一个功能,我上传.xlsx文件,如果.xlsx的格式正确,则必须检查和验证。

目前位于ScheduleController@storeDeliveryXlsx内。

但我没有指定模型来存储验证内容?

这是否需要存储库设计模式?或者可以创建一个与数据库无法通信的模型,例如:DeliveryFile.php我把我以后可以在我的应用程序中使用的逻辑放在这里:DeliveryFile::validate($file);或{{1 }}

我认为我可能会在.xlsx上为多个实例重复使用相同的验证。所以我想做DeliveryFile::upload(file);之类的事情。但我不知道在哪里放置代码。

3 个答案:

答案 0 :(得分:2)

在这种情况下,我个人建议使用服务。服务类主要用于可在多个控制器上重复的常用功能。 服务图层是一种设计模式,可帮助您将共享逻辑抽象为公共服务,即我们的新服务类。

因此,在您的实例中,您可以拥有一个Service类,例如ExcelValidator,然后使用类似以下内容来构建您的方法。

<?php

namespace App/Services;

class ExcelValidatorService
{

  public function validate($file) 
  {
    // our validate logic
  }

}

然后在您的控制器或模型中,您可以调用ExcelValidator服务来实现重复的验证逻辑。

答案 1 :(得分:1)

短语I now have a feature会在您编写的代码的生命周期中不断重复。拥有单独的控制器,服务,模型类,OOP设计,模块化代码在这方面肯定会有所帮助。现在它可能更容易,但随着时间的推移它将继续变得困难

答案 2 :(得分:1)

最近我遇到了类似的问题,在我的情况下,我需要使用Restful API作为模型。

在composer.json中,我在autoload

下添加了
"psr-4": {
    "App\\": "app/",
    "MYCOMP\\": "app/MYCOMP/"
},

在app文件夹下,我添加了两个子文件夹Providers和Restmodels的MYCOMP文件夹。

在provider数组中的config / app.php中,我只添加了:

MYCOMP\Providers\RestModelServiceProvider::class,

在app / MYCOMP / Providers / RestModelServiceProvider.php中我为其余模型注册了所有提供者和外观:

public function register()
{
    $loader = \Illuminate\Foundation\AliasLoader::getInstance();

    $models = glob( realpath(__DIR__."/../") ."/RestModels/*/*RestModel.php");
    foreach($models as $model){
        $bnmodel = basename($model);

        if($bnmodel !== "BaseRestModel.php" && $bnmodel !== "BaseFacadeRestModel.php"){
            list($n, $niente) = explode("RestModel.php", $bnmodel);
            list($bnnoext, $niente) = explode(".php", $bnmodel);
            $res = $n.'Repository';
            $fold = basename(dirname($model));
            $nc = "\\MYCOMP\\RestModels\\".$fold."\\".$bnnoext;  
            $this->app->bind($res, function($app) use ($nc) {     
                return new $nc;
            });               
            $loader->alias($res, $nc."Facade");
        }
    }
}

此代码特定于我的项目以及我如何构建文件夹。 对于所有休息模型,我有两个文件:

  • 应用程序/ MYCOMP / RestModels / {MODELNAME} / {MODELNAME} RestModel.php
  • 应用程序/ MYCOMP / RestModels / {MODELNAME} / {MODELNAME} RestModelFacade.php

唯一的例外是:BaseRestModel和BaseFacadeRestModel这些类由所有RestModel和RestModelFacade扩展。所以我在BaseRestModel下执行类似验证的东西。

BaseFacadeRestModel只包含:

<?php

namespace MYCOMP\RestModels\Base;
use Illuminate\Support\Facades\Facade;

class BaseFacadeRestModel extends Facade{
    private $facadeName;

    protected static function getFacadeName(){
        list($senzasuffisso, $niente) = explode("RestModelFacade", static::class);

        $nc = last(explode("\\", $senzasuffisso));
        return $nc;
    }

    protected static function getFacadeAccessor() {
        return static::getFacadeName().'Repository'; 
    }
}

因此所有其他Facades只能使用BaseFacadeRestModel。