laravel 5的动态路径

时间:2015-05-08 05:47:43

标签: laravel laravel-5 multi-tenant

虽然building multi-tenancy packages for Laravel 5我必须找到如何使路径和名称空间动态化。

这将涉及:

  • 图;动态添加根命名空间中可用的模板目录
  • 琅;动态添加根命名空间中可用的语言目录
  • 路线;动态添加路由文件
  • 配置;合并动态位置的其他配置文件
  • 供应商;允许自定义供应商和软件包在动态位置提供

1 个答案:

答案 0 :(得分:4)

的观点

使用service provider,您可以在boot()方法中使用以下内容,以便在根命名空间(view('your-view')而不是view('package::your-view'))中提供视图:

$this->app['view']->addLocation('/your/new/location');

使用service provider,您可以在boot()方法中使用以下内容,其中$path是根命名空间转换的新路径:

$app->bindShared('translation.loader', function($app) use ($path)
{
      return new \Illuminate\Translation\FileLoader($app['files'], $path);
});
$app->bindShared('translator', function($app)
{
      $translator = new \Illuminate\Translation\Translator($app['translation.loader'], $app['config']['app.locale']);
      $translator->setFallback($app['config']['app.fallback_locale']);
      return $translator;
});

路由

到目前为止最简单的路线。只需使用require_once或使用Laravel方法包含它们:\File::requireOnce()

配置

我使用的目录允许租户取代核心配置。请注意,此处没有安全性或健全性检查,因此访问权限应受到限制。

使用service provider,您可以在boot()方法

中使用以下内容
 foreach (\File::allFiles('/path/to/configs') as $path) {
       $key = \File::name($path);
       $app['config']->set($key, array_merge(require $path, $app['config']->get($key, [])));
 }

这将通过使用提供的配置文件覆盖其值来合并现有配置。

供应商

真的很有趣的是使用动态加载的类的可能性。为此,您需要在service provider

中使用ClassLoader addDirectories()方法
\Illuminate\Support\ClassLoader::addDirectories(['/path/to/vendors']);

其他注意事项

上述代码可以使用服务提供商实现。为了让服务器提供商工作,您必须将它们添加到config/app.php数组下的providers文件中。不这样做不会启用服务提供商中的任何代码。