我想知道是否有可能增加新的方法在Laravel资源控制器,以及如何做到这一点。
我知道,这些方法是默认(索引,创建,存储,编辑,更新,销毁)。现在,我想更多的方法和路线添加到同一个控制器。
那可能吗?
只是路由添加到该方法分开,你注册资源之前:
Route::get('foo/bar', 'FooController@bar');
Route::resource('foo', 'FooController');
我只是做的是,添加一个GET“删除”方法。
创建文件后,您只需要添加
'AntonioRibeiro\Routing\ExtendedRouterServiceProvider',
在您的应用程序/ config.php文件“供应商”
编辑同一个文件的路径别名:
'Route' => 'Illuminate\Support\Facades\Route',
将其更改为
'Route' => 'AntonioRibeiro\Facades\ExtendedRouteFacade',
并确保这些文件被自动加载,他们必须在某个目录您在composer.json(“自动加载”一节)有。
然后你只需要:
Route::resource('users', 'UsersController');
而这(看最后一行)是结果,如果你运行php artisan routes
:
这些都是我的源文件:
ExtendedRouteFacade.pas
<?php namespace AntonioRibeiro\Facades;
use Illuminate\Support\Facades\Facade as IlluminateFacade;
class ExtendedRouteFacade extends IlluminateFacade {
/**
* Determine if the current route matches a given name.
*
* @param string $name
* @return bool
*/
public static function is($name)
{
return static::$app['router']->currentRouteNamed($name);
}
/**
* Determine if the current route uses a given controller action.
*
* @param string $action
* @return bool
*/
public static function uses($action)
{
return static::$app['router']->currentRouteUses($action);
}
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'router'; }
}
ExtendedRouter.pas
<?php namespace AntonioRibeiro\Routing;
class ExtendedRouter extends \Illuminate\Routing\Router {
protected $resourceDefaults = array('index', 'create', 'store', 'show', 'edit', 'update', 'destroy', 'delete');
/**
* Add the show method for a resourceful route.
*
* @param string $name
* @param string $base
* @param string $controller
* @return void
*/
protected function addResourceDelete($name, $base, $controller)
{
$uri = $this->getResourceUri($name).'/{'.$base.'}/destroy';
return $this->get($uri, $this->getResourceAction($name, $controller, 'delete'));
}
}
ExtendedRouteServiceProvider.pas
<?php namespace AntonioRibeiro\Routing;
use Illuminate\Support\ServiceProvider;
class ExtendedRouterServiceProvider extends ServiceProvider {
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app['router'] = $this->app->share(function() { return new ExtendedRouter($this->app); });
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array('router');
}
}
是啊,这是可能的..
在我来说,我补充方法:数据处理在HTTP POST方法/data.json请求。
这是我做了什么。
首先,我们扩展照亮\路由\ ResourceRegistrar添加新的方法的数据
<?php
namespace App\MyCustom\Routing;
use Illuminate\Routing\ResourceRegistrar as OriginalRegistrar;
class ResourceRegistrar extends OriginalRegistrar
{
// add data to the array
/**
* The default actions for a resourceful controller.
*
* @var array
*/
protected $resourceDefaults = ['index', 'create', 'store', 'show', 'edit', 'update', 'destroy', 'data'];
/**
* Add the data method for a resourceful route.
*
* @param string $name
* @param string $base
* @param string $controller
* @param array $options
* @return \Illuminate\Routing\Route
*/
protected function addResourceData($name, $base, $controller, $options)
{
$uri = $this->getResourceUri($name).'/data.json';
$action = $this->getResourceAction($name, $controller, 'data', $options);
return $this->router->post($uri, $action);
}
}
在此之后,让您的新的ServiceProvider或改用AppServiceProvider。
在方法的引导,添加以下代码:
public function boot()
{
$registrar = new \App\MyCustom\Routing\ResourceRegistrar($this->app['router']);
$this->app->bind('Illuminate\Routing\ResourceRegistrar', function () use ($registrar) {
return $registrar;
});
}
然后 :
添加到您的路线:
Route::resource('test', 'TestController');
通过php artisan route:list
检查,你会发现新的方法,“数据”
Route::resource('foo', 'FooController');
Route::controller('foo', 'FooController');
这给一个尝试。把你额外的方法类似的getData()等等等等。这为我工作,以保持清洁route.php
使用Laravel> 5查找路由web.php文件夹添加你的方法
您可以使用路线::资源路由所有这些方法的指标,显示,存储,升级,破坏你的控制器在一条线
Route::get('foo/bar', 'NameController@bar');
Route::resource('foo', 'NameController');
这工作也相当不错。无需增加更多的航线只需要使用这样的资源控制器的显示方法:
public function show($name){
switch ($name){
case 'foo':
$this -> foo();
break;
case 'bar':
$this ->bar();
break;
defautlt:
abort(404,'bad request');
break;
}
}
public function foo(){}
publcc function bar(){}
我使用默认抛出自定义错误页。
刚加入新方法和该方法的路线。
在你的控制器:
public function foo($bar=“default”)
{
//do stuff
}
而在你的网络的路由
Route::get(“foo/{$bar}”, “MyController@foo”);
只要确保在控制器的方法是公开的。