>백엔드 개발 >PHP 튜토리얼 >Laravel 5. 미들웨어 및 뷰와 블레이드 템플릿 엔진의 예

Laravel 5. 미들웨어 및 뷰와 블레이드 템플릿 엔진의 예

黄舟
黄舟원래의
2017-09-11 10:06:391787검색

1. 미들웨어

Laravel의 HTTP 미들웨어는 라우팅을 위한 필터링 및 보호 계층을 제공합니다. 백그라운드 로그인을 확인하기 위해 미들웨어를 사용하여 시뮬레이션해 보겠습니다.

1. 미들웨어 생성

cmd 창을 열고 프로젝트 디렉터리에 들어가서 artisan 명령을 사용하여


php artisan make:middleware AdminLoginVerify

를 생성하면 app/Http/Middleware 디렉터리에 미들웨어 AdminLoginVerify가 생성됩니다.

handle() AdminLoginVerify 클래스의 메소드 다음 위치에 확인 논리를 추가하세요.


<?php
namespace App\Http\Middleware;

use Closure;

class AdminLoginVerify
{
    public function handle($request, Closure $next)
    {
        if(!session(&#39;admin&#39;)){ // 如果没有登录则定向到登录页
            return redirect(&#39;admin/login&#39;);
        }
        return $next($request);
    }
}

이제 로그인 확인 미들웨어 AdminLoginVerify

를 만들고 정의하세요.

2 미들웨어를 등록하고

app/Http/Kernel에서 보호된 $를 찾으세요. .php 파일 RouteMiddleware 속성에 AdminLoginVerify


protected $routeMiddleware = [
        &#39;auth&#39; => \App\Http\Middleware\Authenticate::class,
        &#39;auth.basic&#39; => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        &#39;can&#39; => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        &#39;guest&#39; => \App\Http\Middleware\RedirectIfAuthenticated::class,
        &#39;throttle&#39; => \Illuminate\Routing\Middleware\ThrottleRequests::class,
         // 自定义中间件
        &#39;adminLoginVerify&#39; => \App\Http\Middleware\AdminLoginVerify::class,
    ];

3을 추가합니다. 경로 추가

app/Http/routes.php 파일에 경로 추가:


// 后台首页路由、退出登录路由
Route::group([&#39;prefix&#39; => &#39;admin&#39;, &#39;namespace&#39; => &#39;Admin&#39;, &#39;middleware&#39; => &#39;adminLoginVerify&#39;], function(){
    Route::get(&#39;index&#39;, &#39;IndexController@index&#39;);
    Route::get(&#39;logout&#39;, &#39;IndexController@logout&#39;);
});

// 后台登录路由
Route::group([&#39;middleware&#39; => &#39;web&#39;], function(){
    Route::get(&#39;admin/login&#39;, &#39;Admin\IndexController@login&#39;);
});

이것은 아래의 Index 컨트롤입니다. 배경 관리 디렉터리 장치 코드: re

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class IndexController extends Controller{

    // 后台首页
    public function index(){
        return &#39;<h1>欢迎你,&#39; . session(&#39;admin&#39;) . &#39;</h1>&#39;;
    }

    // 后台登录
    public function login(){
        session([&#39;admin&#39; => &#39;mingc&#39;]);
        return &#39;<h1>后台登录</h1>&#39;;
    }

    // 退出登陆
    public function logout(){
        session([&#39;admin&#39; => null]);
        return &#39;<h1>退出登录</h1>&#39;;
    }
}

4. 시뮬레이션 로그인


브라우저를 열고 배경의 배경 페이지를 방문하세요

, 배경 홈페이지를 방문하세요

이제 로그인을 종료합니다

로그아웃 상태에서 홈페이지에 접속하시면 로그인 페이지로 이동됩니다.

2. 뷰

1. 뷰 렌더링 및 데이터 할당

방법 1. 배열 키-값 쌍 할당

// 在控制器中
$data = array(
    &#39;title&#39; => &#39;Laravel&#39;,
    &#39;subTitle&#39; => &#39;高效快捷的PHP框架&#39;
);
return view(&#39;my_laravel&#39;, $data);

// 在模板中
<?php echo $title;?>
<?php echo $subTitle;?>

방법 2. 메소드 체인 할당


// 在控制器中
return view(&#39;my_laravel&#39;)->with(&#39;title&#39;, &#39;Laravel&#39;)->with(&#39;subTitle&#39;, &#39;高效快捷的PHP框架&#39;);

// 在模板中(和上面的一样)
<?php echo $title;?>
<?php echo $subTitle;?>

방법 3. Compact() 함수를 사용하여


// 在控制器中
$data = array(
    &#39;title&#39; => &#39;Laravel&#39;,
    &#39;subTitle&#39; => &#39;高效快捷的PHP框架&#39;
);
$content = &#39;Laravel 5.2 在 5.1 基础上继续改进和优化,添加了许多新的功能特性...&#39;;
return view(&#39;my_laravel&#39;, compact(&#39;data&#39;, &#39;content&#39;));

// 在模板中(和前两个不太一样)
<?php echo $data[&#39;title&#39;] ; ?>
<?php echo $data[&#39;subTitle&#39;]; ?>
<?php echo $content; ?>

를 할당합니다. 그 중 view() 함수의 첫 번째 매개변수인 my_laravel은 resources/views 뷰 디렉터리에 있습니다. 파일 접미사는 블레이드 템플릿 엔진을 사용하는 ​​.blade.php입니다.


3. 블레이드 템플릿 엔진

1. 출력 변수

// 输出单个变量
{{ $var }}

// 保留双大括号,编译为{{ var }}
@{{ var }}

// 可以输出默认值
{{ $var or &#39;我是默认值&#39; }}
{{ isset($var) ? $var : &#39;我是默认值&#39; }}

// Blade 注释
{{-- 这个注释不会输出到页面中 --}}

// 忽略字符实体化,输出 JS 或 HTML
{!! $var !!}
// 注: 因为 Blade 模板引擎默认对{{}}语句进行了 htmlentities 字符实体化,所以要输出JS或HTML代码时,应使用上述语法

2. 프로세스 제어


// if 语句
@if($var == &#39;laravel&#39;)
    I am laravel
@elseif($var == &#39;yii&#39;)
    I am yii
@else
    I don’t know what I am.
@endif

// 循环
@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}
@endfor

@foreach ($array as $v)
    <p>我是数组成员 {{$v}}</p>
@endforeach

@forelse ($users as $v)
    <li>我的名字是{{ $v->name }}</li>
    @empty
    <p>我没有名字</p>
@endforelse

@while (true)
    <p>我一直在循环...</p>
@endwhile

// 可以嵌套
@for($i = 0; $i < 10; $i++)
    @if($i > 5)
        I am {{$i}} > 5
    @endif
@endfor

3. 템플릿 레이아웃 및 하위 뷰

@include 파일에는 지침이 포함되어 있습니다.


@extends 템플릿 상속 지시문.

@yield                     슬라이스 정의 지침(슬라이스 표시 위치 정의).

@section Slice에서는 지침을 제공합니다(슬라이스의 세부 사항 정의).

@endsection @section의 끝 태그입니다.

@show @section의 끝 태그는 슬라이스 내용을 제공하는 동시에 슬라이스를 표시합니다.

@parent @section 콘텐츠 태그는 상위 템플릿의 조각을 표시합니다.

@include:

하위 뷰, 즉 파일 포함을 포함합니다.

웹사이트의 여러 웹페이지에 상단 탐색, 사이드바 추천, 하단 저작권 등 공통된 부분이 있는 경우. 나중에 유지 관리 및 수정을 용이하게 하기 위해 이러한 웹 페이지의 공개 부분을 별도의 파일로 추출하여 보기 디렉터리 아래의 공통 폴더에 배치하고 이름을 top.balde.php, side.blade.php 및 Bottom.blade로 지정할 수 있습니다. 각각 .php . 그런 다음 각 뷰 템플릿에서

@include(&#39;common.top&#39;) // 将顶部导航包含进来,其他公共部分同样处理。
를 사용할 수 있습니다. 변수를 전달해야 하는 경우 매개변수
 @include(&#39;common.top&#39;, [&#39;location&#39; => &#39;首页&#39;])

@extends:

템플릿 상속을 추가하여 상위 템플릿의 레이아웃을 상속할 수 있습니다.

@include 지시문에는 추출된 템플릿 부분이 포함되어 있습니다.

@extends 지시문은 기존 기본 템플릿 레이아웃을 상속합니다. 이제 view 디렉토리 아래에 레이아웃 디렉토리가 있고 디렉토리에 마스터 템플릿 master.blade.php가 있습니다. 레이아웃은 다음과 같습니다:

<!DOCTYPE html>
<html>
<head>
    <title>@yield(&#39;title&#39;, &#39;首页&#39;)</title>
</head>
<body>
    <p class="top">顶部</p>
    @yield(&#39;main&#39;)
    <p class="aside">侧栏</p>
    <p class="bottom">底部</p>
</body>
</html>

@yield('title', 'Homepage' ) 지시어는 731218c205eb5aaf3c4c44099d17f094 태그에 정의되어 있습니다.

@yield('main')는 상단 열과 측면 열 사이에 표시될 기본 콘텐츠를 정의합니다.


그럼 제목이랑 본문은 어디있나요? 이를 위해서는 하위 템플릿이 필요합니다.

이제 뷰 디렉토리에 새로운 하위 템플릿 child.blade.php를 생성합니다. 내용은 다음과 같습니다:

@extends(&#39;layouts.master&#39;)

@section(&#39;title&#39;)
    关于页
@endsection

@section(&#39;main&#39;)
    <p class="main">【关于页】主内容</p>
@endsection

 

마스터 메인 템플릿 뷰와 하위 하위 템플릿을 가리키는 경로를 정의합니다. 브라우저에서 하위 하위 템플릿을 보고 액세스합니다. View


하위 하위 템플릿이 마스터 기본 템플릿의 콘텐츠인 상단, 사이드바, 하단

을 상속하는 것을 볼 수 있습니다.

同时,child 子模板也显示了自己的网页标题 “关于页” 和主内容 “【关于页】主内容”

这就是 master 主模板中切片定义者 @yield 和 child 子模板中切片提供者 @section@endsection 的功劳了。

 

@yield、@section: 定义切片和提供切片。

@yield('main') 指令定义一段HTML切片,它指示了在这个位置显示一个名为'main'的切片

@section('main')@endsection 指令提供了一段HTML切片,它为@yield('main') 定义的'mian'切片提供了详细的内容。

那么有了切片的显示位置,有了切片的详细内容,就可以显示出一个详细的HTML切片了。

 

应该注意到了,在主模板 master 中有这么一个


@yield(&#39;title&#39;, &#39;首页&#39;)

它指示了 'title' 切片的默认值。就是说,如果没有子模板继承主模板,或者继承了但没有用@section('title')@endsection 指令提供 'title' 切片,它将显示一个默认值 '首页' 。

现在,直接访问主模板看看

没错,没有子模板用 @section('title')@endsection 来提供标题, @yield('title', '首页') 显示了 'title' 切片的默认值 '首页'。

那么,主模板作为网站首页的话,它的主内容呢?如果要显示的话,难道又要写一个子模板来继承它,再用 @section@endsection 提供主内容?可不可以直接在主模板里写一个类似@yield('title', '首页') 提供的默认值呢?

当然可以,下面来重写主模板





    @yield(&#39;title&#39;, &#39;首页&#39;)


    

顶部

@section('main')

【首页】主内容

@show

侧栏

底部

@section('main')@show 可以提供 'main' 切片并显示出来。

 

现在访问主模板看看,首页主内容出来了。

并且,如果有子模板继承,并用 @section('main')@endsection 中也提供了一段'main'切片的话,这将覆 盖 主模板中的 'main'切片,而只显示自己定义的。类似于面向对象的重写。

在重写了主模板后,再访问子模板看看

因为子模板中 @sectioin('main')@endsection 提供了'main'切片,所以覆盖了父级中的'main'。

 

有时候可能需要子模板中重写但不覆盖主模板的切片内容,那么可以在子模板中使用 @parent 来显示主模板中的切片


@extends(&#39;layouts.master&#39;)

@section(&#39;title&#39;)
    关于页
@endsection

@section(&#39;main&#39;)    @parent
    <p class="main">【关于页】主内容</p>
@endsection

 

访问子模板

显示子模板主内容的同时,也显示了主模板的主内容。

위 내용은 Laravel 5. 미들웨어 및 뷰와 블레이드 템플릿 엔진의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.