fomvasss / laravel-url-aliases
在 Laravel 项目中使用 url-aliases
3.12.0
2022-08-23 14:16 UTC
Requires
- php: >=7.1
- illuminate/database: 5.7.*|5.8.*|^6.0|^7.0|^8.0|^9.0
- illuminate/support: 5.7.*|5.8.*|^6.0|^7.0|^8.0|^9.0
README
安装
- 使用 composer 安装此包
composer require fomvasss/laravel-url-aliases
- 发布包资源
php artisan vendor:publish --provider="Fomvasss\UrlAliases\ServiceProvider"
- config
- migration
- 运行迁移
php artisan migrate
集成
- 将以下特质添加到你的模型中:
Fomvasss\UrlAliases\Traits\UrlAliasable
此特质具有以下关系方法
urlAlias()
- 相关的 UrlAlias 模型
获取列表时,不要忘记在模型中使用
with('urlAlias')
!
- 将中间件添加到
Http/Kernel.php
protected $middleware = [ //... \Fomvasss\UrlAliases\Middleware\UrlAliasMiddleware::class, ];
用法
门面
\Fomvasss\UrlAliases\Facades\UrlAlias::route('article.show', $article)
\Fomvasss\UrlAliases\Facades\UrlAlias::current()
辅助函数
route_alias()
- 与 Laravel 辅助函数route()
作用相同url_alias_current()
- 返回别名路径(如果不存在别名,则返回系统路径)prepare_url_path()
- 返回 URL 的路径: https://your-site.com/my-first-page/example/ -> my-first-page/example
示例用法
routes/web.php
:
Route::group(['namespace' => 'Front'], function () { //... Route::get('article', 'ArticleController@index')->name('article.index'); Route::get('article/{id}', 'ArticleController@show')->name('article.show'); Route::post('article', 'ArticleController@store')->name('article.store'); //... });
app/Http/Controllers/Front/ArticleController.php
:
public function index(Request $request) { $articles = \App\Models\Article::paginate($request->per_page); // foreach($articles as $article) { // dump(route_alias('article.show', $article)); // } return view('article.index', compact('articles')); } public function store(Request $request) { $article = \App\Models\Article::create($request->only([ //... ]); // 1) Make alias for system route: $article->urlAlias()->create([ 'source' => trim(route('article.show', $article, false), '/'), // Ex.: system/article/26 'alias' => str_slug($article->title).'/'.str_slug($article->user->name), // must be unique! Ex.: my-first-article/taylor-otwell ]); // 2) Or custom redirection: $article->urlAlias()->create([ 'source' => 'about', 'alias' => 'page/about' 'type' => 301, // Status Code ]); // 3) Or if external link: $article->urlAlias()->create([ 'source' => 'https://google.com.ua', 'alias' => 'my-google' 'type' => 302, // Status Code ]); return redirect()->route('article.index'); } public function show(Request $request, $id) { $article = \App\Models\Article::findOrFail($id); // dump($article->urlAlias); // dump($article->urlA()); return view('article.show', compact('article')); }
<li><a href="{{ route('article.show', $article->id) }}">System Link - 301 redirect to alias (if exists)</a></li> <li><a href="{{ request()->path() }}">System path - redirect to alias (if exists)</a></li> <li><a href="{{ route_alias('article.index', ['page' => '3', 'per_page' => 15]) }}">All articles</a></li> <li><a href="{{ route_alias('article.show', [$article, 'page' => '3', 'per_page' => 15]) }}">Alias Link to article - absolute path</a></li> <li><a href="{{ route_alias('article.show', $article, false) }}">Alias Link to article - relative path</a></li> <li><a href="{{ route_alias('article.show', ['page' => '3', 'per_page' => 15]) }}">System Link - if not exist alias</a></li> <li><a href="{{ \Fomvasss\UrlAliases\Facades\UrlAlias::route('article.show', $article) }}">Alias Link to article - absolute path</a></li> <li><a href="{{ \Fomvasss\UrlAliases\Facades\UrlAlias::current() }}">Current path (alias or system)</a></li>
在
UrlAlias::current()
(route_alias()
) 的第二个参数(如果为数组,则为第一个索引)可以是id
或\Illuminate\Database\Eloquent\Model
的实例(如 Laravel 辅助函数route
)
使用本地化 URL(开发)
要使用本地化 URL,需要执行以下步骤
- 将以下中间件添加到
Http/Kernel.php
protected $routeMiddleware = [ //... 'applyUrlLocaleToRootPage' => \Fomvasss\UrlAliases\Middleware\ApplyUrlLocaleToRootPage::class, ];
- 在
config/url-aliases.php
中设置: 'use_localization' => true, - 取消注释
config/url-aliases-laravellocalization.php
中需要的区域设置并设置其他参数 - 创建或更改您的首页(根)路由,例如
Route::get('/{locale?}', function () { return view('home'); })->name('home')->middleware('applyUrlLocaleToRootPage');
- 为实体保存别名并设置区域
$article->urlAlias()->create([ 'source' => trim(route('system.article.show', $article, false), '/'), // Ex.: system/article/26 'alias' => str_slug($article->title).'/'.str_slug($article->user->name), // Must be unique! Ex.: my-first-article/taylor-otwell 'locale' => 'en', 'locale_bound' => 123, // for related locale aliases ]);
- 使用门面
UrlAliasLocalization
和以下方法(如 mcamara/laravel-localization)
UrlAliasLocalization::getDefaultLocale() UrlAliasLocalization::getCurrentLocale() UrlAliasLocalization::getCurrentLocaleName() UrlAliasLocalization::getCurrentLocaleNative() UrlAliasLocalization::getCurrentLocaleNativeReading() UrlAliasLocalization::getCurrentLocaleRegional() UrlAliasLocalization::getCurrentLocaleDirection() UrlAliasLocalization::getCurrentLocaleScript() UrlAliasLocalization::getLocalesOrder() UrlAliasLocalization::getSupportedLocales() UrlAliasLocalization::getSupportedLanguagesKeys() UrlAliasLocalization::getRoot() // http://site.com/ua, http://site.com/de UrlAliasLocalization::getCurrentBound() // Get locales and links to related locale aliases UrlAliasLocalization::getLocaleModelBound() UrlAliasLocalization::getLocalesModelsBound()