我怎么能说Laravel如果线程属于这个用户,允许他编辑或删除线程?

时间:2016-02-26 14:05:10

标签: php database laravel authentication

好吧,我的标题几乎说明了我需要的一切。我正在为我建立一个小网站,只是为了学习laravel框架。我创建了一个登录/注册和一些函数来做一个线程或删除/编辑线程。我目前的问题是,登录的用户是否与编写线程的用户相同无关紧要。只是用户登录的事实,允许他编辑或删除我的网页上的每个单独的线程。那当然不喜欢它应该是...这就是为什么我喜欢得到的说法:如果用户登录,有一些线程,然后允许他删除或编辑自己的线程。如果用户不是编写线程的用户,则不要向他显示删除或编辑线程的选项。

现在这是我当前的HTML - 或者更好的剪辑它:

   @if( Auth::check())
        <div class="panel-footer">
            {!! Former::horizontal_open()->method('DELETE')->action(action("Test\\TestController@destroy", $thread->id))->id('conf') !!}
            {!! Former::danger_submit('Delete') !!}
            {!! Former::close() !!}

            <a href="{{ URL::route('edit', $thread->id) }}">
            <div class="btn btn-primary">Edit</div>
            </a>
        </div>
    @endif
    </div>
    <a href="#">
        <div class="btn pull-right"><a href="{{ action('Test\\TestController@index') }}">Go back</a></div>
    </a>

所以这只是检查用户是否登录,如果没有,他没有看到编辑/删除按钮。如果他已经登录,他当然会看到他们。

现在我需要一个代码来说明他是否与写线程相同,然后允许他编辑/删除它。

好吧,我真的不知道怎么做到这一点,而且我还没有找到适合自己的东西..

我有两个型号。一个用于所有线程,一个用于所有用户。

我在我的线程模型中做了'belongsTo',并说它属于我的用户表中的name属性。

线程模型:

<?php
namespace App\Models\Thread;

use Illuminate\Database\Eloquent\Model;

class Thread extends Model {
    public $table = 'thread';
    public $fillable = [
        'thread',
        'content',
    ];

    public function user() {
        return $this->belongsTo(User::class, "name");
    }
}

用户模型:

<?php
namespace App\Models\Thread;

use Illuminate\Database\Eloquent\Model;

class User extends Model {
    public $table = 'users';
    public $fillable = [
        'name',
    ];
}
好吧..我被卡住了,我希望有人可以帮我这个。

感谢您的帮助和支持

我可以帮助的其他代码部分:

Route::get('/show/{id}', 'Test\\TestController@show');
Route::get('/show/{id}/edit', 'Test\\TestController@edit')->name('edit');
Route::put('/show/{id}/edit', ['as' => 'editing', 'uses' => 'Test\\TestController@update']);
Route::delete('/show/{id}', 'Test\\TestController@destroy')->name('destroy');

这就是我必须展示线程的所有路线,或删除/编辑线程

控制器:这是show函数,它通过按钮为我提供视图:

  public function show($id)
    {
        $thread = Thread::query()->findOrFail($id);
        return view('test.show', [
            'thread' => $thread,
        ]);
    }

2 个答案:

答案 0 :(得分:1)

您可以使用Laravel的ability系统。

或者在控制器中编辑线程时,您可以执行以下操作:

$thread = Thread::findOrFail($thread_id);

if (!Auth::check() &&
    $thread->user()->first()->id != Auth::user()->id) {
    abort(404); // Stop the user
} else {
    // Edit the threat
}

编辑您的编辑:

这对你有用吗?

public function show($id)
{
    $thread = Thread::findOrFail($id);

    if (!Auth::check() &&
        $thread->user()->first()->id != Auth::user()->id) {
        abort(404); // Stop the user
    }

    return view('test.show', [
        'thread' => $thread,
    ]);
}

答案 1 :(得分:1)

我认为做你想做的最好的方法是使用请求类。您只需要创建一个新的请求:

<?php
namespace App\Http\Requests;

 /** Remember to include here the classes you are using, 
  *  in your case it would be something like this:
  */
use App\Models\Thread;
use Auth;

class EditThreadRequest extends Request {
   /**
    * Determine if the user is authorized to make this request.
    *
    * @return bool
    */
    public function authorize()
    {
      /**
        * You can get the thread id from your view
        * using for example a hidden input
        * {!! Form::hidden('id', $thread->id) !!}
        */
      $thread = Thread::findOrFail($this->get('id'));
      return $thread->user->id === Auth::user()->id;
    }

   /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
    public function rules()
    {
      return [
         // Your validation rules
      ];
    }
}

如果线程属于该用户,则上述函数将返回true,允许用户继续请求。

在此之后,您只需要在编辑功能中包含新创建的请求,它将自动检查用户是否可以编辑线程:

public function edit (EditThreadRequest $request)
{
  // Your code
}

希望这有帮助!