如果控制文章的添加只有登录的用户才可以操纵,可以加判断如下
public function create(){ //这个虽然可以达到控制登陆用户访问的目的 但是需要写很多 if(Auth::guest()){ return redirect(‘auth/login‘); } return view(‘articles.create‘); }
文件Http-->Middleware-->Authenticate.php就是对应的权限控制文件,在Http-->Kernel.php中有如下代码
/** * The application‘s route middleware. * * @var array */ protected $routeMiddleware = [ ‘auth‘ => ‘App\Http\Middleware\Authenticate‘,//auth 对应的就是上面的那个文件 ‘auth.basic‘ => ‘Illuminate\Auth\Middleware\AuthenticateWithBasicAuth‘, ‘guest‘ => ‘App\Http\Middleware\RedirectIfAuthenticated‘, ];
每个方法前添加控制权限的方法太繁琐了,简单的方法,可以在控制器的构造函数里来控制,比如在文章的类里ArticleController.php中
public function __construct(){ // $this->middleware(‘auth‘,[‘only‘=>‘create‘]); $this->middleware(‘auth‘,[‘except‘=>‘index‘]); }
更简单的方法可以在route.php中来进行控制
//可以在这里书写权限控制规则 Route::get(‘about‘,[‘middleware‘=>‘auth‘,function(){ return "you have to sign in to look this page"; }]);
其他的一些中间件 在kernel.php中除了上面的内容,还有
protected $middleware = [ ‘Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode‘, ‘Illuminate\Cookie\Middleware\EncryptCookies‘, ‘Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse‘, ‘Illuminate\Session\Middleware\StartSession‘, ‘Illuminate\View\Middleware\ShareErrorsFromSession‘, ‘App\Http\Middleware\VerifyCsrfToken‘, ];
其中的CheckForMaintenanceMode就是检验是否是维护模式。
在命令行下执行 php artisan down 进入维护模式,如果再访问的时候会呈现维护的默认页面,这个是通过上面这个CheckForMaintenanceMode来实现的。 执行php artisan up 退出维护模式。
执行php artisan down时候,在storage-->framework下生成一个down文件,反之则删除了down文件。执行的原理如下。
先去去看下CheckForMaintenanceMode.php这个文件的内容
<?php namespace Illuminate\Foundation\Http\Middleware; use Closure; use Illuminate\Contracts\Routing\Middleware; use Illuminate\Contracts\Foundation\Application; use Symfony\Component\HttpKernel\Exception\HttpException; class CheckForMaintenanceMode implements Middleware { /** * The application implementation. * * @var \Illuminate\Contracts\Foundation\Application */ protected $app; /** * Create a new filter instance. * * @param \Illuminate\Contracts\Foundation\Application $app * @return void */ public function __construct(Application $app) { $this->app = $app; } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($this->app->isDownForMaintenance()) { throw new HttpException(503); } return $next($request); } }
再去看下isDownForMaintenance()
public function isDownForMaintenance() { return file_exists($this->storagePath().‘/framework/down‘); }
其原理一目了然。
建立自己的中间件
E:\www\laravel>php artisan make:middleware Demo
Middleware created successfully.
在middleware中生成了Demo.php文件,内容如下(添加的内容是红字部分)
<?php namespace App\Http\Middleware; use Closure; class Demo { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) {
if($request->is(‘article/create‘) && $request->has(‘foo‘)){ //检验执行的方法是否是article 并且含有参数foo return redirect(‘article‘);}
return $next($request); } }
如果是访问的是article/create 并且带有参数foo的,将会执行article。其他的将继续执行。
在kernel.php中添加对应的,如下(红色部分)
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application‘s global HTTP middleware stack. * * @var array */ protected $middleware = [ ‘Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode‘, ‘Illuminate\Cookie\Middleware\EncryptCookies‘, ‘Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse‘, ‘Illuminate\Session\Middleware\StartSession‘, ‘Illuminate\View\Middleware\ShareErrorsFromSession‘, ‘App\Http\Middleware\VerifyCsrfToken‘, ‘App\Http\Middleware\Demo‘, ]; /** * The application‘s route middleware. * * @var array */ protected $routeMiddleware = [ ‘auth‘ => ‘App\Http\Middleware\Authenticate‘, ‘auth.basic‘ => ‘Illuminate\Auth\Middleware\AuthenticateWithBasicAuth‘, ‘guest‘ => ‘App\Http\Middleware\RedirectIfAuthenticated‘, ]; }
这个时候如果用/article/create?foo=12 来访问的话将会跳转到article中去。
全局中间件 若是希望中间件被所有的 HTTP 请求给执行,只要将中间件的类加入到 app/Http/Kernel.php 的 $middleware 属性清单列表中。 指派中间件给路由 如果你要指派中间件给特定的路由,你得先将中间件在 app/Http/Kernel.php 配置一个键值,默认情况下,这个文件内的 $routeMiddleware 属性已包含了 Laravel 目前配置的中间件,你只需要在清单列表中加上一组自定义的键值即可。 中间件一旦在 HTTP kernel 文件内被定义,你即可在路由选项内使用 middleware 键值来指派: Route::get(‘admin/profile‘, [‘middleware‘ => ‘auth‘, function() { // }]);