morningtrain/wp-route

WordPress 的简单路由服务

v0.7.1 2023-03-17 14:30 UTC

This package is auto-updated.

Last update: 2024-08-28 13:32:02 UTC


README

WordPress 路由服务,使用 WordPress 重新写入引擎,并添加 Laravel 语法。

目录

简介

路由是应用程序中的一个地址或端点。除非有其他说明,否则路由定义在项目的 /routes 目录中。

在启动时,框架将加载此目录中的所有文件。

注意,路由 API 仿照 Laravel Route

路由必须调用一个控制器作为回调!

入门

要开始,请按照以下 安装 部分中的说明安装软件包。

要使用此工具,请参阅 用法

安装

使用 composer 安装

composer require morningtrain/wp-route

依赖关系

morningtrain/php-loader

PHP Loader 用于加载和初始化所有钩子

illuminate/pipeline

Illuminate Pipeline

Symfony HTTP Foundation

Symfony Http Foundation

用法

设置

使用 Route::setup($path) 初始化软件包,或者如果软件包已经初始化,则使用 Route::loadDir($path) 加载路由目录

use Morningtrain\WP\Route\Route;

Route::setup(__DIR__ . '/routes');

添加路由

// /routes/myroute.php
use \Morningtrain\WP\Facades\Route;

// Set up a route on the /myroute URL and call MyrouteController::myRoute as callback
Route::get('/myroute','MyrouteController::myRoute');

// /Controllers/MyrouteController.php
class MyrouteController extends \Morningtrain\WP\Route\Abstracts\AbstractController{
    public static function myRoute(){
        // Validate request & send http status code
        // Fetch data
        // Render view
    }
}

带参数的路由

// /routes/kittens.php
use \Morningtrain\WP\Facades\Route;

// Set up a route on the /kitten/1 URL and call KittenController::kittenById as callback
Route::get('/kitten/{kitten_id}','KittenController::kittenById');

// /Controllers/KittenController.php
class KittenController extends \Morningtrain\WP\Route\Abstracts\AbstractController{
    public static function kittenById(\Symfony\Component\HttpFoundation\Request $request){
        // Validate request & send http status code
        // Fetch data
        $kitten_id = $request->query->get('kitten_id');
        // Render view
    }
}

使用命名路由

// /routes/kittens.php
use \Morningtrain\WP\Facades\Route;

// Set up a route on the /kitten/1 URL and call KittenController::kitten as callback
Route::get('/kitten/{kitten_id}','KittenController::kitten')->name('kitten');

// /Controllers/KittenController.php
class KittenController extends \Morningtrain\WP\Route\Abstracts\AbstractController{
    public static function kitten(\Symfony\Component\HttpFoundation\Request $request){
        // Validate request & send http status code
        // Fetch data
        $kitten_id = $request->query->get('kitten_id');
        // Render view
    }
}

// In some template or hook you can now get and check for the named route
// Get Url for Kittens Route
$url = Route::route('kittens',['kitten_id' => 1]); // Would return /kitten/1
// Check if currently on kitten route
$bool = Route::current()->getName() === 'kitten';

分组路由

您可以将一组路由分组,为所有路由应用共享的前缀或共享中间件。

带有前缀

use \Morningtrain\WP\Facades\Route;
Route::prefix('my-prefix')->group(function(){
    Route::get('foo',FooController::class); // url will be /my-prefix/foo
    Route::get('bar',BarController::class); // url will be /my-prefix/bar
})

带有中间件

use \Morningtrain\WP\Facades\Route;
// Users must now be logged in to view these two routes
Route::middleware('auth')->group(function(){
    Route::get('foo',FooController::class);
    Route::get('bar',BarController::class);
})

同时带有前缀和中间件

use \Morningtrain\WP\Facades\Route;
Route::prefix('my-prefix')
->middleware('auth')
->group(function(){
    Route::get('foo',FooController::class);
    Route::get('bar',BarController::class);
})

访问 WP 查询变量

WordPress 查询变量作为查询数据添加到请求类中。因此,您可以像这样访问它们

use Symfony\Component\HttpFoundation\Request;

// Controller
class FooController extends \Morningtrain\WP\Route\Abstracts\AbstractController{
    public function __invoke(Request $request){
        // Do something here
        $post = $request->query->get('post');
    }
}
// Middleware
function(Request $request, $next){
    if($request->query->has('post')){
        // Do something here
        $post = $request->query->get('post');
    }
    return $next($request);
}

中间件

中间件是在匹配 URL 后对路由调用,但在调用回调之前调用的函数。

中间件用于验证一组路由、验证用户权限或劫持请求。

有关更多信息,请参阅此处:Laravel Docs - Middleware

快速示例

中间件是接收请求对象和表示管道中下一个中间件的闭包的函数。在有效中间件的末尾始终 return $next($request); 很重要。

在下面的示例中,我们创建了一个中间件,如果当前用户未登录,则停止管道并返回状态 404 的响应。如果用户已登录,则中间件管道继续,最终允许路由调用其控制器。

中间件允许继续管道、返回响应或抛出异常。响应必须是 \Symfony\Component\HttpFoundation\Response,并将自动发送。异常将被捕获并转换为自定义的 \Morningtrain\WP\Route\Responses\WPErrorResponse,然后使用 wp_die() 显示。

use Morningtrain\WP\Facades\Route;
use \Symfony\Component\HttpFoundation\Request;
Route::middleware([function(Request $request, $next){
    if(!\is_user_logged_in()){
        // Returns a Response object
        return \Morningtrain\WP\Route\Classes\Response::with404();    
    }
    // Continues the middleware pipeline
    return $next($request);
}])
->group(function(){
    Route::get('my-account',MyAccountController::class);
});

REST

您还可以使用相同的语法注册 REST 端点!幕后,所有 REST 路由都是使用 register_rest_route 注册的

use Morningtrain\WP\Facades\Rest;

Rest::get('products', [ProductRestController::class, 'getAllProducts'])->public(); // Will register an endpoint like /wp-json/mtwp/v1/products that accepts GET requests

选项

您可以在 REST 路由上使用中间件、前缀、分组和名称,就像在重写路由上一样!!

注意:中间件是在WordPress识别路由并通过所有其他验证(如permission_callback)之后应用,但在调用控制器或提供的回调之前。

公开

要将端点公开链设置为公开public(),可以在路由或其组上。这实际上是将permission_callback设置为__return_true。默认为__return_false

暴露

您可以通过将expose()链接到路由或其组来将端点URL暴露给DOM。这会将URL输出到类似于localize_script的JavaScript对象中。

暴露的URL可以像这样访问

const fooEndpointUrl = window.mtwpRestRoutes.foo; // /wp-json/mtwp/v1/foo

注意:要公开端点,它必须被命名。

更改命名空间

您可以像设置前缀一样设置命名空间。

use Morningtrain\WP\Facades\Rest;

Rest::namespace('foo/v1')->group(function(){
    Rest::get('foo',FooController::class); // /wp-json/foo/v1/foo
});

这可以与前缀结合使用

use Morningtrain\WP\Facades\Rest;

Rest::namespace('foo/v1')->prefix('bar')->group(function(){
    Rest::get('foo',FooController::class); // /wp-json/foo/bar/v1/foo
});

// -- or --

Rest::namespace('foo/v1')->group(function(){
    Rest::prefix('bar')->group(function(){
        Rest::get('foo',FooController::class); // /wp-json/foo/bar/v1/foo
        Rest::get('baz',FooController::class); // /wp-json/foo/bar/v1/baz
    });
});

致谢

测试

composer test

许可证

MIT许可证(MIT)。请参阅许可文件获取更多信息。