2016-04-07 39 views
8

Bir kullanıcının karakterini silmek/güncellemek için yetkilendirmeye çalışıyorum. Bunu yapmak için ilkeleri kullanıyordum, ancak yalnızca bir parametreyi ilke işlevine iletebiliyordum. Kullanıcıdan ve başka bir değişkenden daha fazla geçersem, değişken işleve aktarılmaz.Laravel Politikaları - Birden çok bağımsız değişkenin nasıl iletileceği

Modeller: Kullanıcının birçok karakteri vardır, bir karakter birden çok gönderi gönderebilir.

Gate::define('delete-comment', function ($user, $post, $comment) { 
    // 
}); 

Ama edemedim: Yani yetkilendirme amacıyla, sana Gate Cephe daha katları geçebilir, ...- güncel karakterin kimliğine sahip yayının character_id karşılaştırmak docs Başına

olurdu Politikalarla bunu yapmak için zaten bulamıyorum. Yapmam gereken şey yetkilendirme için gereken nesneyi almak için Request nesnesini enjekte etmekti. Temelde Kullanıcı Nesnesine bile ihtiyacım olmaz.

public function update(User $user, Post $post) 
{ 
    return $user->id === $post->user_id; 
} 

İstek nesnesinin kullanılması işe yarıyor, ancak oldukça hacky hissediyor. Bunu başarmanın daha güzel bir yolu var mı?

düzenleme: CharacterLocationController yılında

Ben bir yöntem show var ve kaynak göstermeden önce harekete yetkilendirmek istiyorum.

public function show(Request $request, Character $character, Location $location) 
{ 
    $this->authorize([$location, $character]); 
    ... 
} 

politikası bu gibi kayıtlıdır: 'App\Location' => 'App\Policies\LocationPolicy'AuthServiceProvider

I politika işlevine aktarılan diziyi terk ve sadece $location çıkarır.

public function show(User $user, $data) { 
    dd($data); // expecting location and character 
    return !$location->private || $location->authorized->contains($this->character); 
} 

cevap

13

Burada hangi işlevlerin ne yaptığına dair bir karışıklık olabileceğini düşünüyorum.

sen yapıyorsun Tüm kuralları tanımlayarak edilir

Gate::define('delete-comment', function ($user, $post, $comment) { 
    // 
}); 

Ya CommentPolicy

public function delete(User $user, Post $post, Comment $comment) 
{ 
    return $user->id === $post->user_id; 
} 

içinde

kullandığınızda. Bu noktada, herhangi bir şeyi iletmekten endişe etmiyoruz, sadece aldığımız nesnelerin birbiriyle etkileşebiliyor olması ya da olması gerekiyor. Bu ikisi arasındaki tek fark, politikaları kullanırken, tüm kurallarınızı basit ve okunması kolay bir sınıfa ayırmanın kolay bir yoludur. Potansiyel olarak yüzlerce tablo ve modele sahip bir uygulamanız varsa, bu kuralların uygulamanızın tamamında yer alması durumunda politikaların kafa karıştırıcı hale gelmesi, politikaların bunların organize edilmesine yardımcı olur.

Aslında, bu öğeleri birlikte geçirmeniz gerektiğinde birinin bir şey yapma izninin olup olmadığını kontrol ettiğinizde. Örneğin, aşağıdakileri, parametreler politika veya Gate::define yönteme geçirilen olacak hangi kontrolleri budur CommentController

$this->authorize('delete', [$post, $comment]); 

yılında

if (Gate::allows('delete-comment', [$post, $comment])) { 
    // 
} 

Veya eğer bir söz vardır.Dokümanlara göre, $user parametresi sizin için zaten eklenmiştir, bu durumda, yalnızca doğru $post ve değiştirilmekte olan $comment'un iletilmesi konusunda endişelenmeniz gerekir.

+1

Hala bir soru kaldım rağmen, clearification için teşekkürler. Politikanın kendisi bir sınıfa eklenir (bir elverişli model gibi), böylece kural, ikinci tür olarak uygun türden bir nesneyi geçirirken otomatik olarak çağrılır. Bir dizi iletirseniz, 'CommentController' örneğinde yaptığınız gibi, hangi politika kullanılır? Geçirilen dizideki ilk nesneyi çözmeye çalışıyor mu? – Johannes

+0

Bazı testler yaptım ve dokümanlar geçtiğimiz her argüman için birden çok ilkeyi kullanacağını ima ediyor gibi görünüyor, ancak dizideki ilk öğe için yalnızca ilkeyi alabilmek için politikayı alabiliyordum. – user3158900

+0

Henüz politikaların kodunu okumadım. Dikkat edilmesi gereken, dediğiniz gibi değişkenlerin sırasını ifade eder. Türüne bağlı olarak ilk değişkenin politikasını çağırır. – Johannes

İlgili konular