【问题标题】:How to serve index.html with Laravel?如何使用 Laravel 提供 index.html?
【发布时间】:2014-10-14 14:30:03
【问题描述】:

我很难理解有人如何使用 Laravel 加载 index.html 文件。它似乎只适用于我不想要的 index.php。

这里有个问题:

我有两个文件夹 clientserver。我的 server 文件夹包含整个 Laravel 应用程序。我的 client 目录包含 AngularJS 应用程序。 (我不能使用 public 目录)

我希望 Laravel 提供 index.html 以及 client 目录中的所有静态文件。

更改'public' => __DIR__.'/../public' 确实有点作用,但它破坏了我的所有路由,即无论我为 URL index.html 输入什么内容都会加载损坏的静态资产。例如,/api/users 不再返回 JSON 对象,而是返回相同的 index.html

【问题讨论】:

  • 是否存在特定领域的原因,您不能使用刀片模板来为您的 Angular 应用程序提供服务?
  • @watcher 我正在使用 PHP 以外的其他语言。由许多使用各种语言的框架提供服务的单个 client 目录。
  • 你的项目目录结构是什么?您最好默认为您的 Angular 应用程序而不是 laravel 提供服务,而是尝试引导 laravel 仅针对它要处理的请求而不是相反的方式(如果这就是您正在尝试的并且我理解您正确)
  • @watcher 您建议的方法需要启用我不知道该怎么做的跨源请求策略,因为我将需要通过例如python -m SimpleHTTPServer 和另一个 Laravel 服务器开始提供 AngularJS港口。

标签: php laravel


【解决方案1】:

如果您想使用php artisan serve 为本地开发服务,请在“server.php”中更改以下行

    if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
        return false;
    }

    require_once __DIR__.'/public/index.php';

    if ($uri === '/') {
        $uri = "/index.html";
        return false;
    }
    if (file_exists(__DIR__.'/public'.$uri)) {
        return false;
    }

    require_once __DIR__.'/public/api/index.php';

现在您可以将“index.html”作为默认文档。

仅当 Angular 构建输出位于公用文件夹中且子文件夹中有 laravel api(index.php 和 .htaccess)时才有效。

希望它可以帮助某人!

【讨论】:

    【解决方案2】:

    我不确定你的文件结构是怎么回事,但是,通过你可以使用的 php 引擎加载 html 文件:

    View::addExtension('html', 'php');
    

    那么,

    Route::get('/', function()
    {
        return View::make('index');
    });
    

    应该返回 index.html。

    【讨论】:

    • 希望 TS 可以将此标记为已接受的答案。也遇到了这个问题并添加了addExtension。它现在接受 php 或 html 文件。
    • 你把代码View::addExtension('html', 'php')放在哪里?
    【解决方案3】:

    我相信我现在了解你了。这是一个潜在的解决方案,假设目录结构类似于以下内容:

    /
        /client
            index.html 
        /server
            /app
            /bootstrap
            /public
            /vendor
            ...
    

    在 Laravel 中使用刀片模板。您的案例非常独特,因此它不会是“普通”刀片模板。它可能看起来像这样:

    {{ file_get_contents(base_path() . '../client/index.html') }}
    

    如果您可以改为在 /client 目录中使用 index.php 文件,它也可能如下所示:

    <?php include base_path() . '../client/index.php'; ?>
    

    我只是指出这一点,因为如果您需要或希望的话,您可以在文件中使用其他 PHP 语句。您还可以使用普通的View::make('angular')-&gt;with('var', $var) 将数据从控制器一直向下传递到这个index.php 文件中,它们将自动在范围内。

    这似乎有点 hacky,确实如此,但应该让您不必修改任何其他内容。当然,您的 index.html 文件应该包含 Angular 应用程序的整个标记。另一个好处是,由于您几乎仍然完全包含在 Laravel 中,因此您可以将东西“向上”移出您的 Angular 应用程序,并在不需要时(无论出于何种原因)返回到框架中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2020-05-20
      相关资源
      最近更新 更多