因为 php artisan migrate:make 是 Laravel 4 的语法,而 Laravel5 已经换成了 php artisan make:migration
执行 php artisan make:migration table_name 会为每个表在工程的 database 目录下的 migrations 目录下生成一个 php 文件。
如果要将这些文件添加到库中生成对应的表则需要执行 php artisan migrate
先 composer clearcache 清理包、仓库缓存,再用 composer update,如果不起效,就删掉 vendor 目录重新安装。
composer require barryvdh/laravel-ide-helper
在 config 目录里的 app.php 文件中的'providers'添加如下内容
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
public function register()里输入如下内容来注册
if ($this->app->environment() !== 'production') { $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); }
php artisan ide-helper:generate
artisan 的 serve 命令还支持两个参数:
composer require barryvdh/laravel-debugbar
页面下方会出现:
创建一个简单的文本文档并命名为 phpinfo.php
代码如下:
<?php
phpinfo();
?>
放入 nginx 或 apache 中之后,通过浏览器访问这个文件即可显示 PHP 信息 如:http://192.168.1.100/phpinfo.php
安装 phpstorm 和 laravel 的部分这里不再多说,之前都有提到。
PHP 7.1.32 (cli) (built: Aug 28 2019 09:08:22) ( NTS MSVC14 (Visual C++ 2015) x64 )Copyright (c) 1997-2018 The PHP GroupZend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
[xdebug]zend_extension="E:\software\php-7.1.32-nts-Win32-VC14-x64\ext\php_xdebug.dll"xdebug.remote_enable=1xdebug.remote_port=9000xdebug.remote_host=localhostxdebug.profiler_enable=1xdebug.remote_mode = "req"xdebug.trace_output_dir="./xdebug"xdebug.profiler_output_dir="./xdebug"xdebug.remote_handler="dbgp"xdebug.idekey = "phpstorm" //必填
C:\Users\admin>php -m[PHP Modules]bcmathbz2calendarCorectypecurldatedomexiffileinfofilterftpgdgettextgmphashiconvimapintljsonldaplibxmlmbstringmcryptmysqlimysqlndodbcopensslpcrePDOpdo_mysqlPDO_ODBCpdo_pgsqlpdo_sqlitepgsqlPharreadlineReflectionsessionshmopSimpleXMLsoapsocketsSPLsqlite3standardtidytokenizerwddxxdebugxmlxmlreaderxmlrpcxmlwriterxslzipzlib
[Zend Modules]Xdebug
可以看到Xdebug已经安装成功。
图中arguments配置的是artisan的命令。
Auth::attempt($username, $request->isRemember))
对于Auth的attempt方法,表面上来看我们无从找起,但是进入Auth类会发现,Auth 是通过 Facade 动态绑定的,绑定到哪里呢,进一步寻找我们发现 在 vendor/laravel/framework/src/Illuminate/AuthServiceProvider 中:
class AuthServiceProvider extends ServiceProvider{ /** * Register the authenticator services. * * @return void */ 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(); }); }}
默认Auth是绑定了AuthManager:
<?phpnamespace Illuminate\Auth;
use Closure;use InvalidArgumentException;use Illuminate\Contracts\Auth\Factory as FactoryContract;class AuthManager implements FactoryContract{ use CreatesUserProviders;
protected $app;
protected $guards = [];
public function guard($name = null) { $name = $name ?: $this->getDefaultDriver();
return isset($this->guards[$name]) ? $this->guards[$name] : $this->guards[$name] = $this->resolve($name); }
public function getDefaultDriver() { return $this->app['config']['auth.defaults.guard']; }
public function __call($method, $parameters) {
return $this->guard()->{$method}(...$parameters); }}
并没有找到 attempt 方法,不过有一个__call 的魔术方法,那肯定是他里面没错了,为了快速找到他究竟是何方神圣,直接用
dd(get_class($this->guard()));
输出为:
Illuminate\Auth\SessionGuard
再往下的方法调用都可以通过debug的方式确定实现类了。这里就不再赘述,详情见:https://learnku.com/articles/5963/toggle-laravel-login-default-bcrypt-encryption-validation
Auth.attempt调用了:
\Illuminate\Auth\SessionGuard::attempt: public function attempt(array $credentials = [], $remember = false) { $this->fireAttemptEvent($credentials, $remember); $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials); // If an implementation of UserInterface was returned, we'll ask the provider // to validate the user against the given credentials, and if they are in // fact valid we'll log the users into the application and return true. if ($this->hasValidCredentials($user, $credentials)) { $this->login($user, $remember); return true; } // If the authentication attempt fails we will fire an event so that the user // may be notified of any suspicious attempts to access their account from // an unrecognized user. A developer may listen to this event as needed. $this->fireFailedEvent($user, $credentials); return false; } /** * Determine if the user matches the credentials. * * @param mixed $user * @param array $credentials * @return bool */ protected function hasValidCredentials($user, $credentials) { return ! is_null($user) && $this->provider->validateCredentials($user, $credentials); }
然后$this->provider->validateCredentials调用了:
\Illuminate\Auth\EloquentUserProvider::validateCredentials: public function validateCredentials(UserContract $user, array $credentials) { $plain = $credentials['password']; return $this->hasher->check($plain, $user->getAuthPassword()); }
这里会发现是通过hasher去check库里的密码和登录端传入的密码的,通过debug查看这个hasher为BcryptHasher的一个实例,于是对往库中添加的密码123456做如下处理:
$hasher = new BcryptHasher(); $hashPass = $hasher ->make("123456"); printf($hashPass);
将打印出来的结果添加到库中的密码栏即可用该用户名与密码登录。