izniburak / laravel-auto-routes
Laravel 的自动路由生成(自动发现)包
Requires
- php: ^8.1
Requires (Dev)
- illuminate/routing: ^10.0|^11.0
- phpunit/phpunit: ^10.1
README
_ _____ _
/\ | | | __ \ | |
/ \ _ _| |_ ___ ______| |__) |___ _ _| |_ ___ ___
/ /\ \| | | | __/ _ \______| _ // _ \| | | | __/ _ \/ __|
/ ____ \ |_| | || (_) | | | \ \ (_) | |_| | || __/\__ \
/_/ \_\__,_|\__\___/ |_| \_\___/ \__,_|\__\___||___/
Laravel 的自动路由生成器与发现包。
功能
- Laravel 所支持的所有 HTTP 方法
- 支持 AJAX 的 HTTP 方法(XMLHttpRequest)
- 支持正则表达式的自定义参数模式
- 支持 kebab-case 和 snake_case 格式的 URL
- Livewire 路由支持 [包含 Volt] (在 v2.x)
安装
支持的 Laravel 版本
- v2.x: Laravel 10 及以上
- v1.x: Laravel 6 及以上 (查看源代码)
直接在项目路径下运行以下命令
composer require izniburak/laravel-auto-routes
或者 打开您的 composer.json
文件,并按如下方式添加包
{ "require": { "izniburak/laravel-auto-routes": "^2.0" } }
运行安装命令后。
composer install
包的服务提供者将由 Laravel 自动发现。
之后,您应该通过以下命令发布配置文件
php artisan vendor:publish --provider="Buki\AutoRoute\AutoRouteServiceProvider"
太好了!您现在可以开始使用 自动路由 包了。
使用方法
在 routes
目录下打开 web.php
或 api.php
文件,并添加一个将自动生成的路由
Route::auto('/test', 'TestController');
所有方法将由 AutoRoute 包自动生成。
详情
-
您可以通过
config
目录下的auto-route.php
文件更改包的配置。您可以:- 为方法参数添加新的模式。
- 更改默认 HTTP 方法。
- 更改主方法。
-
您可以在
web.php
和api.php
中使用Buki\AutoRoute\Facades\Route
以在 IDE 或编辑器中使用方法进行简单代码补全。您可以将以下行添加到文件顶部
// use Illuminate\Support\Facades\Route; use Buki\AutoRoute\Facades\Route;
- 所有将被自动生成的方法都必须有
public
访问器,以便被 AutoRoute 包发现。
方法
- 如果您在控制器中使用
camelCase
风格命名方法,则这些方法端点将自动转换为kebab-case
以生成漂亮的 URL。例如
Route::auto('/test', 'TestController'); # OR Route::auto('/test', TestController::class);
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL will be converted to "/test/foo-bar" */ public function fooBar(Request $request) { // your codes } }
- 您可以为控制器的方法指定 HTTP 方法。如果您希望某个方法使用
GET
方法,而其他方法使用POST
方法,您可以这样做。只需为方法添加前缀即可。就是这样。例如;
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test/foo-bar" * This method will only work with 'GET' method. */ public function getFooBar(Request $request) { // your codes } /** * URL: "/test/bar-baz" * This method will only work with 'POST' method. */ public function postBarBaz(Request $request) { // your codes } }
-
如果您未为方法添加任何前缀以使用 HTTP 方法定义,则所有 URL 都将使用所有 HTTP 方法。此选项可以从
auto-route.php
配置文件中更改。 -
如果您希望使用
snake_case
格式为方法命名,您可以这样做
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test/foo_bar" * This method will only work with 'GET' method. */ public function get_foo_bar(Request $request) { // your codes } /** * URL: "/test/bar_baz" * This method will only work with 'POST' method. */ public function post_bar_baz(Request $request) { // your codes } }
支持的 AJAX 方法
此外,您还可以添加 支持 AJAX 的路由。例如;如果您想有一个只能通过 GET 方法和使用 XMLHttpRequest 访问的路由,您可以简单地定义它。此包有一些支持 AJAX 的方法。这些是;
XGET, XPOST, XPUT, XDELETE, XPATCH, XOPTIONS, XANY.
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test/foo" * This method will only work with 'GET' method and XMLHttpRequest. */ public function xgetFoo(Request $request) { // your codes } /** * URL: "/test/bar" * This method will only work with 'POST' method and XMLHttpRequest. */ public function xpostBar(Request $request) { // your codes } /** * URL: "/test/baz" * This method will work with any method and XMLHttpRequest. */ public function xanyBaz(Request $request) { // your codes } }
如您所见,您只需添加一个 x
字符作为前缀来定义支持 AJAX 的路由。如果您想支持 XMLHttpRequest 和 Laravel 支持的所有 HTTP 方法,您可以使用 xany
前缀。
对于支持 AJAX 的方法,包将自动添加一个中间件来检查路由的 XMLHttpRequest。此中间件抛出 MethodNotAllowedException
异常。但,如果您想的话,您可以从 config
目录下的 auto-routes.php
文件中更改此中间件。
选项
- 您可以通过
auto
方法的第三个参数添加路由选项。
Route::auto('/test', 'TestController', [ // your options... ]);
选项数组可能包含所有Laravel路由属性,如name
、middleware
、namespace
等。
此外,您可以将patterns
添加到选项数组中,以定义控制器中方法参数的新模式。例如:
Route::auto('/test', 'TestController', [ 'name' => 'test', 'middleware' => [YourMiddleware::class], 'patterns' => [ 'id' => '\d+', 'value' => '\w+', ], ]);
根据上面的示例,您可以在控制器中的所有方法中使用$id
和$value
参数。并且对于这些参数,您定义的规则将被应用。
同样,要定义参数的默认模式,您可以修改auto-route.php
文件中的patterns
。
- 您可以使用带有
options
参数的only
或except
来指定将被自动生成的路由。您应该使用控制器中的方法名称。例如:
# First Example Route::auto('/foo', 'FooController', [ 'only' => ['fooBar', 'postUpdatePost'], ]); # Second Example Route::auto('/bar', 'BarController', [ 'except' => ['test', 'putExample'], ]);
根据上面的第一个示例,将只生成两个方法。根据其他示例,除了指定的两个方法外,将生成所有方法。
- 如果您未更改配置中的
main_method
,则控制器的主方法将是index
。这意味着,您应该将index
方法添加到控制器中以定义控制器的基本端点。例如:
Route::auto('/test', 'TestController');
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test" */ public function index(Request $request) { // your codes } /** * URL: "/test/foo-bar" */ public function fooBar(Request $request) { // your codes } }
参数
- 您可以将参数用作
required
和optional
来修饰您的控制器中的方法。例如:
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test/{id}" */ public function index(Request $request, $id) { // your codes } /** * URL: "/test/foo-bar/{name}/{surname?}" */ public function fooBar(Request $request, $name, $surname = null) { // your codes } }
此外,您可以使用参数类型来使用与参数兼容的模式。参数类型可以是int
、string
、float
和bool
。例如:
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test/{id}" * id parameter must be numeric. */ public function index(Request $request, int $id) { // your codes } /** * URL: "/test/foo-bar/{name}/{surname?}" * name and surname parameters must be string. */ public function fooBar(Request $request, string $name, string $surname = null) { // your codes } }
如果您在auto-route.php
配置文件中为这些变量名定义了模式,则您的定义将用于值检查。
要快速为参数使用int
、float
、string
和bool
模式,您可以直接使用参数类型。
- 您可以为控制器使用子目录定义。例如:
Route::auto('/test', 'Backend.TestController'); # OR Route::auto('/test', 'Backend\\TestController');
Livewire & Volt 支持
您可以通过使用Auto Routes包直接在控制器中定义Livewire或Volt组件路由!为此,您应该添加具有前缀volt
或wire
的新方法。就这样。Auto Routes包将自动发现您的Livewire路由并将它们添加到应用程序路由中。
namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { /** * URL: "/test/foo" */ public function voltFoo(): string { // resources/views/livewire/pages/foo.blade.php return 'pages.foo'; } /** * URL: "/test/bar" */ public function wireBar(): string { return \App\Livewire\TestComponent::class; } }
如您所见;对于这两种方法,您必须返回一个字符串值,即Volt组件路径字符串或Livewire组件类字符串。现在,您可以访问您的Livewire组件了。
支持
您可以使用问题
许可
贡献
- 分叉它(https://github.com/izniburak/laravel-auto-routes/fork)
- 创建您的功能分支(git checkout -b my-new-feature)
- 提交您的更改(git commit -am '添加一些功能')
- 将更改推送到分支(git push origin my-new-feature)
- 创建一个新的拉取请求
贡献者
- izniburak İzni Burak Demirtaş - 创建者,维护者