2017-11-10 5 views
0

私の状況は、以下のコードのようにtenant_path()filesystems.phpの中にロードする必要があるところです。それは私のカスタムヘルパークラスであるhelpers.phpにあるtenant_path()関数ですApp/Helpers/helpers.php。目的は異なるテナントのための動的パスのためです。ファイルシステムでカスタムヘルパー関数を呼び出す方法

私の問題はtenant_path()ではfilesystems.phpにロードされたが、私は、ミドルウェアにしようとしたとき、コントローラとその仕事をモデル化されていません。.. tenant_path()はLaravelはfilesystems.phpを実行したときにはまだロードされていないように思えます。しかしFoundation/helpers作品にどのようにstorage_path()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

、私は、ファイルシステムの設定をリセットすることにより、それを解決するために管理。それはファイルシステムが既にすべてを配列に変換し、最初の初期化時にのみ動作するように見えます。それが正しい方法であるかどうかわかりません。

私の解決策は、ディスクに沿ってファイルシステムの設定とトラバースを行い、ディスクルートで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; 
}); 
0

Laravelはあなたに、このための職人指令を与えるだけ実行します。

php artisan config:cache 

これは、2つのコマンド設定を実行します:はっきりと設定:キャッシュを、このことを願っています助けてください。

+0

いいえ..既にLaravelがfilesystems.phpを実行すると、tenant_path()ヘルパーがまだロードされていないようです。 – ZeroOne

関連する問題