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);
}