【问题标题】:Redirect in Laravel controller to own functions [duplicate]在 Laravel 控制器中重定向到自己的功能 [重复]
【发布时间】:2018-05-27 02:55:00
【问题描述】:

我在一个 Laravel 项目中有很多资源控制器,我通常会这样做:

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request $request
 * @param  int $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
    $chat = Chat::find($id);
    $chat->customer_id = $request->get('customer_id');
    $chat->content = $request->get('content');
    $chat->save();
    return redirect('/chat');
}

由于路线有时会发生变化,我继续使用另一个重定向,如下所示:

return redirect()->action('ChatController@index');

这对我来说效果更好,因为现在路线可以是他们想要的任何东西,它仍然可以正常工作。然而还有另一个“问题”,那就是控制器的名称。如果我将 ChatController 重命名为 CustomerChatController,此操作确实需要返工,这有点烦人。

我的问题:是否有开箱即用的技巧来始终针对“自我”控制器。像

return redirect()->action(self::class . '@index');

因此,至少在控制器内部,控制器的任何重命名都无关紧要?

编辑:是的,我以前见过命名路线,但这不是重复的帖子。命名路由对于资源控制器来说有点混乱。正如文档所述:

Route::resource('photo', 'PhotoController', ['names' => [
    'create' => 'photo.build'
]]);

人们也可以在那里命名路由,但我最终会得到数百个名称,而且我真的不关心这些名称中的任何一个(说到资源控制器,我确实给出了一个名称)。

编辑2: 所以你告诉我,而不是像这样的约 150 条路线中的 1 条

Route::resource('chat', 'ChatController');

我应该将它添加到 routes/web.php:

Route::resource('chat', 'ChatController',
    ['names' => [
        'create' => 'chat.create',
        'update' => 'chat.update',
        'store' => 'chat.store',
        'destroy' => 'chat.destroy',
        'edit' => 'chat.edit',
        'index' => 'chat.index',
        'show' => 'chat.show'
    ]]);

然后使用这些名称。这就是为什么它是重复的帖子?这对我来说似乎很愚蠢。资源控制器很酷,因为它们不会因重复行为而弄乱路由表,并且通过您对命名路由的解决方案,我最终得到 7 行而不是一个资源控制器路由。

解决方案: 似乎我已经很接近了。这个工作正常:

return redirect()->action(class_basename(self::class) . '@index');

我在这里找到了提示:

Get Laravel 5 controller name in view

最终解决方案:为了有一些自动代码完成,顺便说一下,我从来没有遇到过像 return redirect()->route('chat.create'); 这样的命名路由,我将基本路由添加到控制器。

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    protected static function routeCustom($name)
    {
        $action = app('request')->route()->getAction();
        $controller = class_basename($action['controller']);
        list($controller, $action) = explode('@', $controller);

        return $controller . '@' . $name;
    }

    protected static function routeIndex()
    {
        return self::routeCustom('index');
    }

    protected static function routeStore()
    {
        return self::routeCustom('store');
    }

    protected static function routeEdit()
    {
        return self::routeCustom('edit');
    }

    protected static function routeCreate()
    {
        return self::routeCustom('create');
    }

    protected static function routeShow()
    {
        return self::routeCustom('show');
    }

    protected static function routeUpdate()
    {
        return self::routeCustom('update');
    }

    protected static function routeDestroy()
    {
        return self::routeCustom('destroy');
    }
}

所以我可以访问它们以在同一个控制器中重定向,如下所示:

return redirect()->action(self::routeIndex());

重定向到WhateverController@index

【问题讨论】:

  • 我有这个问题的答案here ;)
  • @Maraboc 的解决方案指出,使用命名路由似乎是最优雅的方式。
  • 请下次发帖前先搜索一下...
  • 是的,我见过命名路由,但这对于资源控制器来说有点混乱。正如文档所述:Route::resource('photo', 'PhotoController', ['names' => [ 'create' => 'photo.build' ]]); 也可以在那里命名路线,但我最终得到了数百个名称,我真的不关心这些名称中的任何一个(说到资源控制器,我确实给出了一个名称)。
  • 因此,如果您陷入重复的炼狱中,提出一个新问题通常更有意义,并添加将其区分为独特问题的细节。此外,永远不要回答问题中的问题。那是要求将其删除(您会因此而失分)。

标签: php laravel controller routing


【解决方案1】:

我认为更好的解决方案是为路由命名并使用 redirect()->route('routeName'); 这样您的控制器名称将不依赖于重定向。

您可以在此处阅读更多相关信息: https://laravel.com/docs/5.5/routing

【讨论】:

  • 我同意你的看法
  • 不,我只是不想为我的控制器跟踪超过 100 个随机名称,并且在命名路由上没有代码完成。对我来说,这感觉就像 PHP4 和大量包含,自动加载之前的世界。我真的不在乎路线。它可以是任何控制器的名称。
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2017-10-08
  • 2018-04-03
相关资源
最近更新 更多