1

我有一个 Laravel 4 安装,我已经添加了ConfideEntrust包。

我正在尝试构建一个管理界面来管理用户、角色和权限。
我为权限创建了一个资源丰富的控制器,添加和销毁功能都可以正常工作,但编辑不能。该记录未更新数据库中的值。

这是我的控制器的代码:

<?php

class PermissionController extends BaseController {

     protected $permission;

     public function __construct(Permission $permission)
    {
        $this->permission = $permission;
    }

    ...

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        $permission = $this->permission->find($id);

        if (is_null($permission))
        {
            return Redirect::route('permissions.index');
        }

        return View::make('permissions.edit', compact('permission'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id)
    {
        $input = array_except(Input::all(), '_method');
        $validation = Validator::make($input, Permission::$rules);

        if ($validation->passes())
        {
            $permission = $this->permission->find($id);
            // create name from display_name
            $input['name'] = $this->_machine_str($input['display_name']);

            try {
                $permission->update($input);
                $queries = DB::getQueryLog();
                $last_query = end($queries);
                print_r($queries);
                die();
            } catch (Exception $e) {
                var_dump($e->getTraceAsString());
                die();
            }


            return Redirect::route('permissions.show', $id);
        }

        return Redirect::route('permissions.edit', $id)
            ->withInput()
            ->withErrors($validation)
            ->with('message', 'There were validation errors.');
    }

    ...
}

和模型:

<?php

use Zizaco\Entrust\EntrustPermission;

class Permission extends EntrustPermission
{
    /**
     *Soft delete enabled.
     * 
     * @var boolean 
     */
    protected $softDelete = true;

    protected $guarded = array('id');

    /**
     * Ardent validation rules
     *
     * @var array
     */
    public static $rules = array(
      'display_name' => 'required|between:4,32'
    );
}

如果我更改模型以扩展Eloquent,则更新有效,因此我可能与 EntrustPermission 模型有关。

我还检查了数据库调用,它只显示选择而不是任何类型的更新。

4

1 回答 1

1

由于文档中提到该update()方法的部分位于标题Saving A Model And Relationships下,我假设该update()方法最适合用于更新模型的关系,并且根本没有清楚地记录。

如果您改为采用“更手动”的方法来更新Permission模型的属性并使用该save()方法,您可能会取得更大的成功:

/**
 * Update the specified resource in storage.
 *
 * @param  int  $id
 * @return Response
 */
public function update($id)
{
    $input = array_except(Input::all(), '_method');
    $validation = Validator::make($input, Permission::$rules);

    if ($validation->passes())
    {
        $permission = $this->permission->find($id);
        // create name from display_name
        $input['name'] = $this->_machine_str($input['display_name']);

        try {
            // Change to update attributes "manually"
            $permission->name = $input['name'];

            // Update any other attributes as necessary
            $permission->any_other_attributes = $input['any_other_attributes']; // or  Input::get('any_other_attributes')

            // Finally, save (aka update) the Permission model's changes
            $permission->save();

            $queries = DB::getQueryLog();
            $last_query = end($queries);
            print_r($queries);
            die();
        } catch (Exception $e) {
            var_dump($e->getTraceAsString());
            die();
        }


        return Redirect::route('permissions.show', $id);
    }

    return Redirect::route('permissions.edit', $id)
        ->withInput()
        ->withErrors($validation)
        ->with('message', 'There were validation errors.');
}
于 2013-07-10T14:51:04.313 回答