Auth verwenden;
<code>use Illuminate\Routing\Controller; class AuthController extends Controller { /** * Handle an authentication attempt. * * @return Response */ public function authenticate() { if (Auth::attempt(['email' => $email, 'password' => $password])) { return redirect()->intended('dashboard'); } } } </p> <p>Wie wird diese Auth-Fassade überprüft? Es gibt keine Datenbankabfrage und keinen spezifischen Code, den man sich ansehen muss. . </p> <h2>Antwortinhalt: </h2> <p><?php-Namespace AppHttpControllers;</p> <p>Auth verwenden;</p> <pre class="brush:php;toolbar:false"><code>use Illuminate\Routing\Controller; class AuthController extends Controller { /** * Handle an authentication attempt. * * @return Response */ public function authenticate() { if (Auth::attempt(['email' => $email, 'password' => $password])) { return redirect()->intended('dashboard'); } } } </p> <p>Wie wird diese Auth-Fassade überprüft? Es gibt keine Datenbankabfrage und keinen spezifischen Code, den man sich ansehen muss. . </p> <p class="answer fmt" data-id="1020000006071581"> Die Klasse </p> <p>Auth wird durch Umbenennen der Funktion <code>class_alias</code> erhalten, die ursprünglich <code>IlluminateSupportFacadesAuth</code> war. </p> <blockquote><p><strong>Nicht sehr ermutigend</strong> @granton Die Art und Weise, wie der Laravel-Ideenhelfer angezeigt wird, ist nicht lernförderlich (<strong> Natürlich ist dies eine Technik, aber sie ist nicht für Neulinge geeignet, die lernen, was sich zum schnellen Auffinden der Quelle in der Projektentwicklung eignet </strong>, denn das ist es, was ich mache). </p></blockquote> <p>Fahren Sie fort, wenn Sie ähnliche Probleme wirklich im gesamten Rahmen verstehen möchten, folgen Sie einfach dem Rahmen. Sie werden nicht nur schnell lernen, sondern auch einige neue Kontinente entdecken. Ich nenne hier nur die im Dokument zum Problem genannten Teile: Dienstleister, Servicecontainer, Fassadenmuster. </p> <p>Fassade bezieht sich auf den Fassadenmodus, den ich am Anfang erwähnt habe. Wenn Sie sich den Quellcode ansehen, gibt es nur eine Zeile, die tatsächlich funktioniert , es ist eigentlich eine Methode, die eine Textzeichenfolge zurückgibt. Ich schlage vor, dass Sie den Teil über <code>服务提供者</code> in der Dokumentation lesen. Dieser Ort ist der Kern des Aufbaus der Framework-Funktion. Verwenden Sie den Dienstanbieter, um einen AuthManager-Anbieter in <code>服务容器</code> zu registrieren Diese Methode generiert eine AuthManager-Instanz (streng genommen ist AuthManager ein Singleton und kann über seinen registrierten Anbieter überprüft werden). AuthManager bietet alle Funktionen der Auth-Fassade, einschließlich der automatischen Auswahl des Treibers (je nach Konfiguration), und der Treiber stellt Ihnen Methoden wie Versuch, Anmeldung und Prüfung zur Verfügung. </p> <p><strong><em>Wenn Sie die Dokumentation einer Funktion, insbesondere der Laravel-eigenen Komponenten, sorgfältig lesen, werden Sie feststellen, dass sie Erweiterungen unterstützen, und die Erweiterung erfolgt über die Verwendung von Service-Containern, die den Kern des Frameworks bilden . Es ist sehr einfach, die von Ihnen erwähnte Methode zu erweitern und die Verschlüsselungsmethode zu ändern. </em></strong></p> <p>Weitere Dokumentation lesen. </p> <h3><strong><em>27.07.2016 Nachtrag: </em></strong></h3> <p>Solange Sie den Funktionsmechanismus dieses Frameworks verstehen, ist es in der Tat nicht kompliziert. Es ist ungefähr wie folgt (wenn Sie die Details ignorieren, die nicht sehr wichtig sind, können Sie den Quellcode lesen für Details): </p> <ol> <li><p><code>IlluminateFoundationApplication</code> Instanz erstellen; </p></li> (für Webanwendungen) HTTP-Kerninstanz erstellen <li>, <p> Pfeile zeigen Vererbungsbeziehungen an <code>AppHttpKernel</code><code>IlluminateFoundationHttpKernel</code> <em></em></p>Registrieren Sie den Dienstanbieter und führen Sie das Registrierungsverhalten in </li> aus. Die Authentifizierungskomponente (<li>) wird in <p> registriert ; <strong></strong> <code>IlluminateAuthAuthManager</code><code>IlluminateAuthAuthServiceProvider</code> Nachfolgende Dienste werden gestartet, z. B. Laden der Middleware, Routenverteilung, Antwortverarbeitung, und der Prozess ist abgeschlossen. </p> </li> <li> <p>Im obigen Prozess wird ein </p> erwähnt, nämlich </li>. Sie können sehen, dass es in der Projektkonfiguration </ol> registriert ist und darin einen wichtigen Absatz enthält: <p> <code>服务提供者(Service Provider)</code> <code>IlluminateAuthAuthServiceProvider</code>Sie können sehen, dass ein Singleton mit dem Namen <code>config/app.php</code> registriert ist, bei dem es sich um ein </p>-Objekt handelt. Alle Methodenfunktionen, auf die wir über die Klasse <pre class="brush:php;toolbar:false"><code>protected function registerAuthenticator() { $this->app->singleton('auth', function ($app) { $app['auth.loaded'] = true; return new AuthManager($app); }); $this->app->singleton('auth.driver', function ($app) { return $app['auth']->guard(); }); }</code>
ist ein auth
Objekt. 🎜> Umbenannte Klasse, tatsächlich ist der Zugriff auf IlluminateAuthAuthManager
eine Vererbung von Facade und stellt eine Methode bereit: Auth
Auth
class_alias
Beachten Sie, dass Auth
Nein, dieser Rückgabewert ist derjenige, der in IlluminateSupportFacadesAuth
registriert ist. Warum kann die Facade-Klasse Methoden für die Objekte haben, auf die sie zeigt? Tatsächlich wird die magische Methode IlluminateSupportFacadesAuth
verwendet, die durch Anzeigen des Quellcodes von
<code>class Auth extends Facade { /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'auth'; } }</code>
至于你们去查看 AuthManager
并没发现一些可被执行的方法,实际上是因为 AuthManager
下还有一系列驱动(Driver),这些驱动使得 Auth 组件高度可定制化,文档上对这块做了着重讲解,驱动由两类构成,分别是实现了 Illuminate\Contracts\Auth\UserProvider
接口和 Illuminate\Contracts\Auth\Authenticatable
接口的类的实例,后者是用于提供认证组件获取认证对象信息的接口,比如获取账户、密码的方法,前者则是你们关注的,尤其是 retrieveByCredentials
和 validateCredentials
这两个接口方法,retrieveByCredentials
用于根据 attempt 传入的凭据获取用户实例的,validateCredentials
适用于验证凭据是否有效(想改变密码验证方式的就是通过该处实现)。
关于如何扩展、定制 Auth 组件,文档有说明,so~~~多读文档,这种问题读了文档,自然解决。不是简单看就完了,做到我说到任何一点你都知道在文档哪里去找,才说明你真的是读了文档的。我上面所提的所有,文档都写了。。。
以上。
如果使用 ide-helper, 可以在 _ide_helper.php
中看到这段代码
<code class="php">class Auth extends \Illuminate\Support\Facades\Auth{ // ... }</code>
其中
<code class="php">/** * Attempt to authenticate a user using the given credentials. * * @param array $credentials * @param bool $remember * @param bool $login * @return bool * @static */ public static function attempt($credentials = array(), $remember = false, $login = true){ return \Illuminate\Auth\SessionGuard::attempt($credentials, $remember, $login); }</code>
也就是说,这个 attempt
方法调用的是 \Illuminate\Auth\SessionGuard::attempt($credentials, $remember, $login)
方法。
具体的登陆验证的逻辑在里面。
config里的auth.php里配置了数据模型的吧,指定了model进行数据查询和匹配