gpt4 book ai didi

laravel - 扩展资源 Controller

转载 作者:行者123 更新时间:2023-12-01 09:26:33 25 4
gpt4 key购买 nike

我正在以某种方式做我想做的事情,我正在寻找替代方案或更好的做事方式。
我在我的应用程序中使用资源 Controller 。另外我在几个模型中使用了 softdelete,所以我的路线如下:

Route::get('users/deleted', array('uses' => 'UserController@trash'));
Route::put('users/{id}/restore', array('uses' => 'UserController@restore'));
Route::resource('users', 'UserController');

第一种方法是显示已删除的对象。
第二个允许我恢复这些删除的元素。
第三个映射传统方法(创建、编辑、更新等)。

我有几个 Controller 以完全相同的方式工作,我想知道是否有任何方法可以告诉 laravel 默认使用这两种方法(垃圾和删除)而无需额外的两行。

是否可以?或者给我一个更好的方法?
(抱歉英语不好)

最佳答案

保持简单和干燥。

您可以扩展路由器并替换您的 app/config/app.php 中的路由门面。文件,但似乎做了很多工作但 yield 不大,但不要忘记您的路由文件是一个 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 个类:

路由器扩展,您将在其中添加新方法:
<?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 标识符('router')启动你的新路由器:
<?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');
}

}

还有一个 Facade,用来代替 Laravel 的 Facade
<?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'; }

}

然后您需要将您的服务提供商和外观添加到您的 app/config/app.php文件,评论 Laravel 原始文件。

关于laravel - 扩展资源 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22559810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com