Laravel 用于另一个 fw 中的子部分时的索引路由问题(外部 public 目录)

Laravel index route issue when using for a subsection in another fw (external public dir)

我正在使用带有外部 public 目录的 Laravel 应用程序,例如root/Laravel,和 root/html/public

我需要这个应用程序从 php 文件 (root/html/this-section.php) 上的需求加载,该文件已经有另一个框架加载它,因此其他 fw 有自己的头,并且 body 标签。此应用程序将在该文件的 header 和页脚之间加载。

当我设置路线时,我注意到以下两条路线都有效,但我得到了不同的结果。

Route::get('/', 'HomeController@index');
Route::get('/this-section', 'HomeController@index');

# this also works as a substitute for above, still same issue though
Route::get('//', 'HomeController@index');

这些是相同的页面,控制器具有相同的代码,我希望页面加载相同。发生的事情是主索引 site.com/ 加载正确,但后者加载时没有 this-section.php 上存在的 html <head><body> 标签。所以本质上,后者没有加载 parent 页面,它只加载它在 blade 模板上看到的内容。

我怀疑可能需要对 .htaccess 添加重写来解决这个问题,或者设置自定义重定向或 return 控制器中的视图或响应 (我需要在这里提供建议) 然后我可以在其中制作第二种方法,例如thisSectionIndex() 和 return 那个建议。

起初我有一些事情是将 public_path() 覆盖到正确的路径 this-section 但是当我制作子路线时适得其反 例如使用以下路线设置时

Route::get('/', 'HomeController@index');
Route::get('/feature', 'SectionController@feature');

它导致 feature 路由为 500 或 404,我认为它找不到文件,所以我意识到我需要 不幸的是 添加/this-section 路线的一部分,这几乎打开了一堆蠕虫。

Route::get('/', 'HomeController@index'); Route::get('/this-section', 'HomeController@index'); Route::get('/this-section/feature', 'SectionController@feature');

附带说明一下,我已经找到一个临时 work-around 的一些后果 {{assets()}} 坏了。我已将 assets() 覆盖为不必使用 this-section/ 部分,例如像这样 {{assets(/this-section/css/styles.css)}}。临时工作是 unfortunately 必须手动添加路径并放弃在 blade 模板中完全使用 {{assets()}} 直到我弄清楚那部分,因为现在没有路径适用于它们。

一些背景信息:

我正在像这样覆盖 public 路径

#Laravel\app\SectionApplication
class SectionApplication extends \Illuminate\Foundation\Application
{
  public function publicPath()
  {
    $newBasePath =  $this->basePath . DIRECTORY_SEPARATOR . '..' .
      DIRECTORY_SEPARATOR . 'html/this-section';

    return $newBasePath;
  }
}


#Laravel/bootstrap/app.php
// $app = new Illuminate\Foundation\Application(
//     realpath(__DIR__.'/../')
// );

$app = new App\SectionApplication(
    realpath(__DIR__.'/../')
);

这是 laravel 引导程序索引 (html/this-section/index.php)

的相关(调整后)部分
function public_path($path = '')
{
  return realpath(__DIR__);
}

//adjust your relative laravel framework path here
$laravelRelPath = '../../Laravel';

//override the blade {{asset()}} helper
function asset($path, $secure = null)
{
  $newPubPath = 'this-section/'; //relative from html where the index.php will be
  return app('url')->asset($newPubPath . $path, $secure);
}

.htaccess 位于 Laravel 之外,在 html/

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    #Rewritebase /this-section/
    #RewriteRule ^(.*)$ this-section/ [L]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

this topic的帮助下 this topic 我找到了可行的解决方案。当您在应用程序中加载时需要进行调整。您希望从与文件加载 bootstrap 相同的路径 bootstrap 它,然后仅覆盖该特定路径的 .htaccess。

  1. 将laravels bootstrap文件html/this-section/index.php文件上移一个目录,在文件html/this-section.php旁边,并将其重命名为[=13] =]

  2. 通过删除一个目录 ../

    调整 html/this-section-laravel-boostrap.php 上 laravel 的路径
    • 例如从 $laravelRelPath = '../../Laravel';$laravelRelPath = '../Laravel';
  3. 将以下代码添加到htlm/this-section.php(文件加载bootstrap)

if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) { require_once('this-section-laravel-bootstrap.php'); }

  1. 将以下内容添加到 .htaccess 以获取 uri

#Rewritebase / RewriteRule ^this-section/?$ / [L,NC]

  1. this-section
  2. 所需的唯一路线

Route::get('/this-section', 'HomeController@index')

  1. 在您的 blade 模板中,像这样调用您的资产,以便它们加载到每个子部分 url,例如css

<link rel="stylesheet" href="/this-section/css/styles.css">

应用程序现在 bootstrap,并始终使用加载它的 parent 文件中的外部内容。请参阅下面的示例 parent 测试文件 (html/this-section.php)。

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>Parent Application</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body>
    <header>
        <nav>
            <ul>
                <li>menu</li>
            </ul>
        </nav>
    </header>
  <?php
        <--! laravel sandwich -->
        if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) {
            require_once('this-section-laravel-bootstrap.php');
        }
  ?>
    <footer>
        <p>Copyright <?php echo date('Y'); ?> - All rights reserved.</p>
    </footer> -->
</body>
</html>

奖金 资产现在正在正确加载,您可能不需要第 5 步。 {{asset('css/vendors.css')}}