Конфликт при создании динамической маршрутизации в Laravel - PullRequest
0 голосов
/ 29 января 2019

Я новичок в Ларавеле.Я хочу сделать маршрутизацию в 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 голосов
/ 29 января 2019

Создать только один маршрут domain/{username} -> UserController

В вашей функции UserController->__invoke() проверьте, является ли пользователь участником или администратором с вашей логикой.Вы можете написать класс для этого, если хотите, если вы не хотите помещать эту логику непосредственно в контроллер.

Затем, когда вы знаете, с каким пользователем вы имеете дело, передайте данныеMemberHandler или AdminHandler класс.Это может вернуть некоторые значения контроллеру, который вы передаете представлению, или вы можете сделать перенаправление в зависимости от возвращаемого значения.

Чтобы сделать его динамически , вы можете сделать что-то вроде этого: (но, конечно, вы могли бы также создать конструкции if-else для выбора правильного обработчика и представления, что помогло бы вашей 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));
}
0 голосов
/ 29 января 2019

Маршруты laravel инициализируют два маршрута как один, потому что не находят никакой разницы между ними, поэтому вы можете сделать это в двух подходах. 1. Используйте префикс для ваших маршрутов, например:

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

2.используйте один маршрут и обрабатывайте назначение с ролью пользователя в функции вашего контроллера, например, если ваш логин имеет роль 1, показывает панель администратора и если роль 2 перенаправляет на панель пользователя

Я советую первое решение, потому что у вас лучшеи оптимизировать коды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...