morningtrain / wp-route
WordPress 的简单路由服务
Requires
- php: ^8.0
- illuminate/container: ^8|^9
- illuminate/pipeline: ^8|^9
- illuminate/support: ^8|^9
- morningtrain/php-loader: ^0.3.0
- symfony/http-foundation: ^6
Requires (Dev)
- brain/monkey: ~2.0.0
- pestphp/pest: ^1.21
README
WordPress 路由服务,使用 WordPress 重新写入引擎,并添加 Laravel 语法。
目录
简介
路由是应用程序中的一个地址或端点。除非有其他说明,否则路由定义在项目的 /routes
目录中。
在启动时,框架将加载此目录中的所有文件。
注意,路由 API 仿照 Laravel Route
路由必须调用一个控制器作为回调!
入门
要开始,请按照以下 安装 部分中的说明安装软件包。
要使用此工具,请参阅 用法。
安装
使用 composer 安装
composer require morningtrain/wp-route
依赖关系
morningtrain/php-loader
PHP Loader 用于加载和初始化所有钩子
illuminate/pipeline
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)。请参阅许可文件获取更多信息。