laracrafts / laravel-geo-routes
针对 Laravel 的地理定位限制路由
Requires
- php: ^7.1
- laravel/framework: ^5.5,<5.9
- stevebauman/location: ^3.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^3.5
- phpunit/phpunit: ^6.0 || ^7.0 || ^8.0
This package is auto-updated.
Last update: 2024-08-29 05:00:22 UTC
README
为 Laravel 提供地理定位限制路由
要求
- Laravel 5.5 或更高版本
- PHP 7.1 或更高版本
安装
通过终端或命令提示符导航到您的项目根目录,并执行以下命令
composer require laracrafts/laravel-geo-routes
注意:如果您正在使用 包发现,可以跳过服务提供者和别名的注册,因为它们会自动注册,但不要忘记按照下面的说明发布配置。
- 注册服务提供者
打开您的 config/app.php 文件,并将以下条目添加到 providers 数组中
LaraCrafts\GeoRoutes\GeoRoutesServiceProvider::class,
- 发布配置
仍在同一文件夹中,请在终端中执行以下命令
php artisan vendor:publish --provider="LaraCrafts\GeoRoutes\GeoRoutesServiceProvider"
用法
常规路由
要快速开始,allowFrom 和 denyFrom 方法允许您根据 地理定位 限制对路由的访问
- 允许来自特定地区的访问
Route::get('/home', 'FooController@bar')->allowFrom('us', 'gb');
上述示例的作用是只允许来自 美国 和 英国 的访问 /home 路由。
或者我们可以这样做
Route::get('/home', 'FooController@bar')->from('us', 'gb')->allow();
默认情况下, 所有其他国家的用户将收到一个 HTTP 401 未授权错误,要更改此行为,您可以在回调部分中描述的回调中使用。
- 拒绝来自特定地区的访问
在第二个示例中,我们将拒绝来自特定位置,例如:加拿大、德国和法国的访问。
Route::get('/home', 'FooController@bar')->denyFrom('ca', 'de', 'fr');
或者
Route::get('/home', 'FooController@bar')->from('ca', 'de', 'fr')->deny();
注意: 此包使用 ISO Alpha-2 国家代码。
注意: 此包使用stevebauman的location 包,请参阅其官方文档以获取有关如何正确配置的详细指南。
路由组
除了允许您控制对常规路由的访问之外,laravel-geo-routes 包还允许您定义路由组,并对其执行相同的技巧。
请考虑以下示例
Route::geo(['prefix' => '/en', function () { Route::get('/', 'HomeController@index'); Route::get('/forums', 'ForumsController@index'); }])->allowFrom('dk', 'gb')->orRedirectTo('error');
注意:如您所注意到的,我们正在使用
geo方法而不是默认的group方法,这将与group方法的行为相同,接受一个属性数组作为第一个参数和一个路由 闭包 作为第二个参数。
注意:只能在调用
geo方法之后使用属性方法,因此您必须编写Route::geo(...)->name('english.');而不是Route::name('english.')->geo(...);
注意:除非使用
from、allow、deny、allowFrom或denyFrom方法应用规则,否则将不会定义路由组。
手动配置
在底层,allowFrom 和 denyFrom 方法在路由上设置了 geo 属性,该属性是一个包含以下参数的数组
- 【数组】
countries:受地理限制覆盖的国家列表。 - 【字符串】
strategy:确定是否允许或拒绝访问,值只能是允许或拒绝。 - 【数组】
callback(可选):访问被拒绝时将调用的回调及其参数。
因此,如果您更倾向于详细说明,您可以按照以下方式定义您的GeoRoutes:
Route::get([ 'geo' => ['countries' => ['us', 'ca'], 'strategy' => 'allow', 'callback' => [$myCallback, $myArgs]] ], function() { // });
您的GeoGroups也可以手动定义,如下例所示:
Route::group([ 'geo' => ['countries' => ['us', 'ca'], 'strategy' => 'allow', 'callback' => [$myCallback, $myArgs]] ], function() { // });
回调函数
如前所述,未经授权用户的默认行为是返回HTTP 401 未授权错误响应,但您仍然可以通过使用回调来更改此行为。
要使用回调,您只需将->orCallback()添加到GeoRoute限制的末尾,如下所示:
Route::get('/forums', 'FooController@bar') ->allowFrom('de', 'ca') ->orCallback();
注意:您还可以与原生路由方法混合使用。
Laravel-geo-routes提供了一些有用的内置回调,以下将列出它们及其用例。
orNotFound
orNotFound回调将导致对未经授权的访问者返回HTTP 404未找到响应。
Route::get('/forums', 'FooController@bar') ->allowFrom('de', 'ca') ->orNotFound();
orRedirectTo
此回调接受一个必需参数,该参数必须是有效的路由名称。多亏了这个回调,您可以将未经授权的访问者重定向到您选择的路由。
Route::get('/forums', 'FooController@bar') ->allowFrom('de', 'ca') ->orRedirectTo('myRoute');
上述回调可能不足以满足您的需求,因此您可能需要添加自定义回调。在此指南中,我们将介绍几种定义自定义回调的方法。
1. 使用类
- 创建一个新的类,例如
CustomCallbacks。 - 添加您想要添加的任意多的回调,但请确保所有方法都是
static或您会遇到问题。 - 打开
config/geo-routes.php配置文件,并将您的回调添加到回调数组中,如下所示:
'callbacks' => [ 'myCallback' => 'CustomCallbacks::myCallback', 'anotherCallback' => 'CustomCallbacks::anotherCallback' ]
现在您的回调已就绪,您可以开始使用它们了:
Route::get('/forums', 'FooController@bar') ->allowFrom('ca', 'us') ->orMyCallback(); Route::get('/blog', 'FooController@baz') ->denyFrom('fr', 'es', 'ar') ->orAnotherCallback();
注意:我们已添加了
or前缀并将回调名称转换为studly case(例如,myCallback被转换为orMyCallback),请务必注意此说明,因为它对于您的回调正常工作非常重要。
您还可以使用CallbackRegistrar的parseCallbacks方法来加载这些回调。
示例
use LaraCrafts\GeoRoutes\Support\Facades\CallbackRegistrar; public function boot() { CallbackRegistrar::parseCallbacks(MyCallbacksClass::class); }
2. 使用回调的array
loadCallbacks方法允许您加载一个回调的关联数组。
示例
use LaraCrafts\GeoRoutes\Support\Facades\CallbackRegistrar; public function boot() { $myCallbacksArray = [ 'handyName' => 'myClass::myCallback' // ] CallbackRegistrar::loadCallbacks($myCallbacksArray); }
3. 使用callback方法
callback方法允许您添加一个单独的自定义回调,接受一个名称和一个可调用的函数。
示例
use LaraCrafts\GeoRoutes\Support\Facades\CallbackRegistrar; public function boot() { CallbackRegistrar::callback('foo', function () { return 'Sorry, you are not authorized.'; }); }
Artisan命令
我们对route:list命令进行了调整,并添加了新选项,以便更容易地检索地理限制信息。以下是新选项及其用法示例列表:
贡献
欢迎对本项目的所有贡献,请参阅CONTRIBUTING.md文件以获取有关贡献指南的更多信息。
许可协议
版权所有(c)2019 LaraCrafts。
本产品受MIT许可协议许可,请参阅许可文件以获取更多信息。