Создание промежуточного программного обеспечения Laravel 5.1, которое может получить доступ к моей модели

В Laravel 4.2 у меня был следующий фильтр, который не позволял одному пользователю просматривать/редактировать/удалять курс другого пользователя, который представляет собой объект, основанный на модели «Курс». Вот код, который я использовал:

Route::filter('restrictPermission', function($route)
{
    $id = $route->parameter('id');
    $course = Course::find($id);
    $user_id = $course->user_id;
    if(Auth::user()->id !== $user_id)
        return Redirect::to('/')->with('flash_message', '*** Permission denied ***');
    # This compares the currently logged in user's id to the course's
    # user ID (in the database) so that the logged in user can 
    # only view or delete their own courses.
});

Вот промежуточное программное обеспечение, которое я пытаюсь создать, которое делает то же самое, что и фильтр выше:

<?php
namespace App\Http\Middleware;
use Closure;

class RedirectIfWrongUser
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $id = $route->parameter('id');
        $course = Course::find($id);
        $user_id = $course->user_id;
        if ($request->user()->id !== $user_id) {
            return Redirect::to('/')->with('flash_message', '*** Permission denied ***');
        }

        return $next($request);
    }
}

Проблема в том, что я не знаю, как заставить промежуточное ПО распознавать класс Course и функциональность Course::.

Любая конструктивная помощь будет принята с благодарностью.


person    schedule 07.08.2015    source источник
comment
Спасибо, Бен, я ценю усилия, и вы предоставили мне хотя бы одно потенциальное решение :)   -  person user3089840    schedule 07.08.2015
comment
вы должны использовать Gate для этой цели laravel.com/docs/5.3/authorization   -  person Ali Sherafat    schedule 26.02.2017


Ответы (1)


Я думал, что это очень просто, когда механизм DI уже на месте.

<?php
    namespace App\Http\Middleware;
    use Closure;
    use App\Course;


    class RedirectIfWrongUser
    {
        protected $course;

        public function __construct(Course $course) {
            $this->course = $course;
        }
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // normally I do this, this will get the id for routes /user/{id}

            $id = $request->id;

            // if you want the actual route, do this
            // $route = $request->route();

            $course = $this->course->find($id);
            $user_id = $course->user_id;
            if ($request->user()->id !== $user_id) {
                // better use shorthand
                return redirect()->to('/')->with('flash_message', '*** Permission denied ***');
            }

            return $next($request);
        }
    }
person wayne    schedule 07.08.2015
comment
Спасибо, Уэйн. Я не знал, что у переменной $request есть такое свойство. - person user3089840; 07.08.2015