Laravel - 扩展ResourceController

时间:2014-04-06 15:31:21

标签: php laravel

我有两种不同的形式应该使用一个控制器。我使用routes.php中的以下方法将此控制器创建为资源控制器:

Route::resource('account', 'AccountController');

在第一种形式中我使用

{{ Form::model($user, array('route' => array('account.update', $user->id), 'method' => 'PUT', 'class' => 'form-outside', 'files' => true)) }}

由于资源控制器知道更新功能,因此效果很好。

但是,我想创建第二个表单,该表单与帐户相关并更新用户个人资料的其他部分。我现在想通过像" updateSettings这样的函数扩展Controller。"

但我怎么能这样做?我在AccountController中创建了一个函数,并在第二种形式中使用以下函数:

{{ Form::model($user, array('action' => array('AccountController@updateSettings', $user->id), 'method' => 'PUT', 'class' => 'form-outside')) }}

但是Laravel引发了一个例外

  

路由[AccountController @ updateSettings]未定义。

如何扩展我的资源控制器,updateSettings是一种有效的方法?或者如何在没有资源控制器的情况下使用模型绑定表单?

谢谢!

2 个答案:

答案 0 :(得分:0)

要完全扩展资源控制器,您需要扩展该类 Illuminate\Routing\Router并覆盖所需的方法。下一步是使用App::bind()将旧的Router类替换为您要编写的新类。

更快的方法是只使用一条新路线,为您的routes.php提供一个唯一的名称: App::put('updateSettings', 'AccountController@updateSettings')。祝你好运。

答案 1 :(得分:0)

  

或者如何在没有资源的情况下使用模型绑定表单   控制器?

因此,在这种情况下,您可以从控制器绑定模型,实际上您可以手动传递模型,例如,如果您有Post模型并想要编辑帖子,那么您可以手动加载来自控制器的模型并将其传递给视图以与表单绑定,例如:

class PostController extends BaseController {

    //...
    public function getEdit($id)
    {
        $post = Post::find($id);
        return View::make('post.edit')->with('post', $post);
    }

    public function postUpdate($id)
    {
        //...
    }
}

然后在你的views/post/edit.blade.php中,您可以使用以下内容:

{{ Form::model($post, array('route' => array('post.update', $post->id) )) }}

现在您需要为这些方法创建路径,如下所示:

Route::get('post/edit/{id}', array('as' => 'post.edit', 'uses' => 'PostController@getEdit'));
Route::post('post/update/{id}', array('as' => 'post.update', 'uses' => 'PostController@postUpdate'));