我试图明智地改进我的代码OOP。 我倾向于将我的一些业务逻辑放在我的控制器中。
有些人告诉我这不可取。
我知道当你使用Posts时。您可以简单地将商务逻辑放在Post.php
模型中。
我现在有一个功能,我上传.xlsx文件,如果.xlsx的格式正确,则必须检查和验证。
目前位于ScheduleController@storeDeliveryXlsx
内。
但我没有指定模型来存储验证内容?
这是否需要存储库设计模式?或者可以创建一个与数据库无法通信的模型,例如:DeliveryFile.php
我把我以后可以在我的应用程序中使用的逻辑放在这里:DeliveryFile::validate($file);
或{{1 }}
我认为我可能会在.xlsx上为多个实例重复使用相同的验证。所以我想做DeliveryFile::upload(file);
之类的事情。但我不知道在哪里放置代码。
答案 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");
}
}
}
此代码特定于我的项目以及我如何构建文件夹。 对于所有休息模型,我有两个文件:
唯一的例外是: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。