如何调用laravel或slim路线中的方法?
我们说我有这样的课程:
namespace App;
class App
{
public function getApp(){
return "App";
}
}
我想以这种方式打电话
$route->get('App\App','getApp');
我该怎么做?
答案 0 :(得分:0)
最简单的方法
call_user_func_array(['App\App', 'getApp'], $params_if_needed);
php.net source call_user_func_array()
如果您需要检查方法是否存在,请使用
method_exists('SomeClass','someMethod') // returns boolean
所以你的路由器类可能是下一个:
class Router
{
public function get($class, $method)
{
if($_SERVER['REQUEST_METHOD'] !== 'GET') {
throw new SomeCustomNotFoundException();
}
if (!method_exists($class, $method)) {
throw new SomeCustomNoMethodFoundException();
}
call_user_func_array([$class, $method], $_REQUEST); //with params
// OR
call_user_func([$class, $method]); //without params, not sure
}
}
如果您想以更聪明的方式进行操作,可以使用Reflection,它将为您提供有关类/方法存在的信息,并提供有关方法参数的信息,以及哪些是必需的或可选的。
UPDATE:此示例要求方法是静态的。对于非静态,你可以在Router类中为类存在添加check(class_exists($ class))并像这样做
$obj = new $class();
$obj->$method(); //For methods without params
更新(2)要检查此问题,请转到here并粘贴下一个代码
<?php
class Router
{
public function get($class, $method)
{
if($_SERVER['REQUEST_METHOD'] !== 'GET') {
throw new SomeCustomNotFoundException();
}
if(!class_exists($class)) {
throw new ClassNotFoundException();
}
if (!method_exists($class, $method)) {
throw new SomeCustomNoMethodFoundException();
}
call_user_func_array([$class, $method], $_REQUEST); //with params
// OR
//call_user_func([$class, $method]); //without params, not sure
}
}
class Test
{
public static function hello()
{
die("Hello World");
}
}
$route = new Router();
$route->get('Test', 'hello');