fomvasss/laravel-url-aliases

在 Laravel 项目中使用 url-aliases

安装次数: 558

依赖: 0

建议者: 0

安全: 0

星标: 8

关注者: 4

分支: 1

开放问题: 0

类型:composer-package

3.12.0 2022-08-23 14:16 UTC

README

License Build Status Latest Stable Version Total Downloads Quality Score

安装

  1. 使用 composer 安装此包
composer require fomvasss/laravel-url-aliases
  1. 发布包资源
php artisan vendor:publish --provider="Fomvasss\UrlAliases\ServiceProvider"
  • config
  • migration
  1. 运行迁移
php artisan migrate

集成

  1. 将以下特质添加到你的模型中: Fomvasss\UrlAliases\Traits\UrlAliasable

此特质具有以下关系方法

  • urlAlias() - 相关的 UrlAlias 模型

获取列表时,不要忘记在模型中使用 with('urlAlias')

  1. 将中间件添加到 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,需要执行以下步骤

  1. 将以下中间件添加到 Http/Kernel.php
    protected $routeMiddleware = [
        //...
        'applyUrlLocaleToRootPage' => \Fomvasss\UrlAliases\Middleware\ApplyUrlLocaleToRootPage::class,
    ];
  1. config/url-aliases.php 中设置: 'use_localization' => true,
  2. 取消注释 config/url-aliases-laravellocalization.php 中需要的区域设置并设置其他参数
  3. 创建或更改您的首页(根)路由,例如
Route::get('/{locale?}', function () {
    return view('home');
})->name('home')->middleware('applyUrlLocaleToRootPage');
  1. 为实体保存别名并设置区域
    $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
    ]);
  1. 使用门面 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()

链接