Skip to content

day2

$_SERVER

$_ENV

php
public function store2(Request $request){
    $validator = Validator::make($request->all(), [
        'title'=>"required|max:20",
        'author'=>['required','min:2', 'max:20'],
        'age'=>"numeric",
        'body'=>"required"
    ], [
        'title.required'=>'请填写标题',
        'title.max'=>'标题最大不超过20个字符',
        'author.required'=>'请填写作者',
        'author.min'=>'作者最少填写2个字符',
        'author.max'=>'作者最大不超过20个字符',
        'age.numeric'=>'年龄必须是数字',
        'body.required'=>'内容必填'
    ]);

    if($validator->fails()){
        return redirect('validate/create')
            ->withErrors($validator)
            ->withInput();
    }
}

全局使用中间件

上面说过的内容,都是在某一个特定的情况下使用中间件,比如说指定的路由,或者是指定的控制器。Laravel 也为我们准备了全局中间件定义的地方,全局的意思就很明显了,所有的请求都会加上这个中间件。

php
// App\Http\Kernel.php
protected $middleware = [
    // \App\Http\Middleware\TrustHosts::class,
    \App\Http\Middleware\TrustProxies::class,
    \Fruitcake\Cors\HandleCors::class,
    \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\MiddlewareTest::class,
];

我们只需要找到 App\Http\Kernel.php 文件,在其中的 middleware 变量中添加最后一行,也就是我们自定义的那个中间件就可以了。这样,所有的请求都会走这个中间件。Kernel.php 是一个核心文件,我们继续看它,会发现下面还有两个变量,一个是 middlewareGroups ,一个是 routeMiddleware 。其实从名字就可以看出,middlewareGroups 是为中间件分组的,里面默认定义了两个中间件组,分别是 web 和 api 。其实他们对应的就是路由文件夹下的 api.php 和 web.php 所要加载的中间件。在源代码中,我们可以找到 app/Providers/RouteServiceProvider.php 这个文件,查看里面的 boot() 方法。

scss
public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
    });
}

在这个 boot() 方法中,就可以看到,它定义了两个路由,加载的分别是 routes 目录下对应的两个文件,然后使用 middleware() 指定的中间件其实就是我们在中间件组中定义的那两个中间件组。既然是组的概念,那么在组中的所有中间件都会在这两个路由文件中被执行。大家可以尝试注释掉 web 分组下面的 \App\Http\Middleware\VerifyCsrfToken::class 这个中间件,就会发现 web.php 下的所有请求都不需要进行 CSRF 验证了。

另外一个 routeMiddleware 的意思其实是给中间件起个别名,比如我们在这个变量中增加一个:

ruby
'middlewaretest' => \App\Http\Middleware\MiddlewareTest::class,

然后在路由中,直接在 middleware() 方法中使用这个定义的名称就可以了。

css
Route::get('middleware/test', 'App\Http\Controllers\MiddlewareTestController@test')->middleware('middlewaretest');

PDO

Route::get('rawdb/test/insert', function () {
    $data = [
        'Peter' => 1,
        'Tom'   => 1,
        'Susan' => 2,
        'Mary'  => 2,
        'Jim'   => 1,
    ];
    foreach ($data as $k => $v) {
        \Illuminate\Support\Facades\DB::insert('insert into raw_test (name, sex) values (?, ?)', [$k, $v]);
        $insertId = DB::getPdo()->lastInsertId();
        echo $insertId, '<br/>';
    }
});
\Illuminate\Support\Facades\DB::update('update raw_test set name=:name,sex =:sex where id = :id', $data);

在config/database.php修改添加laravel8

DB::connection('laravel8')

4.2 查询构造器

https://www.zyblog.com.cn/article/207

调试

如果想知道最后执行的 SQL 语句是什么,直接使用一个 toSql() 方法就可以了。

sql
echo \Illuminate\Support\Facades\DB::table('db_test')
    ->select(['*'])
    ->where($where)
    ->orderBy('id', 'desc')
    ->limit(10)
    ->offset(0)
    ->toSql();
// select * from `db_test` where (`name` like ?) order by `id` desc limit 10 offset 0

另外还有就是我们在 SQL 语句中只看得到原始语句,也就是 name 这个 where 条件是使用 ? 号占位符的,参数是没法通过 toSql() 看到的。但是我们还是很想知道我们的参数是什么呀,从而方便我们的调试,这可怎么办呢。不用担心,还有好东西呢。

rust
\Illuminate\Support\Facades\DB::table('db_test')
    ->select(['*'])
    ->where($where)
    ->orderBy('id', 'desc')
    ->limit(10)
    ->offset(0)
    ->dd();
// "select * from `db_test` where (`name` like ?) order by `id` desc limit 10 offset 0"
// array:1 [▼
//   0 => "%m%"
// ]

dd() 这个方法会输出两行信息,一行是 SQL 语句,一行就是条件参数数组,是不是非常方便。不过它会中断程序的运行,我们还有另一个方法 dump() ,输出的内容是和这个 dd() 方法完全相同的,但它不会中断程序的运行。

有这三大神器,相信你对 查询构造器 的调试就能够得心应手了吧!

【Laravel系列1】进入 Laravel 的世界

https://www.zyblog.com.cn/article/776

【Laravel系列2.1】先把Laravel跑起来

https://www.zyblog.com.cn/article/775

【Laravel系列2.2】Laravel 目录结构与配置

https://www.zyblog.com.cn/article/774

【Laravel系列2.3】Laravel运行命令行脚本

https://www.zyblog.com.cn/article/201

【Laravel系列3.1】一个请求的前世今生

https://www.zyblog.com.cn/article/202

【Laravel系列3.2】路由:指哪儿打哪儿

https://www.zyblog.com.cn/article/203

【Laravel系列3.3】控制器与表单验证

https://www.zyblog.com.cn/article/204

【Laravel系列3.4】中间件在路由与控制器中的应用

https://www.zyblog.com.cn/article/205

【Laravel系列4.1】连接数据库与原生查询

https://www.zyblog.com.cn/article/206

【Laravel系列4.2】查询构造器

https://www.zyblog.com.cn/article/207

【Laravel系列4.3】模型Eloquent ORM的使用(一)

https://www.zyblog.com.cn/article/208

Route::get('model/test/insert', function () {
    $data = [
        [
            'name'=>'Peter',
            'sex' => 1,
        ],
        [
            'name'=>'Tom',
            'sex' => 1,
        ],
        [
            'name'=>'Susan',
            'sex' => 2,
        ],
        [
            'name'=>'Mary',
            'sex' => 2,
        ],
        [
            'name'=>'Jim',
            'sex' => 1,
        ],
    ];
    foreach ($data as $v) {
        $model = new \App\Models\MTest();
        $model->name = $v['name'];
        $model->sex = $v['sex'];
        $model->insertGetId();
        $insertId = $model->id;
        // $insertId = \App\Models\MTest::insertGetId($v);
        echo $insertId, '<br/>';
    }
});

【Laravel系列4.4】模型Eloquent ORM的使用(二)

https://www.zyblog.com.cn/article/209

【Laravel系列4.5】主从库配置和语法生成

https://www.zyblog.com.cn/article/210

【Laravel系列4.6】事务以及PDO属性设置

https://www.zyblog.com.cn/article/211

Route::get('db/tran/insert', function(){
    \Illuminate\Support\Facades\DB::beginTransaction();
    try {
        \Illuminate\Support\Facades\DB::table('db_test')->insert(['name' => 'Lily', 'sex' => 2]);
        \Illuminate\Support\Facades\DB::table('db_test_no')->insert(['name' => 'Lily', 'sex' => 2]);
        \Illuminate\Support\Facades\DB::commit();
    }catch(Exception $e){
        \Illuminate\Support\Facades\DB::rollBack();
        dd($e->getMessage());
    }
});

【Laravel系列4.7】连接redis以及缓存应用

https://www.zyblog.com.cn/article/212

【Laravel系列5.1】Blade模板开发

https://www.zyblog.com.cn/article/213

【Laravel系列6.1】服务容器简介

https://www.zyblog.com.cn/article/214

【Laravel系列6.2】Laravel中的服务容器

https://www.zyblog.com.cn/article/215

【Laravel系列6.3】框架启动与服务容器源码

https://www.zyblog.com.cn/article/216

【Laravel系列6.4】管道过滤器

https://www.zyblog.com.cn/article/217

【Laravel系列6.5】门面模式

https://www.zyblog.com.cn/article/218

【Laravel系列7.1】日志处理

https://www.zyblog.com.cn/article/772

【Laravel系列7.2】错误与异常处理

https://www.zyblog.com.cn/article/219

【Laravel系列7.3】Session与响应

https://www.zyblog.com.cn/article/220

【Laravel系列7.4】安全相关

https://www.zyblog.com.cn/article/221

【Laravel系列7.5】事件系统

https://www.zyblog.com.cn/article/222

【Laravel系列7.6】任务调度

https://www.zyblog.com.cn/article/223

【Laravel系列7.7】队列系统

https://www.zyblog.com.cn/article/224

【Laravel系列7.8】广播系统

https://www.zyblog.com.cn/article/225

【Laravel系列7.9】测试

https://www.zyblog.com.cn/article/226

【Laravel系列8】走出 Laravel 的世界

https://www.zyblog.com.cn/article/771

Lucking