保持简单和干燥。
您可以在 app/config/app.php 文件中扩展路由器并替换 Route Facade,但似乎需要做很多工作却收效甚微,但不要忘记您的路由文件是一个 PHP 脚本,您可以执行以下操作:
$routes = [
['users' => 'UserController'],
['posts' => 'PostController'],
];
foreach ($routes as $key => $controller)
{
Route::get("$key/deleted", array('uses' => "$controller@trash"));
Route::put("$key/{id}/restore", array('uses' => "$controller@restore"));
Route::resource($key, $controller);
}
扩展路由器
要扩展路由器,您需要创建 3 个类:
Router 扩展,您将在其中添加新方法:
<?php namespace App\Routing;
class ExtendedRouter extends \Illuminate\Routing\Router {
protected $resourceDefaults = array(
'index',
'create',
'store',
'show',
'edit',
'update',
'destroy',
'deleted',
'restore',
);
protected function addResourceDeleted($name, $base, $controller)
{
$uri = $this->getResourceUri($name).'/deleted';
return $this->get($uri, $this->getResourceAction($name, $controller, 'deleted'));
}
protected function addResourceRestore($name, $base, $controller)
{
$uri = $this->getResourceUri($name).'/{resource}/restore';
return $this->get($uri, $this->getResourceAction($name, $controller, 'restore'));
}
}
服务提供商,使用 Laravel 使用的相同 IoC 标识符(“路由器”)启动新路由器:
<?php namespace App\Routing;
use Illuminate\Support\ServiceProvider;
class ExtendedRouterServiceProvider extends ServiceProvider {
protected $defer = true;
public function register()
{
$this->app['router'] = $this->app->share(function() { return new ExtendedRouter($this->app); });
}
public function provides()
{
return array('router');
}
}
还有一个门面,用来代替 Laravel 的门面
<?php namespace App\Facades;
use Illuminate\Support\Facades\Facade as IlluminateFacade;
class ExtendedRouteFacade extends IlluminateFacade {
public static function is($name)
{
return static::$app['router']->currentRouteNamed($name);
}
public static function uses($action)
{
return static::$app['router']->currentRouteUses($action);
}
protected static function getFacadeAccessor() { return 'router'; }
}
然后你需要将你的 Service Provider 和 Facade 添加到你的 app/config/app.php 文件中,注释掉 Laravel 的原始文件。