学习PHP学习过程中也比较顺利,慢慢得会对程序理解越来越深。现在就讲讲我学习PHP laravel框架的心得。
目录
简介
特点
开发工具
学习感悟
后台用户登录
创建用户表
显示登录页面
Laravel是泰勒·奥特威尔使用PHP语言开发的一款Web应用框架。是一套简洁、优雅的框架,具有简洁且富与表达性的语法。
1.对外只提供一个入口,从而让框架统一管理项目的又有要求。
2.采用MVC(Model-View-Controller, 模型-视图-控制器)设计模式,帮助团队更好的协同开发,为项目后期的维护提供方便。
3.支持Composer依赖管理工具,可以为项目自动安装依赖包。
4.采用ORM(Object Relational Mapp,对象关系映射)方法操作数据库,并支持AR(Active Record,活动记录)模式。
5.注重代码的模块化和可展性。可通过Laravel组件库Packalyst找到想要添加的组件,可以满足大部分开发需求。
6.自带各种方便的服务。提供啦开箱即用的用户身份验证和缓存功能等。
7.具有路由功能。
8.提供Artisan命令行工具。使用Artisan命令行工具可以自动创建一个模型或一个控制器,还可以迁移数据库、查看路由等。
Apache
本学期老师主要是带领我们做Laravel框架典型的内容管理系统项目来让我们更深入了解PHP laravel框架。
本项目分为前台和后台。前台的功能包括用户登录与注册、内容列表、内容详细页、广告展示、评论和热门内容等。在项目开发前,先进行前期的准备工作
安装Laravel框架
composer create-project laravel/laravel=5.8.* --prefer-dist 项目名称
'./'表示当前目录,执行命令后,会在当前目录保存Laravel项目的所有代码。
登录MySQL服务器,创建数据库cms,作为内容管理系统的数据库:
mysql> CREATE DATABASE cms CHARSET utf8;
打开项目,在config\database.php数据库配置文件中,将数据库名称修改为cms:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'cms'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', '123456'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
在.env文件中配置正确的数据库配置信息:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cms
DB_USERNAME=root
DB_PASSWORD=123456
(1)在命令中执行命令创建迁移文件,命令如下
php artisan make:migration create_admin_user_table
执行完命令后,会在database\migrations目录下生成文件名称为时间前缀_create_admin_user_table.php的文件。
(2)在迁移文件的up()方法中添加表结构信息
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id')->comment('主键');
$table->integer('uid')->comment('用户id');
$table->integer('cid')->comment('内容id');
$table->string('content', 200)->comment('评论内容');
$table->timestamps();
});
}
在上述的代码中,用户表的表名为admin_user,"admin_"是数据表前缀。表中共有6个字段,分别是id(主键)、用户名、密码和密码salt,以及第8行代码创建的created_at和updated_at字段。
(3)使用如下命令来执行迁移。
php artisan migrate
上述命令会执行迁移文件中的up()方法,来完成数据表的创建
(4)创建填充文件
php artisan make:seeder AdminUserTableSeeder
执行命令后,就会在database\seeds目录下生成对应的迁移文件,名为AdminUserTableSeeder.php。
(5)打开AdminUserTableSeeder.php文件,在run()方法中编写填充代码。
public function run()
{
$salt = md5(uniqid(microtime(), true));
$password = md5(md5('123456') . $salt);
DB::table('admin_user')->insert([
[
'id' => 1,
'username' => 'admin',
'password' => $password,
'salt' => $salt
],
]);
}
(6)在命令行执行命令填充文件。
php artisan db:seed --class=AdminUserTableSeeder
命令执行后,会在表中插入一条记录,用户名为admin,密码是123456。
(7)创建模型
php artisan make:model Admin
(8)打开app\Admin.php,在模型中指定要操作的表名。
protected $table = 'admin_user'; public $fillable = ['username', 'password'];为用于指定要操作的表名和允许被修改的字段。
(1)创建User控制器
php artisan make:controller Admin\UserController
执行命令后,会在app\Http\Controller\Admin目录下创建UserController.php,命名空间为App\Http\Controller\Admin。
(2)打开UserController.php,创建login方法。
public function login()
{
return view('admin/login');
}
(3)在routes\web.php文件中添加路由规则。
Route::get('/admin/login', 'Admin\UserController@login');
(4)在resources\views目录下创建admin目录,用于存放后台相关的模板文件。在admin目录创建login.blade.php文件
登录
(5)引入静态文件。
(6)在步骤(4)中的第11行代码处定义登录表单。
在上述表单中,登录表单中包含用户名、密码和验证码的输入框,为防止用户恶意登录,在登录时添加验证码的功能。
(7)使用Composer在入mews\captcha验证码库。
composer require mews/captcha=3.0
(8)创建验证码的配置文件。
php artisan vendor:publish
在命令行中输入序号9并按Enter键,就会自动生成config\captcha.php文件。
(9)编辑config\captcha.php文件,将字符个数改为4。
'default' => [
'length' => 4,
'width' => 120,
'height' => 30,
'quality' => 100,
'math' => false,
],
(10)在config\app.php中将验证码服务注册到服务容器中。
'providers' => [
······(原有代码)
/*
* Package Service Providers
DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider::class,
······(原有代码)
],
(11)在config\app.php文件中给验证码服务注册别名。
'aliases' => [
···(原有代码)
'Captcha' => Mews\Captcha\Facades\captcha::class,
],
(12)在登录表单中添加验证码。
通过浏览器访问,效果如下。
(13)实现单击验证图片后更换验证码的功能,在模板中编写JaveScript代码。
上述代码使用jQuery为验证图片绑定单击事件,单击后重新请求验证地址,从而更换验证码。为了防止因浏览器缓存造成图片不更新问题的发生,在图片地址的后面拼接了一个使用Math.random()生成的随机数。