在laravel中采用不止一种方法路由

Posted

技术标签:

【中文标题】在laravel中采用不止一种方法路由【英文标题】:Taking more than one method to route in laravel 【发布时间】:2021-12-05 01:20:02 【问题描述】:

所以,我正在做一个表单,我想在 Laravel 8 中将多个方法从我的控制器带到同一个路由。

有可能吗? 因为我一直在搜索,但我看到的所有答案都是针对旧版本的,其中路由有点不同。

我试图这样适应,但我发现我做错了:/

Route::post('/editProfile', [
    'avatar' => [UserController::class, 'updateAvatar'],
    'bgImage' => [UserController::class, 'updateBGImage'],
]);

在 UserController 我有:

class UserController extends Controller

    //
    public function profile()
        return view('profile', array('user' => Auth::user()));

    

    

    public function updateAvatar(Request $request) 
        
        //Handle the user upload of the avatar
        if($request->hasFile('avatar')) 
            $avatar = $request->file('avatar');
            $filename = time() . '.' . $avatar->getClientOriginalExtension();
            Image::make($avatar)->resize(300, 300)->save( public_path('uploads/avatars/' . $filename));

            $user = Auth::user();
            $user->avatar = $filename;
            $user->save();

        
        return view('profile', array('user' => Auth::user()));
    

    public function editProfile()
        return view('editProfile', array('user' => Auth::user()));

    

    public function updateBGImage(Request $request) 
        
        //Handle the user upload of the avatar
        if($request->hasFile('bgImage')) 
            $bgImage = $request->file('bgImage');
            $filename = time() . '.' . $bgImage->getClientOriginalExtension();
            Image::make($bgImage)->resize(300, 300)->save( public_path('uploads/bgImages/' . $filename));

            $user = User::find(auth()->user()->id);
            $user->bgImage = $filename;
            $user->save();

        
        return view('profile', array('user' => Auth::user()));
    

【问题讨论】:

【参考方案1】:

虽然有很多方法可以解决这个问题,但我认为最简洁的方法可能是设置不同的路由,而不是其他选择。

Route::post('/editProfileAvatar', [UserController::class, 'updateAvatar']);
Route::post('/editProfileBackground', [UserController::class, 'updateBGImage']);

或者,您可以在控制器中创建一个新方法来处理逻辑,例如:

路线

Route::post('/editProfile', [UserController::class, 'handleRequest']);

控制器

public function handleRequest(Request $request) 
    
    //Handle the user upload of the avatar
    if($request->hasFile('avatar')) 
        return $this->updateAvatar($request);
    
    
    //Handle the user upload of the background image
    if($request->hasFile('bgImage')) 
        return $this->updateBGImage($request);
    

对于第二个示例,您可以根据需要将 updateAvatar 和 updateBGImage 方法设为私有,

【讨论】:

使用第二种方法,“updateAvatar”功能有效,但“bgImage”只返回一个白页,它不会改变图像。这很可惜,因为它确实是我想要的。因为我试图将所有内容都放在同一个表单中,所以我不能使用不同的路由链接 我真的无法从我的椅子上解决这个问题。也许你也在请求中发送头像,但它是空的,所以它永远不会到达第二个 IF,也许有一个 php 错误但你关闭了错误。我的回答更像是概念证明,因为我无法查看/调试或理解您的应用程序的其余部分。

以上是关于在laravel中采用不止一种方法路由的主要内容,如果未能解决你的问题,请参考以下文章

laraver框架学习------工厂模型填充测试数据

手把手教你跑Larave框架实战笔记系列之二

larave学习笔记1-安装配置

Laravel 在身份验证异常时自动重定向

如何在 Laravel 中声明采用这两个参数的路由?

Laravel基础教程