将Laravel和Lumen控制器放在包

时间:2017-09-21 08:05:50

标签: php laravel lumen

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

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

但是我看到了一些问题:

  1. App\Http\Controllers\Controller应该存在;这意味着如果App名称空间的名称不同,它将无效。
  2. 包裹现在“知道”它被包含在某物中。
  3. 可测试性:由于引用App\Http\Controllers\Controller,我无法独立测试控制器。
  4. 有更好的方法吗?

    修改1

    我找到了以类似方式受到影响的其他课程。例如,特征Authorizable的命名空间在Laravel中为Illuminate\Foundation\Auth\Access,而在Lumen中为Laravel\Lumen\Auth。我正在使用一个使用该特性的模型。如何使我的模型与Lumen和Laravel兼容?

1 个答案:

答案 0 :(得分: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
}