-
PHP默认魔术方法中,__invoke,当尝试以调用函数的方式调用一个
对象
时,该方法会被自动调用class invoke { public function __invoke($x) { var_dump($x); } } $obj = new invoke; $obj(10);
__call和__callStatic,通过对象调用一个它并不包含的runTest()
方法
时,就会自动调用类中__call()方法。当我们调用一个这个类中并不存在的静态方法
runTest()时,则会自动调用类中__callStatic()方法class MethodTest { public function __call($name, $arguments) { // 注意:$name的值区分大小写 echo "Calling object method '$name' " . implode(', ', $arguments) . "\n"; } // PHP 5.3.0之后的版本 public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments) . "\n"; } } $obj = new MethodTest; $obj -> runTest('in object context'); // PHP 5.3.0 版本以后 MethodTest::runTest('in static context');
Laravel中,如果你想要定义一个只处理单个行为的控制器,你可以在控制器中放置一个 __invoke 方法:
namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class ShowProfile extends Controller { /** * 显示给定用户的资料. * * @param int $id * @return View */ public function __invoke($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
当注册单个行为控制器的路由时,你不需要指明方法
Route::get('user/{id}', 'ShowProfile');
你可以通过 Artisan 命令工具里的 make:controller 命令中的 --invokable 选项来生成一个可调用的控制器:
php artisan make:controller ShowProfile --invokable
-
只在控制器的两个方法中执行中间件
class UserController extends Controller
{
/**
* 实例化一个新的控制器实例.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
// 只在方法first和second中执行中间件
$this->middleware('log')->only('first', 'second');
$this->middleware('subscribed')->except('store');
}
}