【问题标题】:Laravel 5 Multiple public folder asset functionLaravel 5 多公用文件夹资产功能
【发布时间】:2016-07-20 01:35:33
【问题描述】:

我需要一些帮助。

我只想从一个 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()函数路径?

有人试过吗?有什么帮助吗?

问候,埃里克。

【问题讨论】:

标签: php laravel-5 multisite


【解决方案1】:

可能解决此问题的一种方法是使用 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

【讨论】:

  • 是的,我知道答案,但我需要设置多个站点。我无法为所有站点创建htaccess。我需要一个动态函数
【解决方案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', '.*');

这条路线捕获所有 url,如:

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

我知道这很复杂,但效果很好。

国王的问候

【讨论】:

    猜你喜欢
    • 2015-08-08
    • 2017-04-02
    • 2016-04-18
    • 2018-01-14
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多