izniburak/laravel-auto-routes

Laravel 的自动路由生成(自动发现)包

v2.1.0 2024-08-08 18:13 UTC

This package is auto-updated.

Last update: 2024-09-08 18:31:57 UTC


README

                _              _____             _            
     /\        | |            |  __ \           | |           
    /  \  _   _| |_ ___ ______| |__) |___  _   _| |_ ___  ___ 
   / /\ \| | | | __/ _ \______|  _  // _ \| | | | __/ _ \/ __|
  / ____ \ |_| | || (_) |     | | \ \ (_) | |_| | ||  __/\__ \
 /_/    \_\__,_|\__\___/      |_|  \_\___/ \__,_|\__\___||___/

Total Downloads Latest Stable Version Latest Unstable Version License

Laravel 的自动路由生成器与发现包。

功能

  • Laravel 所支持的所有 HTTP 方法
  • 支持 AJAX 的 HTTP 方法(XMLHttpRequest)
  • 支持正则表达式的自定义参数模式
  • 支持 kebab-case 和 snake_case 格式的 URL
  • Livewire 路由支持 [包含 Volt] (在 v2.x)

安装

支持的 Laravel 版本

直接在项目路径下运行以下命令

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.phpapi.php 文件,并添加一个将自动生成的路由

Route::auto('/test', 'TestController');

所有方法将由 AutoRoute 包自动生成。

详情

  • 您可以通过 config 目录下的 auto-route.php 文件更改包的配置。您可以:

    • 为方法参数添加新的模式。
    • 更改默认 HTTP 方法。
    • 更改主方法。
  • 您可以在 web.phpapi.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路由属性,如namemiddlewarenamespace等。

此外,您可以将patterns添加到选项数组中,以定义控制器中方法参数的新模式。例如:

Route::auto('/test', 'TestController', [
    'name' => 'test',
    'middleware' => [YourMiddleware::class],
    'patterns' => [
        'id' => '\d+',
        'value' => '\w+',
    ],
]);

根据上面的示例,您可以在控制器中的所有方法中使用$id$value参数。并且对于这些参数,您定义的规则将被应用。

同样,要定义参数的默认模式,您可以修改auto-route.php文件中的patterns

  • 您可以使用带有options参数的onlyexcept来指定将被自动生成的路由。您应该使用控制器中的方法名称。例如:
# 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
    }
}

参数

  • 您可以将参数用作requiredoptional来修饰您的控制器中的方法。例如:
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
    }
}

此外,您可以使用参数类型来使用与参数兼容的模式。参数类型可以是intstringfloatbool。例如:

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配置文件中为这些变量名定义了模式,则您的定义将用于值检查。

要快速为参数使用intfloatstringbool模式,您可以直接使用参数类型。

  • 您可以为控制器使用子目录定义。例如:
Route::auto('/test', 'Backend.TestController');
# OR
Route::auto('/test', 'Backend\\TestController');

Livewire & Volt 支持

您可以通过使用Auto Routes包直接在控制器中定义Livewire或Volt组件路由!为此,您应该添加具有前缀voltwire的新方法。就这样。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组件了。

支持

您可以使用问题

izniburak的主页

izniburak的twitter

许可

MIT 许可证

贡献

  1. 分叉它(https://github.com/izniburak/laravel-auto-routes/fork
  2. 创建您的功能分支(git checkout -b my-new-feature)
  3. 提交您的更改(git commit -am '添加一些功能')
  4. 将更改推送到分支(git push origin my-new-feature)
  5. 创建一个新的拉取请求

贡献者

  • izniburak İzni Burak Demirtaş - 创建者,维护者