我现在已经搜索了几天,而且我认为我在任何地方都找不到相关的问题。
有没有办法让多个"子项目/网站"它为控制器和模型使用共享代码库,但有自己的路由和视图。
例如,public / site1和public / site2有自己的/ views,/ routes文件夹和自己的.env,但都会使用相同的/ app代码。
这些子项目将全部在同一台服务器上,因此,如果有另一个解决方案,那里将有多个应用程序可以链接来自1个主要核心的控制器和模型"申请也是可能的。
编辑:如果有一种方法可以自动加载来自服务器上其他位置的模型和控制器,那么每当我更新"核心"一旦它被用于所有子项目。
答案 0 :(得分:0)
您可以为所需的每个子网站创建目录和命名空间,例如。
您需要在composer.json
中注册它们,如:
"autoload": {
"psr-4": {
"App\\Shared\\": "app/",
"App\\Site1\\": "site1/",
"App\\Site2\\": "site2/"
}
},
在RouteServiceProvider
中,您可以使用不同的域或子域路由每个路由文件,并为每个路由文件包含shared.php
(例如,对于auth路由)。它可能看起来像:
protected function mapSite1Routes()
{
Route::group([
'domain' => config('sites.site1.domain'),
'namespace' => $this->namespace,
'middleware' => ['web'],
], function () {
require base_path('routes/shared.php');
require base_path('routes/site1.php');
});
}
通过这种方式,您可以使用一个共享和单独来源的应用程序。
这应该让你开始:)
答案 1 :(得分:0)
我自己实际上是这样做的。我自己的项目之一是多租户内容管理系统。有核心的CMS代码库,但是对于每个“租户”,我创建了一个包含租户的路由,视图,资源等的包。
每个包都通过Composer包含在内,并且只有与任何其他Laravel项目相同的目录:
虽然服务提供者类有点“hack-y”。我必须做这样的事情:
class PackageNameServiceProvider extends ServiceProvider
{
public function boot()
{
if ($this->app->runningInConsole()) {
$this->defineAssetPublishing();
$this->defineConsoleCommands();
}
if ($this->app->make(Tenant::class)->name == 'This Tenant') {
$this->defineRoutes();
$this->defineResources();
}
}
}
如果我能摆脱if ($this->app->make(Tenant::class)->name == 'This Tenant')
位,那就太好了。但是,到目前为止它对我来说还不错。
答案 2 :(得分:0)
请参阅有关分组路由的文章:
http://www.w3programmers.com/laravel-route-groups/
分组路由中的域属性将允许很大的灵活性。此外,namespace属性允许您通过php类命名空间对函数进行分组。