2

I need some help.

I want to create a multisite from only one Laravel 5.1 installation. I read multiple .env based on subdomain.

But I want to every site has its own public folder.

So for example with this folders:

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

I can set public_path() but when I try to get it with asset() function doesn’t work.

For example: I have a image.png on http://user2.test.on/custom_publics/user2/image.png. I change public_path() to custom_publics/user2. But when call asset(image.png)gives me http://user2.test.on/image.png and not exists.

There is some way to point to http://user2.test.on/image.png but really goes to http://user2.test.on/custom_publics/user2/image.png ?

Or, how can I set asset() function path?

Any one has tried? Any help?

Regards, Eric.

Eric Lagarda
  • 302
  • 2
  • 11
  • try reading this I think it will help you, and let me know if that does https://laracasts.com/discuss/channels/laravel/is-it-possible-to-set-different-assets-directory – Maytham Fahmi Mar 31 '16 at 15:22

2 Answers2

3

Ok, I finally get the answer.

Create an AssetsController controller like this:

<?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 now, I need to change asset helper function. I created a ServiceProvider to make the magic Register under 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()
    {
        //
    }
}

The trick is to do a route helper:

Route::get('/assets/{params}', 'AssetsController@data')->where('params', '.*');

This route catch all url like:

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

I know it's something complicated, but works like a charm.

King regards

Eric Lagarda
  • 302
  • 2
  • 11
1

One way to potentially solve this is by using Apache rewrites so that a request to http://user2.test.on/image.png actually goes to http://test.on/custom_publics/user2/image.png.

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

You might need to tweak the above example for your specific purpose. See more information here: .htaccess rewrite subdomain to directory

Community
  • 1
  • 1
Evan Taylor
  • 216
  • 3
  • 9
  • Yes I know that answer, but I need to set multiple sites. I can't create an `htaccess`with all sites. I need a dynamic function – Eric Lagarda Apr 01 '16 at 07:42