【问题标题】:Routing Issue, Calling Controller based on Variables in URL- Laravel 4路由问题,基于 URL-Laravel 4 中的变量调用控制器
【发布时间】:2015-01-01 18:13:47
【问题描述】:

我正在使用 Laravel 4 开发一个应用程序,我需要做的是: 假设我有以下路线:

  Route::get('/myroute/{entity}/methodname',

  );

在其中我需要根据实体变量来决定应该调用哪个控制器和方法,例如:

 'MyNameSpace\MyPackage\StudentController@methodname'

如果

entity == Student 

并调用

  'MyNameSpace\MyPackage\StaffController@methodname'

如果

    entity == Staff

如何在 Laravel 4 路由中完成是否有可能,或者我必须想出 2 条不同的路由,比如?

    Route::get('/myroute/Student/methodname') and Route::get('/myroute/Staff/methodname')

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    这应该符合您的需要

    Route::get('/myroute/{entity}/methodname', function($entity){
        $controller = App::make('MyNameSpace\\MyPackage\\'.$entity.'Controller');
        return $controller->callAction('methodname', array());
    }
    

    现在为了避免错误,我们还要检查控制器和动作是否存在:

    Route::get('/myroute/{entity}/methodname', function($entity){
        $controllerClass = 'MyNameSpace\\MyPackage\\'.$entity.'Controller';
        $actionName = 'methodname';
        if(method_exists($controllerClass, $actionName.'Action')){
            $controller = App::make($controllerClass);
            return $controller->callAction($actionName, array());
        }
    }
    

    更新

    要使过程更加自动化,您甚至可以使动作名称动态化

    Route::get('/myroute/{entity}/{action?}', function($entity, $action = 'index'){
        $controllerClass = 'MyNameSpace\\MyPackage\\'.$entity.'Controller';
    
        $action = studly_case($action) // optional, converts foo-bar into FooBar for example
        $methodName = 'get'.$action; // this step depends on how your actions are called (get... / ...Action)
    
        if(method_exists($controllerClass, $methodName)){
            $controller = App::make($controllerClass);
            return $controller->callAction($methodName, array());
        }
    }
    

    【讨论】:

    • 不客气。此外,如果您希望您的动作名称是动态的,只需在路由定义中将其包裹在{ } 中,将其作为“actionName”传递并删除$actionName = 'methodname' ;)
    • lukasgeiter,你已经回答了我的问题,如果你也让我知道如何在不指定其功能的情况下调用控制器,我将非常感谢,例如:Route::get('/ myroute/{entity}/', );会自动调用EntityController
    • @Siavosh 你的意思是myroute/entity/ 应该调用index 操作?
    • 根据我的理解,如果EntityController里面有getMethodname()函数,路由'/myroute/{entity}/methodname'会自动调用Controller的那个方法
    • 非常感谢,非常有帮助
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2013-06-11
    • 2022-01-04
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多