虚拟机部分
homestead配置访问名称
[windows]
下首先修改C:\Windows\System32\drivers\etc\host
,将虚拟机IP
与指定的名称绑定。
192.168.10.10 news.test
然后修改homestead.yaml
(在安装文件夹下),绑定域名到特定项目的public
文件夹。
sites:
- map: news.test
to: /home/vagrant/Code/20190108bg-laravel/public
Laravel
框架部分
迁移数据库和测试数据生成
迁移数据库
php artisan make:migration xxx //用Blueprint实现字段定义,要注意区分新建和修改,其它参看文档
测试数据生成
首先定义数据库模型(model
),即需要填充操作的数据库
php artisan make:model xxx // 注意此处定义的名字的复数形式会被作为表名,可以在模型内更改
构造生产函数
php artisan make:factory xxx //生产函数内部使用Faker实现字段填充
将生产函数添加到默认seed
:DatabaseSeeder
public function run() {
factory(\App\Article::class, 500)->create(); //500为生成数量
}
或是新建一个seed
php artisan make:seed xxx
public function run() {
$this->call(UsersTableSeeder::class); // 详情文档
}
启动seed
php artisan db:seed
模型内部常用的定义
在模型内部的定义会影响到后续使用该模型操作的数据库结果,定义在模型类当中。
使用软删除,启用后会创建默认字段deleted_at
,当模型类对数据调用delete
删除时,自动创建当前时间,否则该字段为null
,此外开启该字段以后框架会在所有使用该模型类的sql
操作末尾加上条件where
deleted_atis null
:
use SoftDeletes
protected $dates = ['deleted_at'];
修改软删除的字段名方式,此处注意迁移数据库需与此处一致,如果更改后上述第二条定义也需要一致。
const DELETED_AT = 'isDelete';
弃用自动创建created_at
和updated_at
字段(默认开启)
public $timestamps = false;
所使用的路由定义方法总结
Laravel
框架的路由定义位置在/routes/web.php
中,用到的方式如下:
闭包方式:
Route::get('/', function () {
return redirect('/news');
});
控制器方式:
Route::get('/news', 'NewsController@index')->name('news.home'); //name为别名,后续可以使用框架提供的route()方法访问
路由分组:
Route::name('form.')->prefix('form')->group(function () {
Route::post('add', 'RequestController@add')->name('add'); //统一处理前缀为/form的路由,此处的name会自动和分组name合并
Route::post('modify', 'RequestController@modify')->name('modify');
}
三种常用的操作数据库的方式
原生语句:
use Illuminate\Support\Facades\DB;
DB::statement('sql'); // 原生操作方式不会使用模型类中的定义
查询构建器方式:
use Illuminate\Support\Facades\DB;
DB::table('table_name')->xxx(); // xxx为方法名,具体参考文档,此处不会调用模型类中的定义
Eloquent
方式:
use \App\User; //定义的模型类
DB::all()->xxx(); //使用eloquent都会调用模型类中的设定,除了不用手动指定表外可以直接使用查询控制器的方法。
Laravel
及blade
中提供访问特定变量的方法
访问config
中配置的变量:
config(xxx.val_name); // xxx为文件名,后者为变量名
访问url
:
url("path") // path可以是路由中定义的相对路径,会自动解析为绝对路径
asset("path") // 常用来引用静态文件,位置固定
route("name") // name为路由中定义的别名,会自动解析
软删除的使用方法
软删除首先在模型类中弃用,并在迁移文件中配置相应的删除字段,最后调用时用模型类的删除即可。
$flag = $article->delete(); // 此处一定是通过模型类调用
怎么设置时区
时区的设定位置在config/app.php
'timezone' => 'Asia/Shanghai', // 默认UTC
利用post
方法提交返回419
错误
Laravel
框架中处于安全会处理跨站攻击,需要在表单中添加语句
<form>
<!--...-->
<input type="hidden" name="_token" value="{{ csrf_token() }}"/>
</form>
PHP
部分
给数组添加一个值
直接赋值:
arr_name['xxx'] = value;
利用foreach
给数组循环赋值
循环赋值时注意不能对as
后的值进行修改,这样最后不会被保存,一定要把修改保存到传入的变量中
foreach ($res as $key=>$val) {
$res[$key]["xxx"] = $your_value // 赋值给原$res
}
如何判断_GET
或其它数组是否存在及其中某个元素是否存在
if (is_array($_GET) && count($_GET)>0) { // 借助is_array count检查数组情况
if (isset($_GET['c_sort'])) { // 用isset判断变量是否存在
//
}
}
Mysql
部分
怎么更新作为查询条件的字段
借助临时表完成:
DB::statement('CREATE TABLE `temp` AS (SELECT * FROM `articles` WHERE `category_id`= ?)', [$cid]);
DB::statement('UPDATE `articles` SET `category_id`=1 WHERE `id` IN (SELECT `id` FROM `temp`)');
DB::statement('DROP TABLE `temp`');
前端html
css
js
部分
点击一个按钮触发另一个按钮或者文本框的方法
php
用echo
打印alert
后再跳转到页面出现字体变大,css
失效问题
此处的问题是alert
弹出后打断了单线程的js和css加载,导致后面出现问题。如果只是想跳回之前的老页面,可是使用history.back()
echo "<script>alert('分类 ' + $name + ' 已存在!');history.back();</script>";
防止回车键提交表单
在表单中加入以下js
代码:
<form method="post" onkeydown="if(event.keyCode==13)return false;" action="" id="listform">
对同一个表单不同的提交按钮执行不同的动作
在按钮对应的js
代码中替换原来的action
动作:
document.getElementById("listform").action = "{{ route('form.delete') }}"
document.getElementById("listform").method = "post";
$("#listform").submit();
通过回车键提交表单内的一个特定的input
未实现
其它
grep
精确匹配的用法
du -h | grep -nw 'log' // n显示行数,w实现精确匹配
总结
第一次用PHP
搭建后台,之前仅仅是把Laravel
教程得代码复制粘贴,虽然能跑,什么都不懂。这次借用前端模板,先是用纯PHP
实现了一遍,然后用Laravel
实现了一遍,感触还是挺多。分别讲述体会总结如下:
纯PHP
实现:
现阶段的体会就是虽然实现了,面向对象的思想完全没有啊,基本都是走一步是一步。但就像之前说的一样,如果过程都不熟悉,哪里谈得上对象。而且目前都没有复杂的逻辑,整体的一个交互构造就是:前端->后台->数据库。
利用Laravel
框架的实现:
框架的使用总结如下,主要有以下几个部分:
artisan
常用命令使用config
的配置和使用- 路由-控制器(
web
-controller
) - 数据库模型
model
- 数据库迁移(
migration
) - 随机数据生成(
seed
factory
) blade
模板的基本使用
总体来说其实万变不离其宗,核心还是有***前端->后台->数据库***三部曲,这里还外加一个***路由***,不过之前这三部曲都是自己来写,现在都变成了对框架的调用。前端使用了blade
模板,resources
和public
文件夹。数据库可以选择原生DB
操作,查询构造器操作,Eloquent
三种方式来操作,至于后台逻辑通常和路由结合在一起编写,目前我的逻辑都写在了控制器里面,对于后期应该还要引入一个服务的概念。
此外还有一些通用的新的,比如说对PHP
语法的熟悉以及前端三件套的代码能基本读懂,能更具自己的需求做一个简单的定制等等。
当然最重要的一点是越发感觉到了,单纯意义上的编码真的算不得是一个技术活。有时候知道解决思路和最优解决方法更多基于经验和理论功底,往往实际上手发现某个方法不会那都是可以百度!谷歌!的呀!!!所以在一定程度上,思想和理论深度占据指导地位啊!至于语言,写着写着,你闭着眼睛都会了,就和用筷子碗吃饭一个意义,但是前提是一定要用,看是看不出花来的,哪怕有时候看出花儿了,一上手丫的全是刺儿。