marcot89/laravel-magic-routes

Laravel 应用程序的魔法路由

v0.5.0 2020-06-12 14:29 UTC

This package is auto-updated.

Last update: 2024-09-12 23:43:03 UTC


README

Latest Version on Packagist Total Downloads

基于您的控制器名称和命名空间为您的Laravel应用程序创建RESTful路由,以避免覆盖并定义项目路由的模板。它与Laravel 7+兼容。

安装

通过Composer

$ composer require marcot89/laravel-magic-routes

使用

MagicRoutes特质添加到控制器以自动为其生成路由

namespace App\Http\Controllers;

use MarcoT89\LaravelMagicRoutes\Traits\MagicRoutes;

class UserController extends Controller
{
    use MagicRoutes;
}

目前您的控制器没有路由,因为您没有在其上声明任何public方法。每当您向控制器添加一个public方法时,就会为该方法生成一个新路由。因此,如果我们添加常见的CRUD公共方法,如下所示

namespace App\Http\Controllers;

class UserController extends Controller
{
    use MagicRoutes;

    public function index(...) {...}
    public function store(...) {...}
    public function update(...) {...}
    public function create(...) {...}
    public function show(...) {...}
    public function edit(...) {...}
    public function destroy(...) {...}
    public function forceDestroy(...) {...}
}

我们将根据这些公共方法生成以下路由

| GET|HEAD | users                      | users.index          | App\Http\Controllers\UserController@index          |
| POST     | users                      | users.store          | App\Http\Controllers\UserController@store          |
| GET|HEAD | users/create               | users.create         | App\Http\Controllers\UserController@create         |
| PUT      | users/{user}               | users.update         | App\Http\Controllers\UserController@update         |
| GET|HEAD | users/{user}               | users.show           | App\Http\Controllers\UserController@show           |
| DELETE   | users/{user}               | users.destroy        | App\Http\Controllers\UserController@destroy        |
| GET|HEAD | users/{user}/edit          | users.edit           | App\Http\Controllers\UserController@edit           |
| DELETE   | users/{user}/force-destroy | users.force-destroy  | App\Http\Controllers\UserController@forceDestroy   |

自定义路由的HTTP方法

控制器中的任何其他公共方法都将默认生成具有GET HTTP方法的路由,但您可以使用前缀来自定义它。让我们看看一个例子。

class PostController extends Controller
{
    use MagicRoutes;

    // Generated route:
    // GET /posts/{post}/publish
    public function publish(Post $post) {...}

    // Generated route:
    // POST /posts/{post}/publish
    public function postPublish(Post $post) {...}

    // Generated route:
    // PUT /posts/{post}/publish
    public function putPublish(Post $post) {...}

    // Generated route:
    // DELETE /posts/{post}/publish
    public function deletePublish(Post $post) {...}
}

路由参数

按照惯例,第一个参数将在动作名称之前设置。所有其他参数将添加在后面。

class PostController extends Controller
{
    public function publish(Post $post, $one, $two, $three) {...}
}

将生成

GET /posts/{post}/publish/{one}/{two}/{three}

中间件

有两种方法可以声明控制器上的中间件

使用受保护属性

class UserController extends Controller
{
    use MagicRoutes;

    // use a string for one middlware
    protected $middleware = 'auth';
    // or use an array for many middlewares
    protected $middleware = [
        'auth',
        'verified' => ['except' => ['index', 'edit', 'update']],
    ];
}

使用构造函数

class UserController extends Controller
{
    use MagicRoutes;

    public function __construct()
    {
        $this->middleware('auth');
    }
}

命名空间路由

控制器命名空间将为该路由生成一个前缀

namespace App\Http\Controllers\Api\V1;

...

class UserController extends Controller
{
    use MagicRoutes;

    public function index(...) {...}
}

在此控制器中声明的任何公共方法都将生成带有前缀的URL,例如

/api/v1/users

并且命名路由为

api.v1.users

可调用控制器

如果您想为每个操作创建一个控制器,您可以使用命名空间中的可调用控制器来使路由更有意义。例如

namespace App\Http\Controllers\Posts;

class PublishController extends Controller
{
    use MagicRoutes;

    protected $middleware = 'auth';
    protected $method = 'post'; // only works for invokable controllers
    // or
    protected $method = 'post|put'; // separate by pipe for more http methods

    public function __invoke(Post $post) {...}
}

这将生成一个类似以下格式的URL

POST /posts/publish/{post} -> name: posts.publish

嵌套RESTful路由

有时您需要或想要定义嵌套资源。比如说,我们有一个用户的帖子,但我们需要为这些帖子定义嵌套路由。您可以使用如下命名空间控制器来完成此操作

namespace App\Http\Controllers\Users; // Note that it is inside Users namespace for prefix route

class PostController extends Controller
{
    use MagicRoutes;

    protected $prefix = '{user}';

    public function index(User $user) {
        return $user->posts()->paginate();
    }
}

这将生成以下路由

GET /users/{user}/posts -> name: users.posts.index

资源URL复数与单数

RESTful资源始终为复数。因此,约定定义URL资源为复数,无论控制器的名称如何。如果您的控制器是UserControllerUsersController,它们都将生成相同的资源URL /users

但是,您可以使用plural属性来禁用此行为

class UserController extends Controller
{
    use MagicRoutes;

    protected $plural = false;

    ...
}

使用此属性,false将生成遵循控制器名称的路由。现在,如果您的控制器是UserController,它将生成路由/user。如果它是UsersController,它将生成/users

注意:对于可调用控制器,plural属性始终禁用。

变更日志

请参阅变更日志以获取有关最近更改的更多信息。

贡献

请参阅contributing.md以获取详细信息以及待办事项列表。

安全

如果您发现任何与安全相关的问题,请通过电子邮件联系作者,而不是使用问题跟踪器。

致谢

MIT许可证

请参阅许可证文件以获取更多信息。