hivokas/laravel-handlers

Laravel请求处理器

0.3.2 2018-09-04 14:38 UTC

This package is auto-updated.

Last update: 2024-09-19 10:02:10 UTC


README

Latest Version Software License Build Status StyleCI Quality Score Coverage Status

再见控制器,你好请求处理器!

此包提供了一种方便的创建请求处理器的方法。

基本上,请求处理器是一个单动作控制器,这有助于更清晰地将请求转换为响应流程。

您应该尝试使用请求处理器而不是控制器,您可能很快就不会再想回到控制器了。

与控制器相比的一些优势

  • 单一职责(似乎控制器拥有多个动作会破坏这一原则);
  • 可测试性(由于每个请求处理器中只有一个动作,因此您不需要解决与您正在测试的动作无关的依赖项);
  • 路由注册(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,

];

创建请求处理器

Showcase

  • 创建一个处理器
php artisan make:handler ShowPost

ShowPost处理器将被创建

  • 为所有资源动作(indexshowcreatestoreeditupdatedestroy)创建处理器
php artisan make:handler Post --resource

IndexPostShowPostCreatePostStorePostEditPostUpdatePostDestroyPost处理器将被创建

  • 排除对API动作不必要的动作(createedit
php artisan make:handler Post --resource --api

IndexPostShowPostStorePostUpdatePostDestroyPost处理器将被创建

  • 通过指定的动作创建处理器
php artisan make:handler Post --actions=show,destroy,approve

ShowPostDestroyPostApprovePost处理器将被创建

  • 排除指定的动作
php artisan make:handler Post --resource --except=index,show,edit

CreatePostStorePostUpdatePostDestroyPost处理器将被创建

  • 为创建的处理器指定命名空间(相对路径)
php artisan make:handler Post --resource --namespace=Post

IndexPostShowPostCreatePostStorePostEditPostUpdatePostDestroyPost处理器将在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)。请参阅许可文件以获取更多信息。