cogniteq/maxfactor-support

Laravel PHP项目支持和辅助工具

2.7.7 2021-03-10 08:46 UTC

README

Packagist

作者

概述

一组在Web项目中常用到的辅助方法和类

模型

更通用的辅助方法,适用于不仅仅面向前端网页的页面。

活动状态

确保记录可以是活动或非活动状态(例如,草稿状态)。将特质添加到您的模型中,并将字段添加到迁移中。

use Maxfactor\Support\Model\Traits\HasActiveState;
$table->active();

防止访问非活动模型

默认情况下,配置选项canViewInactive设置为true,因此所有查看内容的请求都将获得授权。为了防止未经授权访问非活动内容,可以在服务提供程序中注册全局viewInactive门,或通过策略按模型基础进行。如果门失败,包将中止一个503错误。

public function viewInactive($user, $model)
{
    if (config('maxfactor-support.canViewInactive')) {
        return true;
    }

    // Your logic... (Gate::allows() etc)

    return false;
}

特色状态

允许记录成为特色。

use Maxfactor\Support\Model\Traits\CanBeFeatured;
$table->featured();

排序顺序

允许记录进行排序(顺序)。将特质和可排序合约添加到您的模型中。

use Spatie\EloquentSortable\Sortable;
use Maxfactor\Support\Model\Traits\HasSortOrder;

class Category extends Model implements Sortable
{
    use HasSortOrder;
    ...
}

迁移助手 ...

$table->sortable();

包含一个查询作用域,以便您可以在不手动定义orderBy的情况下访问排序结果。

$results = Model::sorted()->get();

网页

一组与面向公众的网页相关的辅助方法和特质。

通常,任何与前端视图交互的模型应扩展Maxfactor\Support\Webpage\Model而不是默认的Eloquent模型。这将确保其他特质可以正确初始化。

重要:为了尝试创建一致性,传递到视图中的主要模型始终应称为$page。这使得在布局和其他共享组件中包含默认行为变得更加容易,而无需显式传递值。

return view('my.view')->with('page', $model)

元数据(包括浏览器标题)

Maxfactor\Support\Webpage\Traits\HasMetaAttributes特质添加到您的模型中,并通过添加元字段包含迁移。这包括正确的数据库列,并默认为覆盖

  • h1
  • browserTitle
  • metaDescription
  • navTitle
$table->meta();

在布局中包含此内容以渲染浏览器标题

@render('maxfactor:webpage::browserTitle', ['title' => Arr::get($page ?? [], 'browserTitle', config('app.name'))])

这是一个预先制作的组件,用于渲染元描述

@render('maxfactor:webpage::metaDescription', ['description' => Arr::get($page ?? [], 'metaDescription')])

在Nova中包含额外的元字段

您可以将额外的元字段传递给MetaAttributes::make()函数,以在包创建的“元属性”面板中显示您自己的字段。

// Define our additional fields in the resource.
protected function additionalMetaFields()
{
    return [
        Text::make('Example Meta Content'),
    ];
}

// Inside the resources fields() function we can pass in our additional fields as a parameter.
MetaAttributes::make($this->additionalMetaFields()),

别名

如果您想使路由辅助工具使用数据库中的slug列来识别记录,请将Maxfactor\Support\Webpage\Traits\HasSlug特质添加到您的模型中。(例如,/blog/article/foo而不是/blog/article/1)。

在您的迁移中,您只需使用别名助手即可将正确的列添加到您的表中。$table->slug()

面包屑

使用Maxfactor\Support\Webpage\Traits\HasBreadcrumbs特质(如果您正在使用Webpage模型,则已包含)。覆盖seeds()方法以返回自定义面包屑,或使用seed()方法将您需要的任何面包屑推送到父种子以添加额外的面包屑。

public function seeds()
{
    return array_merge(parent::seeds(), [[
        'name' => __('Branch finder'),
        'url' => route('branch.index'),
    ], [
        'name' => $this->navTitle,
        'url' => route('branch.show', $this),
    ]]);
}
// Branch Controller
$branch->seed($name = __('Audiologists'), $url = route('branch.audiologists', $branch), $status = null);

在您的blade视图中,渲染面包屑@include('maxfactor::components.breadcrumb', ['seed' => $page->breadcrumbs])。如有必要,请用您自己的视图替换。

设置默认“主页”面包屑

要更改默认主页面包屑,您可以设置homeBreadcrumb配置值。

// config/maxfactor-support.php
'homeBreadcrumb' => 'Home',

规范

包含MustHaveCanonical特质,它默认将返回当前URL,但您通常可以指定自己的。

这可以在模型上完成...

public function baseCanonical()
{
    return route('branch.show', $this);
}

或者直接使用(例如在控制器中)。这将优先于baseCanonical

$branch->canonical($url);

在您的blade布局(或视图)的头部渲染canonical元字段。

@include('maxfactor::components.canonical')

Maxfactor外观还包括一个额外的辅助方法,可以用来处理canonical URL中的查询字符串参数。urlWithQuerystring方法接受所需的URL和一个字符串或正则表达式,以过滤要包含在输出中的参数。查询值来自当前请求查询,即使目标URL不必与此匹配。以下是一个如何使用它来包含分页的示例。

// Assuming the current url is https://example.com/journal?page=2&tag=news

Maxfactor::urlWithQuerystring('https://example.com/blog', $allowedParameters = 'page=[^1]');

// returns https://example.com/blog?page=2

网站地图

要生成网站地图,只需创建一个新的命令并扩展此包中的MakeSitemap命令。然后将其添加到您的控制台内核并按需安排。以下是用作起始点的模板。

<?php
namespace App\Console;

use Maxfactor\Support\Webpage\Commands\MakeSitemap;

class Sitemap extends MakeSitemap
{
    /**
     * Populate the sitemap. This method should be overloaded to add content.
     *
     * @param Sitemap $sitemap
     * @return void
     */
    public function populate($sitemap)
    {
        // $sitemap->add('/url');
    }
}

强制域名和SSL

搜索引擎应该只索引单个URL的内容,因此您的网站应该仅在其主域名上提供服务。我们提供了一个中间件来处理此操作,同时还允许使用多个域名(如果您正在运行特定域名的路由)。

Maxfactor\Support\Webpage\Middleware\ForceDomain::class添加到您的Kernel中的web中间件组。

默认情况下,它将使用来自app.url配置值的方案(HTTP/HTTPS)和域名。您可以在.env中指定额外的域名。

ALLOWED_DOMAINS="sub1.mydomain.com,sub2.mydomain.com"

此外,您可以在maxfactor-support配置中指定应通过域名验证器的响应代码。

'enforceDomainsStatusCodes' => [
    \Symfony\Component\HttpFoundation\Response::HTTP_OK,
    \Symfony\Component\HttpFoundation\Response::HTTP_MOVED_PERMANENTLY,
    \Symfony\Component\HttpFoundation\Response::HTTP_TEMPORARY_REDIRECT,
    \Symfony\Component\HttpFoundation\Response::HTTP_PERMANENTLY_REDIRECT,
],

密码保护

如果您想保护在特定环境中(例如预发布)对您的应用程序或某些路由的访问,您可以包括Maxfactor\Support\Webpage\Middleware\EnvironmentAuth::class中间件,根据需要在整个组或特定路由上命名中间件。

protected $routeMiddleware = [
    ...
    'auth.environment' => \Maxfactor\Support\Webpage\Middleware\EnvironmentAuth::class,
];

这将要求访客在auth.php配置中指定的环境中使用有效的用户账户登录(默认为staging)。

    // config/auth.php

    ...
    /*
    |--------------------------------------------------------------------------
    | Environments
    |--------------------------------------------------------------------------
    |
    | Determine which environments should be password protected.
    |
    */

    'environments' => [
        'staging',
    ],

搜索功能

这里有许多有用的工具来实现搜索功能。我们推荐的方法是使用nicolaslopezj/searchable,因为它直接在数据库查询上工作,无需任何第三方索引系统。它也非常容易定制和定义规则以确定最相关的搜索结果。但是,您应该能够使用Scout或其他搜索实现。唯一强加的功能是在模型上存在一个search方法,并且最好在模型上有一个relevance属性,以便对混合结果进行排序。

使模型可搜索

除了遵循搜索提供商的说明(例如nicolaslopezj/searchable)或Scout之外,您还需要实现一个合约和特质以添加所需的功能。

// App\Page.php

class Page extends Model implements Maxfactor\Support\Webpage\Contracts\SearchResult
{
    use Maxfactor\Support\Webpage\Traits\IsSearchResult;

    // Implement the required methods which will be used to standardise search results output

    public function getResultTitleAttribute()
    {
        return $this->nav_title;
    }

    public function getResultSubTitleAttribute()
    {
        return 'Page';
    }

    public function getResultSummaryAttribute()
    {
        return $this->summary;
    }

    public function getResultUrlAttribute()
    {
        return $this->mapped_url;
    }

    public function getResultImageAttribute()
    {
        return $this->image;
    }
}

搜索外观

因此,在您的SearchController或您执行搜索的地方,使用提供的Maxfactor\Support\Facades\Search外观返回结果集合。这将包括搜索中包含的所有模型的任何结果。您可以传递任何Eloquent\Builder实例或Eloquent\Model

$results = Search::for($query)->in([
    Article::published(), // Builder
    app(Page::class), // Model
])->get();

可选地,您可以使用Laravel分页器对结果进行分页。

$results = Search::for($query)->in([
    Article::published(), // Builder
    app(Page::class), // Model
])->paginate(2);

显示结果

要显示结果,遍历返回的集合并显示结果属性。

@foreach($results as $result)
    <a href="{{ $result->result_url }}">
        <img src="{{ $result->result_image }}" alt="{{ $result->result_title }}">
        <h2>{{ $result->result_title }}</h2>
        <h3>{{ $result->result_sub_title }}</h3>
        <p>{{ $result->result_summary }}</p>
    </a>
@endforeach