如何在文件系统中调用自定义帮助函数

时间:2017-11-10 02:07:05

标签: php laravel

我的情况是我需要在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"]
    },

2 个答案:

答案 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,希望这有帮助。