在Laravel中将Public添加到资产路径

时间:2015-09-27 16:35:31

标签: php laravel laravel-5

我想在共享托管中安装laravel,我按照https://stackoverflow.com/a/28449523中的步骤操作,但我的资产路径并未包含公共目录

而不是这个

<link href='http://example.com/public/assets/css/style.css' type='text/css' media='all' />

我得到了这个

<link href='http://example.com/assets/css/style.css' type='text/css' media='all' />

如何在不更改任何核心类的情况下更改资产文件夹的目录(将公共内容添加到资源)?

4 个答案:

答案 0 :(得分:3)

查看Illuminate\Routing\UrlGenerator类及其asset($path, $secure = null)方法。这个类被url键放到容器中。你能做的是:

  1. 添加您自己的课程,展开UrlGenerator;
  2. asset($path, $secure = null)方法添加到您自己的类中,使其返回您需要的任何内容;
  3. 创建服务提供商并在config/app.php;
  4. 中注册
  5. 在您的服务提供商的register()方法中,绑定您的新课程 通过url键到容器。
  6. 这样,您根本无法触摸核心文件,而且您的Laravel应用程序仍然更新友好。

答案 1 :(得分:1)

相对容易的黑客方法是在\ vendor \ laravel \ framework \ src \ Illuminate \ Routing \ UrlGenerator.php 中的asset()函数的返回值中添加文件夹

static void Main(string[] args)
{
    using (var client = new HttpClient())
    {
        using (var response = client.GetAsync("https://example.com/").Result)
        {
            if (response.Content is StreamContent)
            {
                var webExceptionWrapperStream = GetPrivateField(response.Content, "content");
                var connectStream = GetBasePrivateField(webExceptionWrapperStream, "innerStream");
                var connection = GetPrivateProperty(connectStream, "Connection");
                var tlsStream = GetPrivateProperty(connection, "NetworkStream");
                var state = GetPrivateField(tlsStream, "m_Worker");
                var protocol = (SslProtocols)GetPrivateProperty(state, "SslProtocol");
                Console.WriteLine(protocol);
            }
            else
            {
                // not sure if this is possible
            }
        }
    }
}

private static object GetPrivateProperty(object obj, string property)
{
    return obj.GetType().GetProperty(property, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(obj);
}

private static object GetPrivateField(object obj, string field)
{
    return obj.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(obj);
}

private static object GetBasePrivateField(object obj, string field)
{
    return obj.GetType().BaseType.GetField(field, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(obj);
}

请注意,我已根据条件在返回值中添加了public。这样也可以做到。

答案 2 :(得分:0)

在您的 .env 文件中添加 ASSET_URL = public 并运行 php artisan config:cache

答案 3 :(得分:0)

对于最新版本的Laravel-Laravel 5.8,在 config / app.php 中有一个名为 asset_url 的密钥。该键的值确定 asset()方法返回的值。通常,如果所有资产文件夹都位于默认位置(此默认位置是Laravel安装根目录下的 public 文件夹),则应将此密钥的值设置为网站的基本URL。 )。

例如,如果您的网站URL为“ https://www.example.com”,并且您想访问根文件夹下的资产路径 public / assets / css / sample.css ,请在config / app.php像这样:

T

并使用资产功能,如下所示:

'asset_url' => env('ASSET_URL', 'https://www.example.com'),

此后,通过在laravel安装文件夹中运行缓存来重新配置缓存:

asset('assets/css/sample.css')

这将更新 bootstrap / cache / config.php 文件。如果您检查浏览器,则资产的生成URL将为“ https://www.example.com/assets/css/sample.css”。

拥有有效网址(例如:“ https://www.example.com/public/assets/css/sample.css”)的一种方法是,在已经存在的公用文件夹中创建另一个名为 public 的文件夹-这对我来说是不直观的。 但是,如果这样做,则在使用资产功能时必须包括以下路径:

php artisan config:cache