梦入琼楼寒有月,行过石树冻无烟

Laravel 请求与Cookie

在目前,请求已经覆盖了几乎上所有的站点,当你在提交表单的时候,我们通常都会成此次操作为一次表单请求,而表单请求通常别运用到了表单的填写、用户的注册、文章的发布等一系列场景之中,本文将会带读者进入到Laravel请求的实现过程。

URL请求


通常我们最为常用的是通过url进行请求,比如我们访问“https://pv.zsun.org.cn/loophole-data/ZSUN-2020-71”则会请求该站点的服务器,由服务器进行响应,我们可以通过控制器+路由的方式进行实现:

获取url

TestController

在编写控制器之前我们需要进行创建,创建控制器的方法我们可以通过artisan进行创建,创建语法为:

php artisan make:controller TestController

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function __invoke(Request $request) {
$url = $request -> url();
echo 'This request url be:'.$url;
}
}

web.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
return view('welcome');
});

Route::get('/url' ,'TestController');

获取 id


在实际的开发过程中,我们会遇到很多次的获取用户跳转id的类似需求,而实现这种需求我们也可从第一个例子中慢慢演变:

web.php

1
2
3
4
5
6
7
Route::get('/input/{id}', 'TestController@up');
```
#### TestController
```php
public function up(Request $request, $id) {
echo $id;
}

路由获取 id


当然慢慢的你会觉得还需要单独创建一个控制器(Controller)有点且非常的麻烦,那你可以使用下面这种直接在路由中开写的:

web.php

1
2
3
Route::get('/input/{id}', function (Request $request, $id) {
echo $id;
});

表单请求

表单请求几乎上是项目开发中最为常用的一种,通常运用在注册、登录、发布文章等处用的最多,本文我们将会为读者编写一个较为简单的表单请求与控制器获取的操作:

获取信息

TestController

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {
$name = $request->input('username');
echo $name;
}
}

/resources/views/input.blade.php

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<form action="/user/name" method="post">
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
Username:<input type="text" name="username" />&nbsp;
<input type="submit" value="up">
</form>
</body>
</html>

web.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
return view('welcome');
});

Route::get('/input' ,function () {
return view('input');
});
Route::post('/user/name', array('uses'=>'TestController@store'));

表单检测

is (表单url)


当然,Laravel还为我们提供了丰富的表单检测的方法,分别为检测表单提交方法,比如post/get的、也有检测表单提交url的,下面我们将会分别进行演示:

TestController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {
$name = $request->input('username');
if ($request->is('user/name')) {
echo "提交正确";
return;
} else {
echo "提交错误";
return;
}
}
}

这个我们主要用于检测表单提交后的目录,如果不是该控制器中所指定的目录将会出现提交错误的字样。

isMethod (检测提交方法)

TestController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {
$name = $request->input('username');
if ($request->isMethod('post')) {
echo "提交正确";
return;
} else {
echo "提交错误";
return;
}
}
}

在Laravel项目中,为我们提供了isMethod方法来用于判断表单的提交方法,以上例子是通过Post进行提交,但是如果使用get形式提交的话将会出现提交错误的字样。

boolean (布尔)

在Laravel项目中,布尔的提交方式较为不同,当你提交true的时候,那么会回显为1,当你提交1的时候,回显的还将是1

TestController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {
$name = $request->boolean('username');
echo $name;
}
}

has


在Laravel项目中has主要用于检测表单是否存在,但是翻译后他会显示“has方法来确定请求中是否存在该值”,那么我们可以写一个检测表单是否存在的:

TestController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {

if ($request->has('sss')) {
echo "yes";
} else {
echo "no";
}
}
}

在控制器中,我们在has方法后面写了一个名为”sss“的前端表单,如果存在即返回yes,不存在则返回no,那么在前端页面中,我们并不存在name为sss的表单即input,所以返回了no.

运算符


在实际的开发过程中我们总需要检测一些非法表单的提交,如!×#!@×#一些乱码或空白表单的问题,在Laravel之中与其他语言一样,都是支持运算符的,我们可以通过运算符进行判断该数据是否在“黑名单之中”

TestController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
public function store(Request $request) {
$name = $request->input('username');
if ($name == '1') {
echo "yes";
} else {
echo "no";
}
}
}

在上述的code中,我们在TestController控制器中加入了一个运算符==来判断$name的函数是否存在等于1的情况,如果提交数据等于1则返回yes,否则返回no。


Cookie是在项目开发过程中较为不常用的一种方式,但这种技术运用在会话中较为常用,如钟山计算机端口安全联合众测平台中就是用Cookie技术来达到会话在一定时间内不会过期的问题:

创建cookie

TestController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

namespace App\Http\Controllers;

use http\Cookie;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class TestController extends Controller
{
public function store(Request $request,Response $response) {
// 创建cookie
$response = new Response();
$response->withCookie(cookie('name', 'value'));

// 获取cookie
$value = $request->cookie('name');
echo $value."<br>";
return $response;
}
}


withCookie中,如果你是使用PhpStort的读者,肯定会明白意思,因为集成开发环境会在前面分别进行标注。在本文演示中,我们并没有设置其Cookie的过期时间,读者如果在项目或学习过程有需要的话,可以加入第三项,为其cookie设置时间。

获取cookie


在Laravel项目中,我们有两种凡是来获取和访问cookie值,可分别使用请求(request)或使用CookieFacade来访问:

Request

1
2
3
4
public function store(Request $request) {
$value = $request->cookie('laravel_session');
echo $value."<br>";
}

CookieFacade

1
2
3
4
public function store(Request $request) {
$values = \Illuminate\Support\Facades\Cookie::get('laravel_session');
echo $values;
}
⬅️ Go back