我正在开发一个包含控制器的软件包,我希望这个软件包与Laravel和Lumen项目兼容(或可用)。我的问题是Laravel控制器扩展Illuminate\Routing\Controller
和流明控制器扩展Laravel\Lumen\Routing\Controller
。我的包中的控制器无法扩展它们。
我提出的唯一解决方案是让包内的控制器扩展App\Http\Controllers\Controller
。
但是我看到了一些问题:
App\Http\Controllers\Controller
应该存在;这意味着如果App
名称空间的名称不同,它将无效。App\Http\Controllers\Controller
,我无法独立测试控制器。有更好的方法吗?
修改1
我找到了以类似方式受到影响的其他课程。例如,特征Authorizable
的命名空间在Laravel中为Illuminate\Foundation\Auth\Access
,而在Lumen中为Laravel\Lumen\Auth
。我正在使用一个使用该特性的模型。如何使我的模型与Lumen和Laravel兼容?
答案 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
}