Evet ve hayır. Slim için kaynak koduna bakarsanız, o kayıtlı Middlewares'in, Slim::run
yöntemi çağrıldığında LIFO düzeninde çağrıldığını göreceksiniz ve sonra Slim, isteğin işlenmesinin başladığı kendi "çağırma" yöntemini çalıştırır. Bu yöntemde İnce, rotayı ayrıştırır ve işler. Bu durumda, Middleware::call
yönteminde $app->router()->getCurrentRoute()
'a erişemezsiniz çünkü henüz ayrıştırılmamış ve tanımlanmamıştır.
Bunu yapmanın tek yolu, Middleware'inizde bir dinleyiciyi slim.before.dispatch
'a kaydetmek ve bu yöntemde yapmak istediğiniz şeyi uygulamaktır.
Sınıfınızın adından, temel bir kimlik doğrulama modülü oluşturmaya çalıştığınızı mu sanıyoruz? Daha önce buna benzer bir şey yaptık ve böyle bir şey çıktı: onBeforeDispatch
yöntem işleyicileri çağrılır güzergahın önce idare edilecek, bu örnekte
class AuthMiddleware extends \Slim\Middleware
{
public function call()
{
$this->app->hook('slim.before.dispatch', array($this, 'onBeforeDispatch'));
$this->next->call();
}
public function onBeforeDispatch()
{
$route = $this->app->router()->getCurrentRoute();
//Here I check if the route is "protected" some how, and if it is, check the
//user has permission, if not, throw either 404 or redirect.
if (is_route_protected() && !user_has_permission())
{
$this->app->redirect('/login?return=' . urlencode(filter_input(INPUT_SERVER, 'REQUEST_URI')));
}
}
}
. Kaynak koduna bakarsanız, olayların $app->redirect()
ve $app->pass()
vb. Tarafından atılan istisnaları dinleyen try/catch
bloğu içinde tetiklendiğini görebilirsiniz. Bu, çek/yönlendirme mantığımızı burada olduğu gibi uygulayabileceğimiz anlamına gelir. rota işleyici işlevi.
is_route_protected
ve user_has_permission
'un üstünde, auth ara yazılımımın nasıl çalıştığını göstermek için yalnızca bir sözdizimi kodudur. Sınıfı yapılandırarak, korunan Middleware kurucusunun yolları için bir rota veya regex listesi ve kullanıcı izni kontrolünü uygulayan bir servis nesnesinin geçmesini sağlayabilirsiniz. Umarım bu yardımcı olur.
Güzel olan. Düzenli çözüm ve ayrıntılı açıklama için teşekkürler. Kancanın orta yazılımın çağrısı() içinde kaydedilmesi, bunun için iyi bir nokta işlevi görüyor mu? Bunun gibi görünüyor, çünkü sadece bir kez daha kaydedilmiş/kanca çağrılan neden olabilir merak mı, düzenli tutar? – plong0
Arama yönteminin yalnızca istek başına bir kez çalıştırılacağını varsaymak güvenli. Gerçekte, tasarım, her bir ara yazılımın bir sonraki çağrıyı yaptığı tek bağlantılı bir liste kullandığı için, zincirdeki önceki ara katman yazılımının uygulanmasıyla ilgilidir. Eğer bir ara yazılım zincir arama yöntemini bir daha çağırırsa, Doing It Wrong ™ 'ı öneririm ve muhtemelen kullanmayı kesmelisiniz :). –
teşekkürler, bu işe yarıyor – mapodev