11.30-Laravel框架

Laravel框架和伪元素

安装并创建项目环境

下载安装composer管理器

a)php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"     // 下载安装脚本composer-setup.php到当前目录 

b)php composer-setup.php      // 执行安装过程 

c)php -r "unlink('composer-setup.php');"    // 删除安装脚本

安装laravel并生成项目

laravel 有两种安装方式: 

第一种是直接使用composer create-project。 composer create-project --prefer-dist laravel/laravel 项目名 

第二种方式是使用laravel的安装器。 composer require "laravel/installer" 以后就可以各种new项目了。 laravel new 项目名

目录结构

public     // 包含了入口文件 index.php 

配置

虚拟域名

框架安装完毕后要给项目定义一个虚拟域名,

i)在Laravel框架中,没有index.php文件,而是用server.php文件来替代的,所以我们需要修改Apache的 http.conf文件,在下面添加server.php即可.

配图:

在这里插入图片描述

ii)打开C:\xampp\apache\conf\extra目录下的httpd-vhosts.conf文件,修改内容如下:

在这里插入图片描述

iii)打开C:\Windows\System32\drivers\etc目录下的hosts文件,添加自己的域名。如下图所示:

在这里插入图片描述

路由

简单路由

路由文件在 Routes/web.php

// 这是一个测试路由,当我们访问www.lovehsp.com/public/test时,会在页面输出Hello World
Route::get('/test', function () {
	return 'Hello World';
});

请求方式

路由指定了请求方式,必须由该方式进行访问,否则页面会提示未找到

Route::get($uri, $callback); // GET方式请求(常用)
Route::post($uri, $callback); // POST方式请求(常用)
Route::put($uri, $callback); // 伪造PUT方法请求
Route::patch($uri, $callback); // 伪造PATCH方法请求
Route::delete($uri, $callback); // 伪造DELETE方法请求

路由参数

单个参数
// 当我们请求www.lovehsp.com/public/user/666时,会将666的参数传递到当前路由
Route::get('user/{id}', function ($id) {
	return '当前用户的id是:'.$id;
});
多个参数

参数与参数之间的符号分割没有明确的限定,通常为/或-

// 当我们请求www.lovehsp.com/public/user/5-info-1时,可以访问到如下路由的内容
Route::get('user/{id}-{service}-{page}', function ($id, $service, $page) {
	// 输出参数信息
	return '您正在查看用户id为:'.$id.'的'.$service.'服务的第'.$page.'页的内容!';
});
可选参数

某些情况下,有的参数是可有可无的,我们可以使用?问好来标注改参数是可有可无的

// 当我们请求www.lovehsp.com/public/user/TeacherHou或www.lovehsp.com/public/user时 
Route::get('user/{name?}', function ($name = null) {
	if($name != null){
    	return "这是TeacherHou的信息!"; 
    }else{
    	return "这里是用户的列表信息!"; 
    } 
});
命名路由

某些路由的可能会非常非常长,例如 users/list/info/{id}-{service}-{page}…,若想要在跳转到或获取该路由 时,可能不太方便,因此,Laravel 给我们准备了命名路由

// 直接在路由后方追加name方法,并定义当前路由的别名 
Route::get('/article', function () { 
	return view('article'); 
})->name('art.php');

这样若我们想要进行跳转,我们可以这么写:

Route::get('/jump', function () {
	$url = route('art.php');// 生成URL
	return redirect()->route('art.php'); // 生成重定向
});
路由重定向 redirect

样式1:

Route::get('/test', function () {
	return redirect('/user/007');
});

样式2:

Route::get('dashboard', function () {
	// 重定向至home/dashboard路由
    return redirect('home/dashboard');
    // 重定向至上一页面并闪存表单信息
    return back()->withInput();
    // 重定向至指定路由,同时往session中存储指定信息
    return redirect('/users/create')->with('error','添加时遇到了错误!');
    // 模板中输出错误信息
    @if (session('error'))
    <div class="alert alert-success">
    {{ session('status') }}
    </div>
    @endif
    // 重定向至命名路由
    return redirect()->route('login');
    return redirect()->route('profile', ['id' => 1]); // 还可以追加参数
    // 重定向至控制器指定方法
    return redirect()->action('HomeController@index');
    return redirect()->action('UserController@profile', ['id' => 1]);
});

CSRF跨域请求伪造

跨站请求伪造是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。我们要做的就 是防止有人恶意攻击我们的网站。因此需要借助Laravel 帮我们生成的这张 CSRF「令牌」

基本使用

<!-- 通过表单发送post请求时,需要添加令牌验证 -->
<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

JS 的 的ajax请求

需要添加的内容有两个地方,一个在 head 头部,一个在 post 请求内部

<!-- head头添加token请求 -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<!-- 定义发送post请求的按钮 -->
<button id="btn">单击发送ajax的post请求</button>
<!-- 定义发送post请求的js代码(使用jQuery) -->
<script>
    $('#btn').click(function(){
        // 单击事件中添加如下代码
        $.ajaxSetup({
            headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        // 发送 post 请求给指定路由
        $.post('/testAjax',{},function(data){
        	alert(data);
        });
	});
</script>
基本应用
请求路径
// 若请求的目标地址是:http://test.com/users/show,则path会获取users/show
$uri = $request -> path();
检测请求路径
// 若请求的路径是: http://test.com/admin/users ,则下面实例为真
if ($request -> is('admin/*')) {
    // 此处代码略
}
获取完整 URL
// 没有请求参数 ...
$url = $request -> url();
// 有请求参数 ...
$url = $request -> fullUrl();
获取请求方法
// 若此时请求到该方法的方式为 GET ,则输出 GET
$method = $request -> method();
// 判断当前方法是通过哪种请求方式请求的
if ($request -> isMethod('post')) {
	//
}

获取请求数据

获取所有数据

// 以数组形式存储
$res = $request -> all();

获取指定数据

// 会获取到 form 表单中表单项 name 的值
$name = $request -> input('name');
// 指定默认值 ( 若表单提交信息中没有 name 相对应的值,则采用默认值 )
$name = $request -> input('name', 'Sally');

获取数组的值

// 我们可以采用点的形式获取数组的相对应的值
$name = $request -> input('products.0.name');
// 获取所有二维数组中的 name 值
$names = $request -> input('products.*.name');

只获取查询字符串

这里查询字符串所指的是,通过 get 传递到当前方法的参数信息

// 获取 get 请求中 name 指向的值
$name = $request -> query('name');
// 查询字符串也可以定义默认值
$name = $request -> query('name', 'Helen');

获取部分输入数据

// 只从请求数组中获取下标为 username 和 password 的信息
$input = $request -> only(['username', 'password']);
// 这种写法也支持
$input = $request -> only('username', 'password');
// 获取除了 credit_card 的信息
$input = $request -> except(['credit_card']);
// 同上
$input = $request -> except('credit_card');

判断请求信息是否包含某值

// 判断请求信息中是否包含下标为 name 的值
if ($request -> has('name')) {
	// ...
}
// 判断请求信息是否包含 name 和 email 的值
if ($request -> has(['name', 'email'])) {
	// ...
}

Cookies和Session

设置cookie

// 响应信息到页面,并将 cookie 写入用户浏览器
return response('Hello World') -> cookie('name', 'value', $minutes);
// 以下方法同上( response 信息可以省略)
$cookie = cookie('name', 'value', $minutes);
return response('Hello World') -> cookie($cookie);

获取cookie值

$value = $request -> cookie('name');

设置session值

// 通过 HTTP 请求实例 ...
$request -> session() -> put('key', 'value');
// 通过全局辅助函数
session(['key' => 'value']);

获取session值

// 获取指定的 session 信息
$value = $request -> session() -> get('key');
$value = $request -> session() -> get('key', 'default'); // 默认值
// 获取所有的 session 信息
$data = $request -> session() -> all();
// 判断某个 session 信息是否存在
if ($request -> session() -> has('users')) {
	// ...
}

删除 session 信息

// 删除指定值
$request -> session() -> forget('key');
// 删除所有信息
$request -> session() -> flush();

全局辅助函数

// 获取 Session 中的一条数据 ...
$value = session('key');
// 指定一个默认值 ...
$value = session('key', 'default');
// 存储一条数据至 Session 中 ...
session(['key' => 'value']);

Blade模板引擎

区块占位

首先需要定义一个公共模板,我们这里在 layouts 目录中生成了 index.blade.php 模板

<!-- 文件保存于 resources/views/layouts/index.blade.php -->
<html>
<head>
<!--这里是一个单行占位 -->
<title>应用程序名称 - @yield('title')</title>
</head>
<body>
    <!--这里是一个区块占位 -->
    @section('sidebar')
    这是 master 的侧边栏。
    @show
    <div class="container">
   		@yield('content')
    </div>
</body>
</html>

继承布局

公共模板定义好了,那意味着你的框架已经打好了,接下来就是让其他模块来继承公共模块了,然后将需要进 行内容替换的位置进行替换即可

<!-- 文件保存于 resources/views/child.blade.php -->
<!-- 继承公共模板内容 -->
@extends('layouts/index')
<!-- 替换单行占位的内容 -->
@section('title', 'Page Title')
<!-- 替换区块占位的 sidebar 内容 -->
@section('sidebar')
@parent <!-- 这里的 parent 代表了,依然要延续使用公共框架的内容 -->
<p>这将被添加到主侧边栏。</p>
@endsection
<!-- 替换单行占位的 content 内容 -->
@section('content')
<p>This is my body content.</p>
@endsection

控制结构

if 语句
@if (count($records) === 1)
	我有一条记录!
@elseif (count($records) > 1)
	我有多条记录!
@else
	我没有任何记录!
@endif

switch 语句

@switch($i)
	@case(1)
		First case...
		@break
	@case(2)
        Second case...
        @break
	@default
        Default case...
@endswitch

循环结构

@for ($i = 0; $i < 10; $i++)
	目前的值为 {{ $i }}
@endfor

@foreach ($users as $user)
	<p>此用户为 {{ $user -> id }}</p>
@endforeach

@while (true)
	<p>死循环了。</p>
@endwhile

CSS 伪元素 (Pseudo-elements)

伪元素:

在这里插入图片描述

语法

伪元素的语法:

selector:pseudo-element {property:value;}

CSS 类也可以与伪元素配合使用:

selector.class:pseudo-element {property:value;}

:first-line 伪元素

“first-line” 伪元素用于向文本的首行设置特殊样式

p:first-line {
  color:#ff0000;
  font-variant:small-caps;
}

在这里插入图片描述

注意:“first-letter” 伪元素只能用于块级元素

下面的属性可应用于 “first-letter” 伪元素:

  • font
  • color
  • background
  • margin
  • padding
  • border
  • text-decoration
  • vertical-align (仅当 float 为 none 时)
  • text-transform
  • line-height
  • float
  • clear

伪元素和 CSS 类

p.article:first-letter {
  color: #FF0000;
}
<p class="article">This is a paragraph in an article。</p>

上面的例子会使所有 class 为 article 的段落的首字母变为红色

多重伪元素

在下面的例子中,段落的第一个字母将显示为红色,其字体大小为 xx-large。第一行中的其余文本将为蓝色,并以小型大写字母显示。段落中的其余文本将以默认字体大小和颜色来显示

p:first-letter {
  color:#ff0000;
  font-size:xx-large;
}

p:first-line {
  color:#0000ff;
  font-variant:small-caps;
}

在这里插入图片描述

:before 伪元素

“:before” 伪元素可以在元素的内容前面插入新内容

下面的例子在每个

元素前面插入一幅图片:

h1:before {
  content:url(logo.gif);
}

:after 伪元素

“:after” 伪元素可以在元素的内容之后插入新内容

下面的例子在每个

元素后面插入一幅图片:

h1:after {
  content:url(logo.gif);
}
cle。</p>

上面的例子会使所有 class 为 article 的段落的首字母变为红色

多重伪元素

在下面的例子中,段落的第一个字母将显示为红色,其字体大小为 xx-large。第一行中的其余文本将为蓝色,并以小型大写字母显示。段落中的其余文本将以默认字体大小和颜色来显示

p:first-letter {
  color:#ff0000;
  font-size:xx-large;
}

p:first-line {
  color:#0000ff;
  font-variant:small-caps;
}

:before 伪元素

“:before” 伪元素可以在元素的内容前面插入新内容

下面的例子在每个

元素前面插入一幅图片:

h1:before {
  content:url(logo.gif);
}

:after 伪元素

“:after” 伪元素可以在元素的内容之后插入新内容

下面的例子在每个

元素后面插入一幅图片:

h1:after {
  content:url(logo.gif);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值