jaybizzle/route-binder

Laravel 路由绑定,做得正确。

4.4.0 2023-02-23 12:37 UTC

This package is auto-updated.

Last update: 2024-08-23 15:56:58 UTC


README

Laravel 路由绑定,做得正确。

Build Status

Laravel 4 或 5?

master 分支包含与 Laravel 5 兼容的代码。Laravel 5 的版本从 3.0 标签开始发布。

对于与 Laravel 4 兼容的版本,请访问 laravel4 分支

问题

项目开始时很简单:几条路由,可能是一些资源控制器,可能还有一些参数绑定。但很快,“routes.php” 文件就开始堆积,有成百上千行,有复杂的嵌套组和过滤器,甚至(不敢想象)有对 App::make 的调用。更繁琐的是,要滚动那么多行去搜索那个你显然已经忘记的奇怪路由名称,因为毕竟谁会记得那些呢?

此包可帮助你完成(至少)以下三件事情

  1. 通过允许你使用 IoC 容器来通过 依赖注入(DI) 使你的路由成为应用程序的一部分
  2. 它让你可以将路由分割成多个文件(类)而无需使用过时的 includesrequires
  3. 由于你会创建类,因此你有机会声明一些字符串常量并保留对那些讨厌的路由名称的引用

解决方案

此包仅包含两个契约、一个配置文件和一个 ServiceProvider

像往常一样,将 ServiceProvider 包含在您的 config/app.php 文件中,如下所示

'providers' => [
    // ...
    LaravelBA\RouteBinder\RouteBinderServiceProvider::class,
    // ...
]

然后,发布包的配置

php artisan vendor:publish --provider="LaravelBA\RouteBinder\RouteBinderServiceProvider"

之后,您需要创建一些类,这些类实现 LaravelBA\RouteBinder\Routes 接口、LaravelBA\RouteBinder\Bindings 接口或两者。别担心!您会发现这是小菜一碟

namespace App\Http\Routes;

use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Routing\Router;
use LaravelBA\RouteBinder\Bindings;
use LaravelBA\RouteBinder\Routes;

class FooRoutes implements Routes, Bindings
{
    /**
     * This is what I meant with #3 up there.
     * Completely optional, but highly recommended.
     */
    const INDEX = 'foo.index';

    /**
     * This one is required if you implement the Bindings interface
     */
    public function addBindings(Router $router)
    {
        $router->bind('user_id', function(){
            // Fetch your User object here!
        });
    }

    /**
     * This one is required if you implement the Routes interface
     */
    public function addRoutes(Registrar $router)
    {
        $router->get('foo', ['as' => self::INDEX, 'uses' => function(){
            return view('hello');
        }]);
    }
}

并将它们添加到已发布的配置文件中(现在在 config/routes.php 中找到)

return [
    'binders' => [
        App\Http\Routes\FooRoutes::class,
        App\Http\Routes\BarRoutes::class,
        App\Http\Routes\BazRoutes::class,
        App\Http\Routes\AwesomeRoutes::class,
    ]
];

这就完成了!现在您的所有路由都组织得很好,如果事情变得难以控制,您总是可以将它们拆分得更开!

IoC 容器

我喜欢 Laravel 的路由模型绑定功能。但我必须承认,我不使用 Eloquent,所以我总是选择 Route::bind() 选项。

但这个功能,尽管可能很强大,但对你的架构来说非常糟糕。在“routes.php”文件中对数据库的调用是可怕的,而使用 App::make(SomeRepository::class) 也不见得好多少。

通过这个小巧的包,你的 Bindings 对象可以依赖于应用程序的任何 ServiceRepository 层。现在,你甚至可以通过模拟依赖项并期望在路由解析时调用你使用的任何 Repository::find() 方法来测试这些绑定!

这个场景可能看起来现在看起来太复杂了,但请相信我,你会喜欢它的。