Laravel 5多个公用文件夹资产功能

时间:2016-03-31 14:20:31

标签: php laravel-5 multisite

我需要一些帮助。

我想从一个Laravel 5.1安装中创建一个多站点。我根据子域读取了多个.env

但我想每个网站都有自己的公共文件夹。

例如,使用此文件夹:

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

我可以设置public_path(),但当我尝试使用asset()功能时,该功能无效。

例如:我在http://user2.test.on/custom_publics/user2/image.png上有一个image.png。我将public_path()更改为custom_publics/user2。但是,当致电asset(image.png)给我http://user2.test.on/image.png而不存在时,

有一些方法指向http://user2.test.on/image.png,但实际上是http://user2.test.on/custom_publics/user2/image.png

或者,我如何设置asset()函数路径?

有人试过吗?有帮助吗?

此致,Eric。

2 个答案:

答案 0 :(得分:2)

好的,我终于得到了答案。

像这样创建一个AssetsController控制器:

<?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;
    }

}

所以现在,我需要更改资产助手功能。我创建了一个ServiceProvider来在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()
    {
        //
    }
}

诀窍是做一个路线助手:

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

此路线捕获所有网址:

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

我知道它有点复杂,但却像魅力一样。

尊敬的

答案 1 :(得分:0)

可能解决此问题的一种方法是使用Apache重写,以便http://user2.test.on/image.png的请求实际转到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]

您可能需要针对特定​​目的调整上述示例。请在此处查看更多信息:.htaccess rewrite subdomain to directory