marcot89 / laravel-magic-routes
Laravel 应用程序的魔法路由
Requires
Requires (Dev)
- phpunit/phpunit: ^8.0
- sempro/phpunit-pretty-print: ^1.0
README
基于您的控制器名称和命名空间为您的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资源为复数,无论控制器的名称如何。如果您的控制器是UserController
或UsersController
,它们都将生成相同的资源URL /users
。
但是,您可以使用plural
属性来禁用此行为
class UserController extends Controller { use MagicRoutes; protected $plural = false; ... }
使用此属性,false
将生成遵循控制器名称的路由。现在,如果您的控制器是UserController
,它将生成路由/user
。如果它是UsersController
,它将生成/users
。
注意:对于可调用控制器,
plural
属性始终禁用。
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
请参阅contributing.md以获取详细信息以及待办事项列表。
安全
如果您发现任何与安全相关的问题,请通过电子邮件联系作者,而不是使用问题跟踪器。
致谢
MIT许可证
请参阅许可证文件以获取更多信息。