带有 Laravel 的 Google AMP

Gen*_*ble 9 laravel amp-html laravel-blade

我最近推出了一个基于 laravel 的电子商务网站。现在我真的认为实施 AMP 是个好主意,因为它现在支持电子商务(甚至 shopify 和 ebay 也在实施它)

所以我的问题是我们如何在 Laravel 上实现 AMP?有没有办法在桌面版上使用 desktopMainTempalte.blade.php 并在移动版上切换到 mobileMainTemplate.blade.php?我只是不想为移动设备创建一个不同的域作为 m.domain.com。我想要一些有创意的东西,但我不确定我是否朝着正确的方向前进。

如果你在我的鞋子里,你们会做什么?

Mah*_*yfo 7

使用不同的路由和控制器来做同样的事情但使用不同的视图是非常困难的。您可以这样做以获得更好的方法。

  1. /amp/url使用相同的 Web 控制器
  2. 通过修改view()助手以不同的方式查看放大器页面

放大器路线

要捕捉/amp/路线,请将其添加到您的RouteServiceProvider.php

protected function mapAmpRoutes()
{
    Route::group([
        'middleware' => 'web',
        'namespace' => $this->namespace,
        'prefix' => 'amp',
    ], function ($router) {
        require base_path('routes/web.php');
    });
}
Run Code Online (Sandbox Code Playgroud)

还要改变你的map方法:

public function map()
{
    $this->mapAmpRoutes(); // <-- Add this

    $this->mapWebRoutes();

    $this->mapApiRoutes();
}
Run Code Online (Sandbox Code Playgroud)

此时所有的地址example.com/amp/...都将引用您的web.php路由。

放大器视图文件

现在您应该自定义view()助手来为放大器呈现不同的视图。使用视图函数创建一个helpers.phpinapp/Http目录:

function view($view = null, $data = [], $mergeData = [])
{
    $factory = app(Illuminate\Contracts\View\Factory::class);

    if (func_num_args() === 0) {
        return $factory;
    }

    //if amp, add '-amp' to view name
    if(request()->segment(1) == 'amp'){
        if(view()->exists($view . '-amp')){
            $view .= '-amp';
        }else{
            abort(404);
        }
    }
    return $factory->make($view, $data, $mergeData);
}
Run Code Online (Sandbox Code Playgroud)

在您将其添加到bootstrap/autoload.php文件中之前,不会加载此函数

require __DIR__.'/../app/Http/helpers.php'; // <-- add this (should be before require vendor/autoload.php)
require __DIR__.'/../vendor/autoload.php';
Run Code Online (Sandbox Code Playgroud)

编辑:如果找不到bootstrap/autoload.php文件,请搜索,vendor/autoload.php因为 laravel 已将其删除。(感谢MinderMondo的评论)

您现在可以为带有“-amp”词缀的 amp 添加任何您喜欢的视图。例如,如果您index.blade.php的放大器视图名称应该是index-amp.blade.php.

  • 哦明白了!我正在使用 Laravel 5.6,但我错过了包含 helpers.php 文件。bootstrap 文件夹中没有 autoload.php。这应该包含在 vendor/autoload.php 中。此更改是在 https://github.com/laravel/laravel/commit/8914be5fc864ebc6877be38ff3502997e0c62761 中进行的,谢谢! (3认同)