jimtse
【PHP】安装laravel
Docker Desktop安装(Mac)
curl -s "https://laravel.build/example-app" | bash
cd example-app
./vendor/bin/sail up
常用命令
命令 | 意义 |
---|---|
php artisan make:controller IssuesController | 新建控制器 |
php artisan make:controller IssuesController -r | 新建控制器并自动生成对应 RESTful风格路由相关CURD方法 |
php artisan make:migration create_issues_table --create=issues | 新建一个迁移文件 |
php artisan migrate | 运行迁移,将迁移文件的内容写入数据库中 |
php artisan migrate:rollback | 回滚上一次迁移的内容 |
php artisan make:model Models/Issue | 新建模型 |
php artisan make:model Models/Issue -m | 同时生成模型和对应的迁移文件 |
php artisan tinker | 使用命令行来调试Laravel、操作模型等 |
php artisan route:list | 打印出所有的路由 |
时区
如果你的项目中,所有的时间都出现问题,可能少了8个小时或者其他情况,那么你需要去config/app.php中,设置一下时区,问题就解决了。
'timezone' => 'PRC',
控制器-Controller
作用就是整个程序的逻辑部分,可以调用模型做一些数据处理,还可以显示模板,with发送数据到模板,跳转等等。
如果需要发送多个数据到模板,那么可以使用compact函数来简化代码。
模型-Model
模型一般都放在App\Models中。初学模型,暂时也不用太深入,知道我们是使用模型来操作数据库的就好。 目前需要掌握的也只有定义 白名单 和关联。我们实现了issues和comments的一对多关联,comments表中一定要有issue_id来做对应。模型的关联除了一对多外,还有一对一,多对多.
这里还是用 php artisan tinker来看一下这两个例子。
//通过$issue,查询对应的所有comments。 $issue = Issue::find(13) $issue->comments
//通过comment,查询所属的issue。 $comment = Comment::find(1) $comment->issue
除此外也可以在模型中自定义一些方法来调用。
迁移-Migration
数据库中,有一个migrations表,这里记录的是所有已经跑过的迁移列表,如果这里已经有记录了,那你再跑php artisan migrate,他是不会重复执行的。换句话说,就是只会运行之前从没有跑过的迁移文件。
如果你觉得迁移用的不习惯,觉得直接动手使用sequal pro或者navicat这类软件建表更方便,那其实也完全没有任何问题的,laravel一样可以用的好好的。
布局模板
再来看模板部分,将页面相同的公共部分,抽离出来,放在layout/app.blade.php,并且加上@yield('content')
其他的页面
@extends('layouts.app') @section('content') @endsection
这样就简简单单的实现完成了。
子视图模板
在首页里,我们使用 子视图模板,现在来说一下为什么要使用这么个东东?
其实最主要的作用也是为了处理一些重复的页面片段。另一个是可以分离出去一部分页面,让页面整体结构更清晰。
实践子视图
我这么说,你可能还是不明白,那么我们来实际操作一下。
观察welcome/_issue_list.blade.php 和 issues/index.blade.php这两个文件,你会发现foreach部分的代码几乎一模一样的。
那么这里就可以使用子视图模板来处理了,对于这种公共的片段,我们一般会在views里面建一个shared文件夹,表示他是公共的,然后将welcome/_issue_list.blade.php移动进去。
再到 issues/index.blade.php中 ,将 {{ $issues->links() }} 拿到页面最下面,然后用将 整个foreach用这一行代替
@include('shared._issue_list') {{ $issues->links() }}
welcome/index.blade.php中,也稍微调整下路径@include('shared._issue_list')
再来访问,所有的功能都可以正常使用,这样就实现了 Don't Repeat Yourself。
csrf
csrf是一种常见的安全攻击,在这里两句话说不清楚,有兴趣的同学可以自行了解一下。
对于我们初学者来说,只要记得在所有的表单中,都加上这一段代码就好
{{ csrf_field() }}
路由
路由是laravel学习的重中之重了,初学者觉得最困难的也是这个地方。你需要知道的是,路由就是为了定义 请求地址和控制器方法的对应关系的。
restful 与 resource
Verb | URI | Action | Route Name | 作用 |
---|---|---|---|---|
GET | /issues | index | issues.index | 列表显示所有的issues |
GET | /issues/create | create | issues.create | 显示新增issue的表单 |
POST | /issues | store | issues.store | 真正执行新增操作,插入数据库 |
GET | /issues/{issue} | show | issues.show | 显示一条issue |
GET | /issues/{issue} | edit | issues.edit | 显示编辑issue的表单 |
PUT/PATCH | /issues/{issue} | update | issues.update | 真正执行更新操作,修改数据库 |
DELETE | /issues/{issue} | destory | issues.destroy | 删除issue |
先来回顾一下resource路由,如果你需要对数据库的一个资源做curd,那就可以直接使用resource路由。
需要注意的是uri部分,这里有很多路径是一模一样的,这就是restful的规范了,例如issues.show issues.update issues.destroy,他们三个的路径就是完全一模一样。传统的一些框架,是只能支持get post的,对于这样的路径地址就无法区分了。
在laravel,可以使用不同的动词,虽然都是相同的路径,issues.show 使用get, issues.update使用put,issues.destroy使用delete。这样就可以实现相同的访问地址,对应控制器中的不同方法。但是除了浏览器默认支持的get和post外,其他请求不要忘记使用method_field来伪造。
Route::get('issues/{issue}', 'IssuesController@show')->name('issues.show');
Route::get('issues/create', 'IssuesController@create')->name('issues.create');
Route::get('issues', 'IssuesController@index')->name('issues.index');
Route::post('issues', 'IssuesController@store')->name('issues.store');
Route::get('issues/{issue}/edit', 'IssuesController@edit')->name('issues.edit');
Route::put('issues/{issue}', 'IssuesController@update')->name('issues.update');
Route::delete('issues/{issue}', 'IssuesController@destroy')->name('issues.destroy');
Route::resource('issues', 'IssuesController');
参数
路由中的issues.show的对应的uri包含了这样一个有大括号的路径,/issues/{issue},那么超链接那里就可以写{{route('issues.show', 10)}},这个10,就会替换掉{issue},生成的路径也就是/issues/10。
除此外,在控制器的方法中,直接可以就可以使用这个$id,也就是传过来的10,而不用像其他框架那样要用$_GET['id']来取值了。
function show($id) { return $id; }
顺序
路由的顺序是非常重要了,一定要记得是从上向下执行的。如果resource路由提供的curd方法,依然不能满足项目需求,往往还会自定义一些新的方法,这时一定要写在resource路由的上方,这个我们后期项目中碰到,到时再细说。
api.php
routes文件夹中,除了web.php外,还有个api.php,这个是做接口使用的。区别是会去掉session cookie等相关中间件,路径上会自动添加/api前缀。这个目前也暂时不需要了解太多。后面的项目我们碰到做接口再细说了。
单复数
laravel中对单复数要求的非常严格,有的地方是单数有的是复数,初学者很容易被搞晕。这里我做了个统计表,一看便知。
控制器的命名是复数。
模型的命名是单数,但数据库中的表都是复数形式。
资源路由也是复数,对应的uri,一般也是复数。
查询的多条数据,是复数,单条数据就是单数了。
模型的关联中,has_many,因为有很多,是复数。belongs_to,只属于某一个,所以是单数了。
命令 | 意义 |
---|---|
控制器 | 复数 |
模型 | 单数 |
数据库中的表 | 复数 |
资源路由 | 复数 |
uri | 复数 |
多条数据 | 复数 |
单条数据 | 单数 |
has_many | 复数 |
belongs_to | 单数 |