在运行时将字符串评估为类

时间:2018-02-08 09:37:06

标签: php laravel laravel-routing autoload

大家好我有一个静态函数,这个函数在我的laravel 5应用程序中的几个模型中很常见,我想使用一个路径来调用特定模型中的函数。这是我的方法......

Route::get('/obj/{model}/call', function($model){
   $model = ucfirst($model);  //make the first letter uppercase
   $model::callObjParam();    //evaluate string to model
});

所以字符串解析为this ::

'asset' -  'obj/asset/call' using the 'Asset' model, 
'user' - 'obj/user/call' using the 'User' model,
'Role' - 'obj/role/call' using the 'Role' model

但我一直收到错误:

  

routes.php第122行中的FatalThrowableError   Class' Asset'找不到

有没有办法将字符串计算到类?

2 个答案:

答案 0 :(得分:2)

这样做是个坏主意,但如果你真的想这样做,请使用类的完整命名空间:

$model = 'App\\' . studly_case($model);
$model::method();

此外,您应验证输入模型名称并使用studly_case()帮助程序将字符串转换为正确的类名。

答案 1 :(得分:1)

如果您只有3个案例,也可以这样做:

switch($model){
    case 'asset' :
        Asset::callObj();
        break;
    case 'user' :
        User::calObj() ;
        break;
    case 'role' : 
        Role::calObj() ;
        break;
    case default : 
        default::callObj()
        break;
}