首页 文章

将Laravel和Lumen控制器放在包中

提问于
浏览
1

我正在开发一个包含控制器的软件包,我希望这个软件包与Laravel和Lumen项目兼容(或可用) . 我的问题是Laravel控制器扩展 Illuminate\Routing\Controller 和Lumen控制器扩展 Laravel\Lumen\Routing\Controller . 我的包中的控制器不能扩展它们 .

我提出的唯一解决方案是让包内的控制器扩展 App\Http\Controllers\Controller .

但我看到一些问题:

  • App\Http\Controllers\Controller 应该存在;这意味着如果 App 名称空间的名称不同,它将无法工作 .

  • 包现在是"aware",它被包含在某个东西中 .

  • 可测试性:由于对 App\Http\Controllers\Controller 的引用,我无法独立测试控制器 .

有更好的方法吗?

Edit 1

我发现其他类似的方式受到影响 . 例如,特征 Authorizable 的命名空间在Laravel中是 Illuminate\Foundation\Auth\Access ,而在Lumen中是 Laravel\Lumen\Auth . 我正在使用一个使用该特征的模型 . 如何让我的模型兼容Lumen和Laravel?

1 回答

  • 0

    好吧,您可以简单地将两个不同的文件和类包装在if语句中,并检查要扩展的相应类 . 所以:

    LaravelClass.php:

    if(class_exists(Illuminate\Routing\Controller:class)){
      class LaravelClass extends Illuminate\Routing\Controller {
        use YourCodeTrait;
    
        // any more code that is not in your trait
      }
    }
    

    LumenClass.php

    if(class_exists(Laravel\Lumen\Routing\Controller:class)){
      class LaravelClass extends Laravel\Lumen\Routing\Controller {
        use YourCodeTrait;
    
        // any more code that is not in your trait
      }
    }
    

    加载这两个文件只会加载其中一个类 . 在上面的代码中,我使用特征来加载控制器的内容,假设内容相同,你可以使用相同的特性而不必重复自己 .

    trait YourCodeTrait{
      // whatever would normally go in your controllers
    }
    

相关问题