最近我遇到了一个类似的问题,我的情况是需要使用一个Restful API作为模型。
在composer.json文件中,我在autoload下添加了以下内容:
"psr-4": {
"App\\": "app/",
"MYCOMP\\": "app/MYCOMP/"
},
在应用文件夹下,我添加了名为MYCOMP的文件夹,其中包含两个子文件夹Providers和Restmodels。
在config/app.php文件中的提供者数组中,我仅添加了:
MYCOMP\Providers\RestModelServiceProvider::class,
在 app/MYCOMP/Providers/RestModelServiceProvider.php 中,我注册了所有 rest 模型的提供者和门面:
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");
}
}
}
这段代码是特定于我的项目,以及我如何构建文件夹。
对于所有其他模型,我有两个文件:
- app/MYCOMP/RestModels/{ModelName}/{ModelName}RestModel.php
- app/MYCOMP/RestModels/{ModelName}/{ModelName}RestModelFacade.php
唯一的例外是:BaseRestModel和BaseFacadeRestModel,这些类被所有的RestModel和RestModelFacade继承。因此,我会在BaseRestModel下实现类似validate的功能。
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';
}
}
所以所有其他外观都是通过扩展BaseFacadeRestModel来工作的。