2013-05-26 17 views
5

Bu, Laravel 4'ün bir çoğunun benim için yeni olduğu gibi bir aptal soru ise özür dileriz. Kendi parola doğrulama kurallarını tanımlamak (gönderme sırasında çekirdeğe kodlanmış) tanımlamak ve hata raporlama yöntemini ($ errors dizisinde kullanılan) değiştirmek istediğim için temel parola işlevindeki birkaç yöntemi geçersiz kılmaya çalışıyorum. oturum temelli değil, diğer formlar. Bir core Laravel 4 sınıf yöntemini geçersiz kılın.

Yani benim yaklaşım yeni bir sınıf yaratmaktı/app/lib/Projem şöyle Password.php denilen/Kullanıcı içinde: Ben den sıfırlama yöntemini kopyaladık

<?php namespace MyProject\User; 

use Closure; 
use Illuminate\Mail\Mailer; 
use Illuminate\Routing\Redirector; 
use Illuminate\Auth\UserProviderInterface; 

    class Password extends \Illuminate\Support\Facades\Password 
    { 
     /** 
    * Reset the password for the given token. 
    * 
    * @param array $credentials 
    * @param Closure $callback 
* @return mixed 
*/ 
public function reset(array $credentials, Closure $callback) 
{ 
    // If the responses from the validate method is not a user instance, we will 
    // assume that it is a redirect and simply return it from this method and 
    // the user is properly redirected having an error message on the post. 
    $user = $this->validateReset($credentials); 

    if (! $user instanceof RemindableInterface) 
    { 
     return $user; 
    } 

    $pass = $this->getPassword(); 

    // Once we have called this callback, we will remove this token row from the 
    // table and return the response from this callback so the user gets sent 
    // to the destination given by the developers from the callback return. 
    $response = call_user_func($callback, $user, $pass); 

    $this->reminders->delete($this->getToken()); 

    return $response; 
} 

} 

/satıcı/laravel /framework/src/Illuminate/Auth/Reminders/PasswordBroker.php, çekirdek şifre cephesinin nerede çözüleceği gibi görünüyor.

Sonra composer.json dosyasında, ben ekledim

autoload için aşağıdaki: ClassMap dizi:

"app/lib/MyProject/User" 

Son olarak, benim /app/config/app.php dosyasında ben tadil ettik Parola diğer adı:

'Password' => 'MyProject\User\Password', 

Tamam. Benim routes.php dosyasında hemen hemen dokümanlardan düz alınır takipçileriniz var:

Route::post('password/reset/{token}', function() 
{ 
    $credentials = array('email' => Input::get('email')); 

    return Password::reset($credentials, function($user, $password) 
    { 
     $user->password = Hash::make($password); 

     $user->save(); 

     return 'saved - login'; 
    }); 
}); 

zaman bu sıfırlama() yöntemi aşağıdaki hatayı alıyorum, çalıştırır:

Non-static method MyProject\User\Password::reset() should not be called statically

sıfırlama() yöntemi genişletmekte olduğum sınıf statik değil, bu yüzden beni şaşırttı, ancak sıfırlama yöntemimi statik olarak ayarlayarak bu hatayı temizler.

Using $this when not in object context

$ this-> validateReset ($ kimlik) çalıştırmak çalışırken gelir: Sonraki olsa aşağıdaki hatayı alıyorum.

Artık tamamen derinliğim bitti. Bunu doğru yoldan mı yoksa tamamen doğru yoldan mı geçiyorum? Herhangi bir tavsiye

+0

bunu çözdünüz mü? Öyleyse - lütfen cevap veya yorum gönderebilir misiniz? Teşekkürler – Laurence

+0

Hayır Korkarım ki yapmadım. Başlangıçta Laravel/Laravel projesinde GitHub ve daha sonra Laravel/Framework projesinde bir sorun kaydettim. Taylor dupe olarak kapatıldı şimdi yeniden açmak için gidiyorum bu yüzden, yanlış düşünüyorum: https://github.com/laravel/framework/issues/1672 –

+0

bu * hala * bir sorun (ya da en azından bir şey size mi' d) bir cevap gibi? Muhtemelen gördüğünüz davranışları açıklayabilirim ve belki bir çözüm önerebilirim. Ama sanırım bu çok yaşlı, artık umursamıyor ya da tamir etmiyorsun. – alexrussell

cevap

2

You should için

Teşekkür Illuminate\Auth\Reminders\PasswordBroker sınıfını değil, \Illuminate\Support\Facades\Password uzanır. \Illuminate\Support\Facades\Password sınıfı bir final değil, Cephe'dir.

Sen tarafından cephelerinin son sınıfları görebilirsiniz:

get_class(Password::getFacadeRoot()); 
+0

Bunu denedim ama hala bu hatayı alıyorum: Statik olmayan yöntem Salesify \ User \ Password :: reset() statik olarak çağrılmamalı ve reset() yöntemimi statik yaptığımda: Statik olmayan yöntem yapılamıyor Illuminate \ Auth \ Reminders \ PasswordBroker :: reset() sınıfta statik Salesify \ User \ Password –

2

burada önceki cevabı genellikle doğrudur ama gerçekten neler olduğunu açıklamak için yeterli yapmaz, bu yüzden bir gitmek vereceğim .

Herhangi bir cephe yönteminin erişiminin genellikle statik olarak yapıldığını söyleyiniz, bu nedenle bir cephede bir (genel) yöntem tanımlarsanız, bunun statik olduğundan emin olmalısınız. Ancak, cepheler, temelde durağan olmayan bir sınıf için cephelerdir, cephedeki statik bir çağrıyı temel sınıftaki bir örnek yöntemine aktarmak için sihirli yöntemler kullanırlar. Bu nedenle, genellikle bir cephede statik bir yöntem tanımlayarak bir cepheyi genişletmek istemezsiniz, bunun yerine temel sınıfta bir örnek yöntemi tanımlarsınız. Password cephesinde, temel sınıf PasswordBroker örneğidir.Bu temel sınıf anlaşması genellikle IoC konteynerine bir örnek kaydedilerek ayarlanır ve sonra cephede, örneği bulmak için IoC anahtarını döndüren cephe sınıfında bir getFacadeAccessor yöntemi tanımlarsınız. (Password cephesinde, IoC anahtarı auth.reminder'dur.)

Bir Laravel çekirdek sınıfını yalnızca geçersiz kılmanız mümkün değildir, çünkü bu sizin için de bir sorun yaratır. Yapılması gereken en doğru şey, muhtemelen PasswordBroker'u genişletmek ve daha sonra sınıfınızın versiyonunu, şifre cephesinin normalde kullandığı IoC'deki anahtar olarak ayarlamanızdır (auth.reminder). Bu şekilde, eklenen yönteminiz cephede mevcut olacak, btu herhangi bir şey hala orijinal PasswordBroker sınıfına ertelenecek.


, buradan yeni bir cephe oluşturmak zorunda değilsiniz fark, ama sadece mevcut faça IoC anahtarını değiştirilecektir. Ne zaman yapılacağı biraz zor olabilir. Kendi servis sağlayıcınızı kullanmıyorsanız ve bu şeyleri routes.php veya başka bir şeyle yapıyorsanız, muhtemelen güvende olursunuz. Ancak, bu Parola davranışını değiştirmek için bir hizmet sağlayıcısı kullanıyorsanız, Laravel'in hizmet sağlayıcılarının 'register yöntemlerini çağırmasının sırasına güvenemezsiniz (gerçekte bunun ayarlandığı sırada gitmesi gibi görünebilir) app/config/app.php içinde yukarı, ama hey, bu tanımlanmamış davranış, bu yüzden ona güvenmeyin yok saymak). Bu nedenle, servis sağlayıcınızın Laravel'in çekirdek auth servis sağlayıcısından önce veya sonra çağrılan register yönteminin olup olmadığını bilmezsiniz.

Bunu sıralamanın resmi yolunu bilmiyorum, ancak düşünebilmemin tek yolu, register yöntemi yerine hizmet sağlayıcının boot yönteminde kaydı yapmaktır. Sen herhangi bir boot yöntem her zaman sonuçta diğer servis sağlayıcıların register yöntemleri denir garanti edemez, bu nedenle laravel çekirdek anahtarı geçersiz olacak ve anahtar laravel kurmak herhangi bir normal tarafından geçersiz edilmeyecektir. Ancak, boot yönteminde yapıyor sen teorik olarak genişletmek için çalıştığınız işlevselliği başka servis sağlayıcının boot yönteminde çağrılabilir eğer, istediğini yapmak için çok geç olabileceği anlamına gelir.

Alternatif yapmak (yani sizin register yönteminde örneğini kayıt) Kendine size kendi cephe oluşturmak kendi seçtiğiniz bir anahtar kullanmak ve normal olarak bütün kurmak. Ardından Cephe ile Şifre takma adını değiştirin. Daha fazla boilerplate, ancak daha güvenilir çalışır.

+0

Bu gerçekten oldukça yararlı ve gördüğüm davranışı onaylıyor.Laravel 5'de bu durumun hala hissedildiğini hissediyorum çünkü 'Mail' cephesini (ya da Mail ile yapacak bir şeyi) geçersiz kılmakta zorlanıyorum. Kullandığım önceki çerçevelerde böyle kısıtlamalar gördüğümü sanmıyorum. Çok acı verici. – dKen

+0

Evet, L5'in IoC konteyneri ve cephe sınıfları ile aynı sistemde olduğunu düşünüyorum. Bununla birlikte, Posta cephesini geçersiz kılmanın Auth sisteminin (daha az hareketli parçaya sahip olduğundan) çok daha kolay olduğunu düşünürdüm. Aslına bakarsanız, Mail cephesinin erişim anahtarı altındaki IoC'de kendi sınıfınızı yeniden kaydettirmenin işi yapması gerektiğini söyleyebilirim, ama belki yanılıyor olabilirim. – alexrussell

İlgili konular