类名作为公共函数中的参数

时间:2014-05-25 16:24:03

标签: php class oop laravel laravel-4

有什么区别:

class PostController extends \BaseController {
      public function delete($id) {
        $deletePost = Post::findOrFail($id);
        return View::make('backend.delete')->with('post', $deletePost);
      }
}

class PostController extends \BaseController {
      public function delete(Post $post) {
        return View::make('backend.delete')->with('post', $post);
      }
}

有人可以向我解释:public function delete(Post $post)

我们将名为“Post”的类作为变量$post

UPDATE1。

在routes.php中:

Route::model('post', 'Post');

Route::get('delete/{post}', array('uses' => 'PostController@delete'));
Route::post('delete', array('uses' => 'PostController@doDelete'));

并在PostController.php中:

public function delete(Post $post) {
    return View::make('backend.delete')->with('post', $post);
}

public function doDelete() {
    $post = Post::findOrFail(Input::get('id'));
    $post->delete();

    return Redirect::action('PostController@home');
}

但无论如何我得到一个错误:模型[Post]没有查询结果。 用第二种方法。

2 个答案:

答案 0 :(得分:2)

它们都能为你提供模型(如果它存在)。

第二种方式称为Route Model binding。路径模型绑定提供了一种将模型实例注入路径的便捷方法。

将模型绑定到路线:

Route::model('post', 'Post');

接下来,定义包含{user}参数的路由:

Route::get('delete/{post}', array('uses' => PostController@delete));

因此我们将{post}参数绑定到Post模型,Post实例将被注入到路径中。

这意味着如果有人到达你的delete()函数 - 他们已经提供了一个有效的Post模型 - 相当于Post::findOrFail($id)

答案 1 :(得分:2)

这只是一种暗示:

  

“类型提示意味着你传递的任何内容都必须是(   和你提示的类型一样。“

在你的例子中它是Post:

public function delete(Post $post) { /* code */ }

它只是检查$post变量是否实例。所以你的代码中的一切都很好看。它应该工作。