此文将会一直更新
1.登录LoginController.php
我们执行了
php artisan make:auth
之后,进入LoginController
控制器
<?php
// LoginController.php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
- 此处我们会发现作者喜欢先定义一个或者多个
trait
,然后在使用的类里面use trait
Login
控制器里面很多方法可能直接看不到,但是你打开trait
就可以看到了。
trait AuthenticatesUsers
{
use RedirectsUsers, ThrottlesLogins;
这个里面有login logout方法
}
- 打开
RedirectsUsers的trait
<?php
namespace Illuminate\Foundation\Auth;
trait RedirectsUsers
{
/**
* Get the post register / login redirect path.
*
* @return string
*/
public function redirectPath()
{
if (method_exists($this, 'redirectTo')) {
return $this->redirectTo();
}
return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}
}
这个trait里面定义的是我们登录后跳转到的路由。此处的redirectPath 方法,作者其实在框架中多次使用。
意思是,你如果定义了自己的redirectTo方法或者属性,优先走你的。否则用自定义的home,这种写法,我们平时也可以这样写在自己的项目中
2.Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
我们看到,经常被继承的Controller类里面,并没有多少代码。
他继承的BaseController其实是一个接口
我们自己写代码的时候,也可以仿照这种思想,先定义trait,然后在类里面直接use使用里面的方法
<?php
namespace Illuminate\Routing;
use BadMethodCallException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
abstract class Controller
{
protected $middleware = [];
public function middleware($middleware, array $options = [])
{
foreach ((array) $middleware as $m) {
$this->middleware[] = [
'middleware' => $m,
'options' => &$options,
];
}
return new ControllerMiddlewareOptions($options);
}
public function getMiddleware()
{
return $this->middleware;
}
public function callAction($method, $parameters)
{
return call_user_func_array([$this, $method], $parameters);
}
public function missingMethod($parameters = [])
{
throw new NotFoundHttpException('Controller method not found.');
}
public function __call($method, $parameters)
{
throw new BadMethodCallException("Method [{$method}] does not exist.");
}
}