用Laravel实现后台网站(初期)遇到问题及解决方法记录

虚拟机部分

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实现字段填充

将生产函数添加到默认seedDatabaseSeeder

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操作末尾加上条件wheredeleted_atis null

use SoftDeletes
protected $dates = ['deleted_at'];

修改软删除的字段名方式,此处注意迁移数据库需与此处一致,如果更改后上述第二条定义也需要一致。

const DELETED_AT = 'isDelete';

弃用自动创建created_atupdated_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都会调用模型类中的设定,除了不用手动指定表外可以直接使用查询控制器的方法。

Laravelblade中提供访问特定变量的方法

访问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部分

点击一个按钮触发另一个按钮或者文本框的方法

phpecho打印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模板,resourcespublic文件夹。数据库可以选择原生DB操作,查询构造器操作,Eloquent三种方式来操作,至于后台逻辑通常和路由结合在一起编写,目前我的逻辑都写在了控制器里面,对于后期应该还要引入一个服务的概念。

此外还有一些通用的新的,比如说对PHP语法的熟悉以及前端三件套的代码能基本读懂,能更具自己的需求做一个简单的定制等等。

当然最重要的一点是越发感觉到了,单纯意义上的编码真的算不得是一个技术活。有时候知道解决思路和最优解决方法更多基于经验和理论功底,往往实际上手发现某个方法不会那都是可以百度!谷歌!的呀!!!所以在一定程度上,思想和理论深度占据指导地位啊!至于语言,写着写着,你闭着眼睛都会了,就和用筷子碗吃饭一个意义,但是前提是一定要用,看是看不出花来的,哪怕有时候看出花儿了,一上手丫的全是刺儿。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章