hivokas / laravel-handlers
Laravel请求处理器
Requires
- php: >=7.1
- laravel/framework: 5.5.*|5.6.*|5.7.*
Requires (Dev)
- orchestra/testbench: ~3.0
This package is auto-updated.
Last update: 2024-09-19 10:02:10 UTC
README
再见控制器,你好请求处理器!
此包提供了一种方便的创建请求处理器的方法。
基本上,请求处理器是一个单动作控制器,这有助于更清晰地将请求转换为响应流程。
您应该尝试使用请求处理器而不是控制器,您可能很快就不会再想回到控制器了。
与控制器相比的一些优势
- 单一职责(似乎控制器拥有多个动作会破坏这一原则);
- 可测试性(由于每个请求处理器中只有一个动作,因此您不需要解决与您正在测试的动作无关的依赖项);
- 路由注册(
Route::get('/posts/{post}', ShowPost::class)
比Route::get('/posts/{post}', 'PostController@show')
更方便、更美观)。
安装
您可以通过Composer使用以下命令安装此包:
composer require hivokas/laravel-handlers
此包将自动注册自身。
您可以使用以下命令发布配置文件:
php artisan vendor:publish --provider="Hivokas\LaravelHandlers\Providers\HandlersServiceProvider" --tag="config"
这是发布配置文件的内容
return [ /* |-------------------------------------------------------------------------- | Base Handler Class |-------------------------------------------------------------------------- | | Here you may specify which class will be used as the base class | for all generated handlers. | */ 'base' => Hivokas\LaravelHandlers\Handler::class, ];
创建请求处理器
- 创建一个处理器
php artisan make:handler ShowPost
ShowPost
处理器将被创建
- 为所有资源动作(
index
、show
、create
、store
、edit
、update
、destroy
)创建处理器
php artisan make:handler Post --resource
IndexPost
、ShowPost
、CreatePost
、StorePost
、EditPost
、UpdatePost
、DestroyPost
处理器将被创建
- 排除对API动作不必要的动作(
create
、edit
)
php artisan make:handler Post --resource --api
IndexPost
、ShowPost
、StorePost
、UpdatePost
、DestroyPost
处理器将被创建
- 通过指定的动作创建处理器
php artisan make:handler Post --actions=show,destroy,approve
ShowPost
、DestroyPost
、ApprovePost
处理器将被创建
- 排除指定的动作
php artisan make:handler Post --resource --except=index,show,edit
CreatePost
、StorePost
、UpdatePost
、DestroyPost
处理器将被创建
- 为创建的处理器指定命名空间(相对路径)
php artisan make:handler Post --resource --namespace=Post
IndexPost
、ShowPost
、CreatePost
、StorePost
、EditPost
、UpdatePost
、DestroyPost
处理器将在app/Http/Handlers/Post
目录下的App\Http\Handlers\Post
命名空间下创建
- 为创建的处理器指定命名空间(绝对路径)
php artisan make:handler ActivateUser --namespace=\\App\\Foo\\Bar
ActivateUser
处理器将在app/Foo/Bar
目录下的App\Foo\Bar
命名空间下创建
- 强制创建
php artisan make:handler EditPost --force
如果
EditPost
处理器已存在,则新创建的处理器将覆盖它
在请求处理器中编写逻辑
请求处理器是使用PHP的__invoke
魔术函数的可调用类,将它们转换为可调用的对象,这使得它们可以作为函数被调用。因此,您需要在__invoke
方法中返回响应。
最终您的处理器可能看起来像这样
<?php namespace App\Http\Handlers\Foo; use App\Models\Foo; use App\Services\FooService; use Hivokas\LaravelHandlers\Handler; use App\Http\Requests\Foo\UpdateFooRequest; class UpdateFoo extends Handler { protected $service; public function __construct(FooService $service) { $this->service = $service; } public function __invoke(UpdateFooRequest $request, Foo $foo) { $this->bar($foo, $request->validated()); return redirect('foo.show', $foo); } protected function bar(Foo $foo, array $validated) { return $this->service->baz($foo, $validated); } }
注册路由
以下是一些注册路由的方法,其中请求处理器用作动作。
在单独的handlers.php
路由文件中
- 创建
routes/handlers.php
文件(您可以选择任何名称,这里只是一个示例) - 在
app/Providers/RouteServiceProvider.php
中定义“handlers”路由组
使用命名空间自动前缀
// app/Providers/RouteServiceProvider.php protected function mapHandlersRoutes() { Route::middleware('web') ->namespace('App\Http\Handlers') ->group(base_path('routes/handlers.php')); }
// app/Providers/RouteServiceProvider.php public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); $this->mapHandlersRoutes(); // }
// routes/handlers.php Route::get('/post/{post}', 'ShowPost');
不使用命名空间自动前缀
// app/Providers/RouteServiceProvider.php protected function mapHandlersRoutes() { Route::middleware('web') ->group(base_path('routes/handlers.php')); }
// app/Providers/RouteServiceProvider.php public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); $this->mapHandlersRoutes(); // }
// routes/handlers.php use App\Handlers\ShowPost; Route::get('/post/{post}', ShowPost::class); // pretty sweet, isn't it? 😍
在web.php
路由文件中
- 在
RouteServiceProvider.php
中更改“web”组的命名空间
// app/Providers/RouteServiceProvider.php protected function mapWebRoutes() { Route::middleware('web') ->namespace('App\Http') // pay attention here ->group(base_path('routes/web.php')); }
- 在
routes/web.php
文件中将请求处理器和控制器放在不同的路由组中,并为每个组指定适当的命名空间
// routes/web.php Route::group(['namespace' => 'Handlers'], function () { Route::get('/posts/{post}', 'ShowPost'); Route::delete('/posts/{post}', 'DestroyPost'); }); Route::group(['namespace' => 'Controllers'], function () { Route::get('/users', 'UserController@index'); Route::get('/users/{user}', 'UserController@show'); });
测试
您可以使用以下命令运行测试
composer test
更新日志
请参阅变更日志获取更多关于最近更改的信息。
贡献
请参阅贡献指南以获取详细信息。
许可协议
MIT许可协议(MIT)。请参阅许可文件以获取更多信息。