2016-03-31 18 views
2

Ich brauche etwas Hilfe.Laravel 5 Mehrere Öffentliche Ordner Asset-Funktion

Ich möchte eine Multisite von nur einer Laravel 5.1-Installation erstellen. Ich lese mehrere .env basierend auf Sub-Domain.

Aber ich möchte jede Website hat einen eigenen öffentlichen Ordner.

So zum Beispiel mit diesem Ordner:

-> public 
-> custom_publics 
    -> user1 
    -> user2 
    -> etc 

ich public_path() einstellen kann, aber wenn ich versuche, es zu bekommen mit asset() Funktion funktioniert nicht.

Zum Beispiel: Ich habe eine image.png auf http://user2.test.on/custom_publics/user2/image.png. Ich ändere public_path() zu custom_publics/user2. Aber wenn Anruf gibt mir http://user2.test.on/image.png und nicht existiert.

Es gibt eine Möglichkeit, auf http://user2.test.on/image.png zu zeigen, aber geht wirklich auf http://user2.test.on/custom_publics/user2/image.png?

Oder, wie kann ich Asset-Pfad festlegen?

Jeder hat es versucht? Irgendeine Hilfe?

Grüße, Eric.

+0

versuchen, dies zu lesen Ich denke, es wird Ihnen helfen, und lassen Sie mich wissen, ob das tut https://laracasts.com/discuss/channels/laravel/is-it-possible-to-set- different-assets-directory –

Antwort

0

Eine Möglichkeit, dies möglicherweise zu lösen, ist die Verwendung von Apache Neuschreiben, so dass eine Anforderung an http://user2.test.on/image.png tatsächlich an http://test.on/custom_publics/user2/image.png geht.

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*)\.test\.on 
RewriteRule ^(.*)$ http://test.on/custom_publics/%1/$1 [L,NC,QSA] 

Möglicherweise müssen Sie das obige Beispiel für Ihren speziellen Zweck optimieren. Weitere Informationen finden Sie hier: .htaccess rewrite subdomain to directory

+0

Ja, ich kenne diese Antwort, aber ich muss mehrere Seiten einstellen. Ich kann kein 'htaccess' mit allen Seiten erstellen. Ich brauche eine dynamische Funktion –

1

Ok, endlich bekomme ich die Antwort.

eine AssetsController Controller wie folgt erstellen:

<?php 

namespace app\Http\Controllers; 

use Illuminate\Support\Facades\File; 
use Illuminate\Support\Facades\Response; 
use app\Http\Controllers\Controller; 
use Redirect; 

class AssetsController extends Controller 
{ 
    /** 
    * Get asset url and return response based on file type 
    * 
    * @param $filename 
    * @return mixed 
    */ 
    public function data($filename) 
    { 
     $path = public_path().'/'; // You need to change your public path before this 
     $path = $path.$filename; 

     $file = File::get($path); 
     $type = File::mimeType($path); 

     $response = Response::make($file, 200); 
     $response->header("Content-Type", $type); 

     return $response; 
    } 

} 

So, jetzt muss ich Asset-Hilfsfunktion ändern. Ich habe einen Serviceprovider, um die Magie Register unter make config/app.php:

<?php 

namespace app\Providers; 

use Illuminate\Support\ServiceProvider; 

class SitePathServiceProvider extends ServiceProvider 
{ 

    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    protected $defer = false; 

    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Reset asset function 
    * 
    * @param $path 
    * @return string 
    */ 
    public function asset($path) 
    { 
     return url('assets/'.$path); 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     // 
    } 
} 

Der Trick ist, eine Route Helfer zu tun:

Route::get('/assets/{params}', '[email protected]')->where('params', '.*'); 

Diese Strecke fangen alle URL wie:

http://www.example.com/assets/demo.jpg 
http://www.example.com/assets/uploads/demo.jpg 
http://www.example.com/assets/large/structure/folder/demo.jpg 

Ich weiß, es ist etwas kompliziert, aber funktioniert wie ein Charme.

König in Bezug auf