关于学习Laravel5.8时的知识总结及遇到的问题(持续更新)
最近发现很多公司在使用Laravel来做项目,于是决定也来研究一下。这里记录了在学习Laravel过程中遇到的所有问题以及知识总结。
错误汇总
1.0 访问报错(500)
在不使用PHP自带服务器或者laravel推荐的 Homestead 和 Valet 作为虚拟机时,会出现一些奇怪的错误。可我们就想用自己熟悉的开发环境,不想用这几种虚拟机,就可能会出现500的情况。
这里的500错误有两种
第一种:
Parse error: syntax error, unexpected ‘?’ in D:\study\test\latest\laravel58\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php on line 500
这个问题是因为PHP版本过低,请检查项目的PHP版本,5.8要求在PHP版本在7.1.3以上。
第二种:
我们可以检查log文件 。通常在我们运行过一次框架之后,在storage/log中会生成一个以时间为文件名的log文件
我们可以通过查看日志来判断问题的所在:
[2019-11-07 15:54:06] production.ERROR: No application encryption key has been specified. {“exception”:"[object] (RuntimeException(code: 0): No application encryption key has been specified. at D:\study\test\latest\laravel58\vendor\laravel\framework\src\Illuminate\Encryption\EncryptionServiceProvider.php:44)
…
"}
production.ERROR: No application encryption key has been specified. 可以看出,我们缺少了指定应用程序加密密钥,即env文件。composer安装不会出现这种问题,因为在安装过程中会自动生成,我用的是压缩包。
通常,这个字符串应该是 32 个字符长度。这个密钥将会设置在环境变量文件 .env 中。如果应用密钥还没有设置,你的用户会话和其他的加密数据将会不安全!
这个env文件可以通过命令生成,我这里的解决办法是将laravel6中的env文件复制了过来,没有报错。
如果这个方法无法解决,那可能是php扩展没有安装完整,5.8需要8个扩展(OpenSSL PDO Mbstring Tokenizer XML Ctype JSON BCMath ),但是大多数已经默认安装到了php中,ini无法找到是正常的。可以在php.exe所在目录运行php -m来查看。或者是storge和bootstrap文件没有赋予读写权限,windows环境下直接在右键属性中,安全选项卡查找用户赋予权限即可。并将文件属性取消只读。
然后,就进入index页面了
2.0 手脚架创建文件失败(500)
在win命令行使用手脚架创建文件时如果产生以下错误:
PHP Parse error: syntax error, unexpected ‘?’ in “错误位置” 500
这个错误说明当前PHP版本不支持Laravel。
请检查环境变量中系统变量和你的用户变量中的PATH是否只存在唯一一个PHP变量,如果是,再确认一下版本号是否符合Laravel标准,如果不是,则保留最新版本号在系统变量中。
重新打开命令行,输入php -v 查看当前版本。
知识点汇总
1.0 路由的基础用法
在ThinkPHP框架中,当我们在URL地址中,传递m、c、a三个参数时,系统会自动跳转到指定模型中指定控制器的指定方法,这些处理过程都是由框架自动完成的。但是,在Laravel框架中,其并没有指定固定参数,其路由必须要手工进行配置。把用户需要访问的全部路由都事先设置好,用户只能访问声明的一些路由,即没有声明的路由是不能被访问的,进而可以对网站的安全有一定的保护作用。
controller文件
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DemoController extends Controller
{
public function Demo (){
echo "hello Demo";
}
}
web.php
Route::get('/', function () {
return view('welcome');
});
//基本写法
Route::get('admin',function () {
return "hellow world!";
}
);
//输出:hellow world!
//基本写法,控制器 文件位置:(app\Http\Controllers)
Route::get('demo','DemoController@Demo');
//输出:hello Demo
//基本写法,控制器 关于访问文件夹内控制器写法。 文件位置:(app\Http\Controllers\Admin)
Route::get('demo','Admin\DemoController@Demo');
//输出:hello Demo
/*
*当多个路由的前缀和命名空间(位置)相同时,我们可以使用这种写法方便管理
*prefix:路由前缀
*namespace:命名空间(位置)
**/
Route::group(['prefix' => 'admin','namespace'='Admin'],function () {
Route::get('index','DemoController@Index');
Route::get('user','DemoController@User');
Route::get('list','DemoController@List');
}
);
//当我们输入/admin/index就会访问app\Http\Controllers\Admin\DemoController.php中的Index方法
//传递参数
Route::get('parameter/id/{id}/name/{name}/mobile/{mobile?}',function ($id,$name,$mobile) {
return "我的ID:".$id."。我的名字:".$name."。我的手机号:".$mobile."。";
}
);
//输出:我的ID:22。我的名字:张三。我的手机号:13645896652。
/*
* 传递参数
* 设置默认参数($mobile="123456")
* 可选参数{mobile?}
* 过滤参数类型(->where('参数','正则'))
* ->where(['name'=>'[a-zA-Z]','id'=>'\d+']) 多个约束写法
* */
Route::get('parameter_plus/id/{id}/name/{name}/mobile/{mobile?}',function ($id,$name,$mobile="123456") {
return "我的ID:".$id."。我的名字:".$name."。我的手机号:".$mobile."。";
}
)->where('id','^\d+$');
//输出:我的ID:2。我的名字:李四。我的手机号:123456。
//多个前缀
Route::get('admin/index',function () {
return "hellow index!";
}
);
Route::get('admin/list',function () {
return "hellow list!";
}
);
Route::get('admin/login',function () {
return "hellow login!";
}
);
//合在一起
Route::group(['prefix' => 'admin'],function () {
Route::get('index',function () {
return "hellow index!";
}
);
Route::get('list',function () {
return "hellow list!";
}
);
Route::get('login',function () {
return "hellow login!";
}
);
}
);
//多种请求方式
Route::match(['admin', 'post'], '/', function () {
return "hellow world!";
});
//任意请求方式
Route::any('admin', function () {
return "hellow world!";
});
//路由重定向
Route::redirect('/here', '/there');//返回值为302 (('/here', '/there', 301))可自定义返回
Route::get('/there', function () {
return "hellow there!";
});
//页面路由
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);//可以跟一个数组,他会被传入页面中
以上就是路由的基础写法,能够满足大多数使用场景。更多路由写法与设置请参考 Laravel5.8开发文档。