在Laravel中进行动态路由时发生冲突

时间:2019-01-29 11:57:19

标签: laravel laravel-5

我是Laravel新手。我想在Laravel中进行路由。

  • domain/{member_name} -> to MemberController
  • domain/{admin_name} -> to AdminController

但是当我访问domain/example-admin-name时,它只会转到MemberController

我知道我可以做domain/member/{member_name}domain/admin/{admin_name}

但是我希望它很简单并且只有一个段URI

2 个答案:

答案 0 :(得分:0)

laravel路由将两个路由初始化为一个,因为它们之间没有发现任何区别,因此您可以采用两种方法 1.为您的路线使用前缀,例如:

domain/users/{member_name} -> to MemberController
domain/admin/{admin_name} -> to AdminController

2。使用一条路由并在控制器功能中以用户角色处理目的地,例如,如果登录用户具有角色1 show admin面板,如果角色2重定向到用户面板

我建议您使用第一个解决方案,因为您拥有更好的代码并对其进行了优化。

答案 1 :(得分:0)

仅创建一条路线domain/{username}-> UserController

在您的UserController->__invoke()函数中,根据您的逻辑检查用户是成员还是管理员。如果您愿意,可以将其编写为一个类,如果您不想将该逻辑直接放入控制器中。

然后,当您知道要处理的用户类型时,将数据传递到MemberHandlerAdminHandler类。这些可以将一些值返回给您传递给视图的控制器,或者您可以根据返回值进行重定向。

要使其动态,您可以执行以下操作:(但是当然,您还可以构建if-else构造,以选择正确的Handler和View,这将帮助您的IDE知道您所使用的类实际使用)。

public function __invoke(Request $request, $username){

    // return 'Member' or 'Admin'
    $userType = $this->getUserType($username);

    // break out of function if userType is invalid
    if(!$userType){
        return 'cannot match usertype';
    }

    // compile the fully qualified class name for your handler
    // this should produce \App\MyClasses\MemberHandler or \App\MyClasses\AdminHandler respectively
    $targetHandlerClass = '\\App\\MyClasses\\' . $userType . 'Handler';

    // instantiate your dynamically picked user handler
    $handler = new $targetHandlerClass($username);

    $data = $handler->doSomething();

    // calls the view named 'Member.blade.php' or 'Admin.blade.php'
    return view($userType, compact($data));
}