我怎么能说 Laravel 如果线程属于这个用户,允许他编辑或删除线程?
Posted
技术标签:
【中文标题】我怎么能说 Laravel 如果线程属于这个用户,允许他编辑或删除线程?【英文标题】:How do I can say Laravel that if the thread belongs to this user, allow him to edit or delete the thread? 【发布时间】:2016-06-09 18:58:57 【问题描述】:嗯,我的标题几乎说明了我需要的一切。我正在为我建立一个小网站,只是为了学习 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' 实现,并说它属于我的用户表中的名称属性。
线程模型:
<?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');
这就是我必须仅显示线程或删除/编辑线程的所有路线
控制器:即显示功能,它为我提供了带有按钮的视图:
public function show($id)
$thread = Thread::query()->findOrFail($id);
return view('test.show', [
'thread' => $thread,
]);
【问题讨论】:
看看这个laravel.com/docs/5.2/authorization#defining-abilities 好吧,我明白这一点并理解其中的大部分内容,但我更像是一个 laravel 初学者,所以无法想象我现在可以从哪里开始...... 【参考方案1】:我认为做你想做的最好的方法是使用 Request 类。你只需要创建一个新的请求:
<?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
希望这会有所帮助!
【讨论】:
我只是在问我是否做对了。我会做一个请求文件(命名为例如 EditThreadRequest 并把你给我的代码放在那里。之后我将编辑我的编辑功能(和删除功能太正确):------------ - 公共函数编辑 (EditThreadRequest $request, $id ) ... (删除函数也一样)----对吗? 没错,您应该在每次必须创建/编辑某些内容时创建一个新请求:CreateThreadRequest、EditThreadRequest... 这样您就可以验证您的输入字段并授权/不授权该请求。您可以像这样通过命令行创建一个新请求:php artisan make:request EditThreadRequest. 我试过了,但它给了我一个:类 App\Http\Requests\Auth\EditThreadRequest 不存在——当然我做了一个:使用 App\Http\Requests\Auth\EditThreadRequest; 为什么在路径中包含 \Auth\?你的路径应该是使用 App\Http\Requests\EditThreadRequest; 因为我在 php 类文件之前做了一个 Auth 字典 -- 我会更改它并再试一次【参考方案2】:你可以使用 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,
]);
【讨论】:
我会试试你的代码 :) 我唯一不明白的是 ->first() 部分.. 这是为了什么?我真的很想使用 laravel 的能力系统,但我并不真正理解它:/ 我看到它,当然明白它意味着什么,但我不知道我从哪里开始等等...... @ItzMe488 你可以试试$thread->user->id
,基本一样。
好吧.. 试过了,但是没有用.. 我想我做错了一些事情.. 我不知道我应该把代码放在哪里。我将使用我的显示功能更新我的问题。我的显示功能显示删除/编辑按钮所在的页面。因此,如果您单击一个线程(在我拥有的线程列表中),那么您将直接进入 show route -> show 函数,并且该函数将您定向到带有按钮等的 HTML ......我将更新我的对某些事情提出疑问,因为我真的不知道如何正确编写代码。 -- 顺便说一句,我对我的数据库做了一个 thread_id 属性。
我无法真正测试它,因为我得到一个:Class 'App\Http\Controllers\Test\Auth' not found 异常。
将此添加到文件顶部但在命名空间下:Use Auth;
以上是关于我怎么能说 Laravel 如果线程属于这个用户,允许他编辑或删除线程?的主要内容,如果未能解决你的问题,请参考以下文章