我的情况是我需要在tenant_path()
内加载filesystems.php
,就像下面的代码一样。它适用于位于tenant_path()
的{{1}}函数,它是我的自定义助手类helpers.php
。目的是为不同租户提供动态路径。
我的问题是App/Helpers/helpers.php
未在tenant_path()
中加载,但是当我尝试使用中间件,控制器并对其工作进行建模时......似乎{Laver @运行时filesystems.php
尚未加载tenant_path()
。但filesystems.php
storage_path()
Foundation/helpers
tenant_path()
{{}}} filesystem.php
{{}}}
错误显示
[ReflectionException] Class path.tenant does not exist
以下是我的代码
Filesystems.php
'image' => [
'driver' => 'local',
'root' => storage_path('app/public/images/'.tenant_path()),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
Helpers.php
if (! function_exists('tenant_path')) {
/**
* Get the path to the tenant folder.
*
* @param string $path
* @return string
*/
function tenant_path($path = '')
{
return ""; //also not working
return app()->make('path.tenant').($path ? DIRECTORY_SEPARATOR.ltrim($path, DIRECTORY_SEPARATOR) : $path);
}
}
AppServiceProvider
Tenanti::connection('company', function (TenantDomain $entity, array $config) {
$config['database'] = env('TENANTI_DB_PREFIX')."_{$entity->id}";
$this->app->bind('path.tenant', function () use ($entity) {
return "{$entity->sub_domain}.".env('APP_DOMAIN');
});
return $config;
});
composer.json
"autoload": {
"files": ["app/Helpers/helpers.php"]
},
答案 0 :(得分:0)
几个小时后,我设法通过重置文件系统配置来解决它...它似乎文件系统已经将所有内容转换为数组,并且只能在第一次初始化时工作。看起来像hacky技巧..我不知道这是不是正确的方式..
我的解决方案是让文件系统配置并遍历磁盘并将tenant_path附加到磁盘根目录。
<强> AppServiceProvider.php 强>
//bind tenant_path with null string
$this->app->bind('path.tenant', function () {
return "";
});
Tenanti::connection('company', function (TenantDomain $entity, array $config) {
$config['database'] = env('TENANTI_DB_PREFIX')."_{$entity->id}";
// bind with new tenant_path when there is switching connection
$this->app->bind('path.tenant', function () use ($entity) {
return "{$entity->sub_domain}.".env('APP_DOMAIN');
});
// hacky filesystems config
$filesystems = config('filesystems');
foreach ($filesystems['disks'] as $key => $disk) {
if (!in_array($key, ['local', 'bepunct', 'public', 's3'])) {
//replace with tenant_path
$filesystems['disks'][$key]['root'] = $disk['root'].tenant_path();
}
}
//reset filesystem with new tenant filesystems
config()->set('filesystems', $filesystems);
return $config;
});
答案 1 :(得分:0)
Laravel为您提供了一个工匠命令,只需运行:
php artisan config:cache
这将执行2个命令config:clear和config:cache,希望这有帮助。