【问题标题】:How do I override laravel resource route default method?如何覆盖 laravel 资源路由默认方法?
【发布时间】:2017-01-17 08:04:31
【问题描述】:

我的 REST API 网址有这个架构:

Verb    Url                         Method

GET     /tasks                      findAll   
GET     /tasks/{id}                 findOne    
POST    /tasks                      create   
PUT     /tasks/{id}                 update    
DELETE  /tasks/{id}                 deleteOne
DELETE  /tasks                      deleteAll

有没有办法覆盖 Route Resource Laravel 内置方法(存储、创建、编辑等)的默认方法并使用单行创建与我的控制器关联的自定义路由?

例如:

Route::resource('/tasks', 'TasksController');

代替:

Route::get('/tasks', 'TasksController@findAll');
Route::get('/tasks/{id}', 'TasksController@findOne');
Route::post('/tasks', 'TasksController@create');
Route::put('/tasks/{id}', 'TasksController@update');
Route::delete('/tasks', 'TasksController@deleteAll');
Route::delete('/tasks/{id}', 'TasksController@deleteOne');

【问题讨论】:

  • 你可以看看this
  • 谢谢,但这是为了添加额外的路由操作而不覆盖默认方法。
  • 抱歉,您必须向下滚动到某个 answer。对于每个新方法,您都创建一个类似addResourceData() 的方法,并在protected $resourceDefaults = [....] 中添加这些方法。同时删除 $resourceDefaults 中不需要的内容。
  • @ThomasVanderVeen 很好,这似乎是我想要的,谢谢!

标签: php rest laravel


【解决方案1】:

我已经解决了更改 ResourceRegistrar.php 类的这些步骤,这实现了我的要求。 (@Thomas Van der Veen 建议):

1) 我已经用我想要的方法替换了 $resourceDefaults 数组:

protected $resourceDefaults = ['findAll', 'findOne', 'create', 'update', 'deleteOne', 'deleteAll'];

2) 在我创建了执行操作的方法之后,删除旧的。

    protected function addResourceFindAll($name, $base, $controller, $options)
{
    $uri = $this->getResourceUri($name);

    $action = $this->getResourceAction($name, $controller, 'findAll', $options);

    return $this->router->get($uri, $action);
}

protected function addResourceFindOne($name, $base, $controller, $options)
{
    $uri = $this->getResourceUri($name).'/{'.$base.'}';

    $action = $this->getResourceAction($name, $controller, 'findOne', $options);

    return $this->router->get($uri, $action);
}

protected function addResourceCreate($name, $base, $controller, $options)
{
    $uri = $this->getResourceUri($name);

    $action = $this->getResourceAction($name, $controller, 'create', $options);

    return $this->router->post($uri, $action);
}

protected function addResourceUpdate($name, $base, $controller, $options)
{
    $uri = $this->getResourceUri($name).'/{'.$base.'}';

    $action = $this->getResourceAction($name, $controller, 'update', $options);

    return $this->router->put($uri, $action);
}

protected function addResourceDeleteAll($name, $base, $controller, $options)
{
    $uri = $this->getResourceUri($name);

    $action = $this->getResourceAction($name, $controller, 'deleteAll', $options);

    return $this->router->delete($uri, $action);
}

protected function addResourceDeleteOne($name, $base, $controller, $options)
{
    $uri = $this->getResourceUri($name).'/{'.$base.'}';

    $action = $this->getResourceAction($name, $controller, 'deleteOne', $options);

    return $this->router->delete($uri, $action);
}

就是这样,效果很好!

【讨论】:

  • 非常感谢,我一直在寻找这个信息,但是我怀疑修改这部分内核是否会带来一些额外的风险,或者根本不会影响内核的安全性网络,在我的情况下,我只会添加一个新的发布数据表。
【解决方案2】:

你应该在这里查看 Laravel 文档:https://laravel.com/docs/5.3/controllers#resource-controllers

关于 deleteAll 操作,Laravel 没有为此提供默认调用。 我建议避免这种情况。

要创建资源控制器,只需在终端上输入以下命令:

php artisan make:controller TasksController --resource

这将创建一个控制器,其中包含您必须填写的默认 CRUD 操作。

然后在 routes.php 中添加:

Route::resource('tasks', 'TasksController');

您将能够像您描述的那样向服务器发送调用。

【讨论】:

  • 您好,谢谢您的回复。 Laravel 默认操作包含我不需要的操作(例如显示和编辑)。我已经解决了重写 ResourceRegistrar.php 类以更改和删除不必要的 laravel 操作。
猜你喜欢
  • 2016-09-21
  • 2018-04-07
  • 2021-05-24
  • 1970-01-01
  • 2017-08-30
  • 2011-03-31
  • 2021-08-20
  • 2019-09-04
  • 1970-01-01
相关资源
最近更新 更多