laravelba / route-binder
Laravel 路由绑定,正确的方式。
Requires
- illuminate/contracts: ~5.0
- illuminate/support: ~5.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^1.12
- illuminate/routing: ~5.0
- laravel/framework: ~5.0
- mockery/mockery: ^0.9.5
- phpunit/phpunit: ^5.5
This package is not auto-updated.
Last update: 2019-02-20 18:26:06 UTC
README
Laravel 路由绑定,正确的方式。
Laravel 4 或 5?
master 分支包含与 Laravel 5 兼容的代码。Laravel 5 的版本从 3.0 标签开始。
要获取与 Laravel 4 兼容的版本,请访问 laravel4 分支。
问题
项目开始时很简单:几个路由,可能是一些资源控制器,可能在这里和那里进行一些参数绑定。但很快,`routes.php` 文件开始堆积如山,有数百行,复杂的嵌套组和过滤器,甚至(上帝禁止)调用 `App::make`。更繁琐的是,不得不滚动这么多行来搜索那个你显然已经忘记的奇特的路由名,因为,谁会记得这些呢?
此包可以帮助你完成以下至少三件事情
- 通过使用 IoC 容器进行 DI,将你的路由作为 应用程序 的一部分
- 允许你在多个文件(类)中拆分路由,而无需使用过时的 `includes` 或 `requires`
- 由于你将创建类,你有机会声明一些字符串常量,并保存对这些讨厌的路由名的引用
解决方案
此包只有两个合约,一个配置文件和一个 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` 对象可以依赖应用程序的任何 Service
或 Repository
层。现在,你甚至可以通过模拟依赖关系并期望在路由解析时调用任何 `Repository::find()` 方法来测试这些绑定!
现在这个场景可能看起来太复杂了,但请相信我,你会喜欢的。