cogniteq / maxfactor-support
Laravel PHP项目支持和辅助工具
Requires
- dannyvankooten/laravel-vat: ^2.0.4
- dereuromark/media-embed: ^0.4.1
- laravel/framework: >=5.5
- laravelium/sitemap: ^2.0|^3.0|^6.0|^7.0
- spatie/laravel-view-components: ^1.1
- symfony/intl: ^4.0
Requires (Dev)
- dev-master
- 2.7.7
- 2.7.6
- 2.7.5
- 2.7.3
- 2.7.2
- 2.7.1
- 2.7.0
- 2.6.12
- 2.6.11
- 2.6.10
- 2.6.9
- 2.6.8
- 2.6.7
- 2.6.6
- 2.6.5
- 2.6.4
- 2.6.3
- 2.6.2
- 2.6.1
- 2.6.0
- 2.5.0
- 2.4.0
- 2.3.1
- 2.3.0
- 2.2.4
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.0
- 2.0.6
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.4.1
- 1.4.0
- 1.3.1
- 1.3.0
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.0
- v1.0.1
- 1.0.0
- dev-task-laravel-7
- dev-task-search-results
- dev-task-laravel6
- dev-nova-meta-attributes
This package is not auto-updated.
Last update: 2024-09-19 23:36:54 UTC
README
作者
概述
一组在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