1.MYSQL入门
①怎么从内网测试服务器,把现有的数据库拖到本地来?结构或数据不变?
1.下载 navicat ——>可视化的UI软件。
2.连接上内网的数据库。
3.选择目标数据库,右键“转储SQL文件”。
4.选择“
*.sql
”导出后的存放路径。5.在本地计算机的navicat,点击
连接
按钮,新建一个本地localhost的MySQL连接。用户名输入安装MySQL时的用户名,密码也是。6.在已建立的本地MySQL连接上,
右键——新建数据库————utf-8编码————选择utf-8的首个排序选项
,新建一个空白数据库。7.在新数据库上,
右键————"导入SQL脚本(运行SQL文件)"
。
2.在Laravel中,写一个新的接口
1.新建一个Controller子类。路径固定是在
/app/Http/Controller/Api
目录下,Controller子类的名字,自己定义。2.配置
网址Url
所指向的routes
(路由)。 路由文件是在/app/Http/routes.php
。仿照这样形式:
$api = app('Dingo\Api\Routing\Router');// app路由 $api->version('v1',function ($api){ # ------------------------------------App 路由--------------------------------------------- $api->group(['namespace' => 'App\Http\Controllers\Api', 'prefix' => 'api'],function ($api){ $api->group(['middleware' => 'start_session'],function ($api){ $api->post(' 分组名 / 方法名 ',' 某个Controller@某个方法 '); }); $api->group(['middleware' => 'api_session'],function ($api){ # ------------------ 分组A ------------------------ $api->post(' 分组A / 方法名 ', ' 某个Controller@某个方法 ');
3.Controller子类,需要继承于
BaseController
。同时,需要重写__construct(){}
构造方法。构造方法如下:
//这里面新出现了 Eloquent(实现)的概念。其实,Eloquent就是 M-V-C 模式里面的 M层(所有的的业务逻辑,全部封装在里面)。 protected $a_Repository; protected $b_Repository; protected $c_Repository; protected $d_Repository; //(照着写。这里是通过Laravel的注入。) public function __construct( A_Eloquent $a_Repository, B_Eloquent $b_Repository, C_Eloquent $c_Repository, D_Eloquent $d_Repository ) { $this->a_Repository= $a_Repository; $this->b_Repository= $b_Repository; $this->c_Repository= $c_Repository; $this->d_Repository= $d_Repository; } //这后面,就是留给你写自己方法的空间。
4.下面建立一个
某某RepositoryEloquent子类
,需要继承于BaseRepository
。同时还要实现RepositoryInterface子接口
(新建一个子接口,命名为某某Repository
,作为RepositoryInterface的子接口
,然后让某某RepositoryEloquent子类
将其实现。)
某某RepositoryEloquent子类
的路径,固定是在/app/Repositories/Eloquent/
之下。(实现
概念)
某某Repository
的路径,固定是在/app/Repositories/Contracts/
之下。(契约
概念)①
某某Repository
里,可以不放任何内容,但必须实现RepositoryInterface
这个接口,以备将来在里面扩展内容和流程。
② 继承了BaseRepository
类,需要实现它的一个 抽象方法
abstract public function model();
该抽象方法的实现如下:
public function model() { return 一个数据Model类::class; }
③总体形式如下:
class 某某RepositoryEloquent extends BaseRepository implements 某某Repository { public function model() { return 一个数据Model类::class; } //这后面,就是留给你写自己方法的空间。
5.然后,我们需要建立一个
某某数据Model类
,继承于Model
。①
某某数据Model类
需要重写两个属性。$fillable
和$table
。
②$fillable
,是一个字符串数组的形式。这里的意思是,$fillable
是将来创建一条数据时,所用到的插入数据的列的属性。同时也可以起到一个过滤无用信息,只保留插入数据所必要信息的作用。
③$table
,就是你所用到的这条数据,所在的 数据库表
的表名
。
④某某数据Model类
同属于 M-V-C 结构中的M层。是一个数据存储和操作时,为了方便利用而封装成框架的最小单元
。
⑤总体形式如下:
class 某某数据Model类 extends Model { protected $table = '表的表名'; protected $fillable = ['column_A','column_B','column_C','column_D']; }
3.对于1和2的补充
①数据库,可以用unsigned属性,来区别于signed属性。
②数据库,最好用 not null ,更加省资源。
③在Laravel中,Request,可以自己重写以下方法
//是否采用用户验证。
public function authorize()
{
return true;
}
//是否制定参数匹配规则。
public function rules()
{
return [
'group_name' => 'required',
'category_id' => 'required',
'type' => 'required',
'user_id' => 'required',
'longitude' => 'required',
'latitude' => 'required',
'address' => 'required',
];
}
来进行Request的自定制化。
4.Laravel项目的本地搭建
1.目前第一步————>Laravel安装指南——>服务器路径,指向 public 目录
2.第二步,检查Laravel中,.env
配置文件,是否存在。确保其存在。
3.第三步,打开Nginx服务器。
4.第四步,使用 $ php artisan serv
,打开Laravel的进程。(此时,8888端口,仅能看到首页。而用8000端口,则可以看到Laravel的首页,已经Laravel容器下的各种页面。)
5.目前卡在了,除首页外,所有的页面都是404这里。
原因一,在于使用了8888端口(Nginx的端口),而没有按标准使用Laravel的8000端口(基于Nginx而重新定制了的Laravel专属端口)。
原因二,看下图:
$api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { # ------------------------------------App 路由--------------------------------------------- $api->group(['namespace' => 'App\Http\Controllers\Api', 'prefix' => 'api'], function ($api) { $api->group(['middleware' => 'api_session'], function ($api) { #-----------------------Message------------------------- $api->get('msg/lists', 'MessageController@msgLists'); } } }
原因:没有通过——>
middleware
中间件的检验(经我查看,该处api_session
,对应ApiSessionMiddleware
和CheckSessionMiddleware
两个值。)————>不能通过检验的原因,就是跳过了login
的步骤而丢失了Session
。解决方法:————>直接写在
$api->version('v1', function ($api) { }
的外面。如同下面形式:
<?php …………………… Route::get('msg/lists', 'Api\MessageController@msgLists'); …………………… ?>
6.注意某些 接口 前面的 /api/
前缀。
7.注意Dingo框架和Laravel框架,重名的 response()
方法。形式如下:
//Dingo框架的方法
return $this->response()->collection($collection);
//Laravel框架的方法
return response()->json(['data'=>'数据在此','message'=>'一切Okay','status_code'=>'200']);
8.最后得到初步完成的接口如下:
//已在Controller子类的里面
public function msgLists(Request $request)
{
//echo 6666666;
$msg_id = $request->get("msg_id");
if (!empty($msg_id)) {
return response()->json([
'data' => "data is here , msg_id is $msg_id",
'message' => 'EveryThing is Okay',
'status_code' => '200']);
} else {
'data' => 'null',
'message' => 'haven\' received msg_id',
'status_code' => '205']);
}
}
而且结果也是显示正确的。
9.Laravel常见的response()返回的方法有如下几种:
Laravel里的HTTP Responses
response() -> view() //视图
response() -> json() //JSON数据
response() -> view() //
return "Hello World" //直接返回字符串
return [1,2,3,4] //直接返回数组
response() -> download($download_file) //将下载文件,以二进制流的形式,返回给客户端
response() -> file($file) //传输一个文件的二进制流
5.Laravel中,标准的数据库操作
参考资料(标准的数据库操作)
Laravel数据库操作的三种方式
Laravel ORM 数据model操作
参考资料(时间戳的建立)
标准用法——Laravel Eloquent 模型中使用时间戳
原生PHP的DateTime类——解析
①Laravel里 Model子类
的常见操作:
Message::where( '查询键' , '查询值' ) -> get() -> first()
//where,是查询语句
//get,是获取查询到的结果集(是一个列表形式,不管数目是大于1,等于1,还是0)
//first,取到结果集中的第一个,作为一个 $message 对象返回。
Message::create( [ '列1' =>'对应值1' ,
'列2' =>'对应值2' ,
'列3' =>'对应值3' ,
'列4' =>'对应值4' ,
'列5' =>'对应值5'
] )
//create,往表中添加一条数据。
//另外,建议先手动把 表table 建立好,不要在Laravel中代码建表,那样会把你绕晕。
//其它参考操作
//根据数据表中排列顺序,查找单条数据
User::find(1)
//查找所有数据
User::all()
//先按照数据表顺序,找到单条数据,然后删除单条数据
User::find(1)->delete()
//按照数据表顺序,删除单条或多条数据
User::destory(array(1,2,3))
//取第一条数据
User::first()
//指定查询条件(条件键;比较符号;条件值)。然后更新数据(要更新的键;要更新的值)
Album::where('artist', '=', 'Matt Nathanson') ->update(array('artist' => 'Dayle Rees'));
//清空数据表,危险操作!!!
//User::truncate()
//配合查询条件(条件键;比较符号;条件值)。然后得到查询到的数据,并显示指定的那几列的数据信息。
Album::where('artist', '=', 'Something Corporate')->get(array('id','title'));
//返回数据表中,该字段的第一条记录
Album::pluck('artist');
//返回一整列数据,从上至下,的集合
Album::lists('artist');
//获取查询的sql语句,仅用于搜索条件的单一语句。不能用于,用户带get()之类的连串的带查询结果的查询中。
Album::where('artist', '=', 'Something Corporate')->toSql();
②关于数据库的连接,需要:
修改
/config/database.php
这个Laravel关于数据库的配置文件中的相关关键值。形式如下:
default = 默认条件下,使用的数据库的名字,如 'mysql' 'mysql' => [ 'host' => 存放数据库的主机的IP地址, 'port' => 存放数据库的主机的端口, 'database' => 指定的数据库的名称, 'username' => 登录数据库所需要的用户名, 'password' => 登录数据库所需要的密码, ],
如果你有
.env
文件来全盘配置一些全局属性值,或常量值。那么可以像下面这样写。形式如下:
//在 .env 文件中写这个 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_DATABASE=_my_contest_database //在 database.php中写这个 'default' => env('DB_CONNECTION', 'mysql'), 'mysql' => [ 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), ],
这样的话,将来要改起来就很方便,集中在一个文件里改,就能完美的覆盖了。
③可能会报出错误,大意如下:"在 create 的时候,指定的表中,缺少了一个列名。列名大致上为 updated_at"
。
这个情况的由来,暂不确定。
猜测原因:Laravel会自动插入当前 修改(updated_at)
的时间作为单独一列。
解决方法:为 数据表
单独建立一个新的列,名为 updated_at
,类型为 “TIMESTAMP”,即可。
测试结果:完美运行。
6.一些疑难的解答,关于Laravel和Nginx服务器
之前用的开启服务器的方式
$ php artisan serv
————>之后弄明白了。这是,当你的机器,没有安装任何第三方服务器时,也能(通过这句)开启Laravel框架的内置服务器。
内置服务器的地址url固定为:http://127.0.0.1:8000 和 http://localhost:8000 。
参考资料:blog/README.md at master
如果用 $ php artisan serv
调试的出来,而用 Nginx
调试不出来,那么就该想想,是不是Nginx的问题了。
那么到底是什么问题呢?
尝试解决:
统一设置
APP_URL=http://192.168.43.124
API_DOMAIN=http://192.168.43.124问题到这里暂时告一段落,我有一个完整的新解法,见
《#8.关于Nginx服务器,在Laravel下,路由全部失效,变成404的完全解决方案?》
7.解析 $ php artisan xxx
命令
$ php artisan xxx
在此处,php 是系统的PHP命令;artisan实际上是文件名,是当前目录下 ./artisan
没有后缀名的文件的名字;xxx 代表实际上要执行的artisan文件里的指令。
而实际上,这个 artisan文件
,是Laravel框架里面,在根目录下自带的。就是为了方便用户自由的调取里面的命令。
8.关于Nginx服务器,在Laravel下,路由全部失效,变成404的完全解决方案
(前提:Laravel内置服务器在本地运行,完全成功。而Nginx则路由全部失败。)
这哥们儿查了很多资料,然后解决了这个问题——最终写了这篇文章:
解决在Linux上Nginx中部署Laravel路由404问题(laravel5.2版)
这哥们儿查询的主要资料是:
完全步骤——在阿里云的ECS上部署Laravel项目
其中关键的部分,列举如下形式:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/laravel/public;
# index.php,一定要放在index.html之前,去解析。这样可以使得访问80端口时,直接通过Laravel的入口文件index.php,启动初始化整个框架。(Laravel专属定制。)
index index.php index.html index.htm;
server_name server_domain_or_IP;
location / {
# 最为关键的是这一句。↓ ↓ ↓ ↓ ↓
try_files $uri $uri/ /index.php?$query_string;
}
}
以上的 try_files $uri $uri/ /index.php?$query_string;
的重要性不用多说。非常重要的关键一句。其中有一条花边,介绍如下:
为什么要写 $uri 和 $uri/ 两个, 不是 $uri 就够了吗?
答案如下:
php -S 有一个致命问题就是路由中的 'home' 必须写成 '/home' 才能工作。
所以,为了修正这个Bug,必须要依次尝试:
$uri , $uri/
以此,实现在遇到这个Bug时,能往后走经过修复的 $uri/
参考文献:
【SegmentFault问答:Laravel路由挂掉的原因之一】
https://segmentfault.com/q/1010000002422408
9.请小组长检查代码,一些已成文的书写规范
数据表中,单个查询的规范:
我的写法:
//$msg = Message::where("msg_id", $msg_id)->get()->first();
规范的写法:
$msg = Message::find($msg_id);
注意——>此处 find( $id )查询的是 数据表的 主键。
数据表中,全部查询的规范:
$msgs = Message::all();
【推荐】复式查询(可兼容单个查询)的规范:
//参见 /Controllers/Admin/AdminController
public function index(Request $request)
{
$perPage = 20 ; //分页的配置:一页20个数据。
$books = Book::select('*');
if( $request -> has ( 'book_name' ) ){
$books = $books -> where(
'book_name' ,
'like' ,
'%'.$request->get('booke_name').'%' )
}
if( $request -> has ( 'price' ) ){
$books = $books -> where(
'price' ,
'like' ,
'%'.$request->get('price').'%' )
}
if( $request -> has ( 'isbn' ) ){ //International Standard Book Number
$books = $books -> where(
'isbn' ,
'like' ,
'%'.$request->get('isbn').'%' )
}
if( $request -> has ( 'quantity' ) ){
$books = $books -> where(
'quantity' ,
'like' ,
'%'.$request->get('quantity').'%' )
}
// 先根据 '创建时间' 从大到小倒叙排序。再根据 '一页数据个数' 进行分页显示(Laravel框架自动完成)。
$books = $books -> orderBy ( 'created_at' , 'DESC' ) -> paginate ( $perPage ) ;
if( $books -> isEmpty() ){
return \Response::json([
'message' => 'no more data' ,
'status_code' => '204'
])
} else {
return app( Factory::class ) -> paginator (
$books ,
new BookTransformer() ,
[ ],
function ( $resource , $fractal ) {
$fractal -> setSerializer ( new CustomSerializer() );
}
)
}
}
常见的数据表格,建立规范
我的写法:
主键——> msg_id
规范的写法:
主键,统一命名为 ——> id
同时,要注意:
主键,一般设置为,【自增】【非空】【主键】三个属性
我的写法:
消息标题,消息内容,消息摘要 设置为 ——> text类型
规范的写法:
↓
因为 text 耗用的资源过长(超长字符串),所以:
我们统一用 varchar(位数) 来代替 text(超长字符串)
↓
消息标题,消息内容,消息摘要 分别设置为 varchar( 150 ) , varchar( 255 ) , varchar( 100 )
我的写法:
msg_type(消息类型),read_status(是否已读) 设置为 ——> int(2)
规范的写法:
如果整数型数据的范围,特别小,比如 0-255 之间,那么我们用 tinyint(位数)
↓
msg_type ,read_status ——> tinyint( 1 )
我的写法:
user_id(编号) 设置为 ——> int(5)
规范的写法:
用户编号的长短,由用户的总数数量决定。一般会给的大一点,以留有充足的余地。比如10位(涵盖了世界上70亿人)
↓
user_id ——> int( 10 )
除此之外,还有一些日常的提升性能和节省时间的小技巧:
1.unsigned,在只有正数时,(同等长度下)可以表示比signed多1倍的数值范围。
如: signed ——> -x 到 +x , unsigned ——> 0 到 +2x
2.把不会为空的数据列,设置为 'not null',可以节省一次数据库的对空判断。这样可以适量的提升数据库的访问性能。
对于 联表( join )
的理解:
>
10.请小组长检查代码,一些具体代码的审查
①lists查询,需修改的问题
id
,msg_type
,read_status
,user_id
(主键id、消息类型、是否已读、用户id),这些值,不必像以前那样
//两侧用 "%" 进行包裹,说明被包裹的 'id' 前后,可以有任意字符————【模糊查询】 $msgs = $msgs->where('id', 'like', '%' . $request->get( 'id' ) . '%' );
此处的典型规范是:
精准的连续值,或者在枚举范围内的值。需要用=
号,来进行连接——【精确查询】。
②在 add( )
添加方法中
在从
$request
取数据时, $id (信息的id) 不需要用户传。自动在这条数据插入数据库时,生成 id (可增长主键)。
在
create( )
创建时,
$id 不用手动创, $created_at 不用手动创,
$read_status 有(在数据表的)默认值,不用手动创,
$msg_type 需要用户手动传过来,添上去(在create时,也采用用户传过来的该值)。
③超牛的一种快速create( )
方法(规范)
示例规范:
$attributes = $request( )->all( );
$msg = Message::create( $attributes );
//机制,就是通过 Message 的 $fillable 成员变量,构成了一张过滤网,将 $attributes多余于$fillable 的变量全部扔出去。
//留下来的,就放入 Message::create( )里面去。
//然后,创建一条数据时。多余的变量已过滤,没写到的变量填为初始值,已写的变量进入建表过程。
//完成快速通过 create( )创建一张表。
④自己帮自己发现了一些 bug
的修复
Message类中,写入了
$id
$created_at
$read_status
$updated_at
,这些自动生成,或者会有强制默认初始值的 数据库的列名。
把这些键值移出 $fillable !:目的是,让用户手动设置的这些同名值,无法进入建表结构,无法干扰正常的自动生成的序列。
11.次日早上,小组长的检查
评价:“没有打错,写的很好了”
小组长给出了两点优化意见:
1.复式查询,可以单独封装到Eloquent里面去。参数:$request
返回值:$msg
2.返回Response时。可以不再使用原版的Laravel指令,练手。而是用Dingo框架中已经封好的四组指令 Item
—— Array
—— Pagination
—— Empty
本地 从草稿到成型
的代码规范,到此,就可以算OK,暂时画上一个完结号。
小组长,还交代了,常规的线上合并代码的规范方法:
1.本地刚拿到线上代码时,先复制出一个分支。命名为 本地名-branch
,专门用于本地摸索开发。
2.本地名-branch
,可以随时在写的过程中,commit,进行本地保存。
3.最后,要上线时,push
到线上的服务器。代码交由小组长试用,审查。
4.若试用成功,则该 原本地分支
,将由小组长执行与 线上分支
的 合并(Merge)
,进而成为 master
分支的正式一部分。
13.一个极细的帮助你反省 Model::create()
机制的小Bug
情景描述:
首先调用, /msg/add 接口,
参数为:
title : "使徒行者2里面的长兴老大用的是一个黑莓老款,不知道什..._百度贴吧"
content : "使徒行者2里面的长兴老大用的是一个黑莓老款,不知道什么型号, 只看楼主 收藏 回复Carrie茶 备份达人 6 使徒行者2里面的长兴...tieba.baidu.com/p/5353... - 百度快照"
msg_type : 7
user_id : 101
返回结果为:
{
"message": "success",
"status_code": 200,
"data": {
"id": 1009,
"created_at": "2017-10-26 14:36:15",
"title": "使徒行者2里面的长兴老大用的是一个黑莓老款,不知道什..._百度贴吧",
"content": "使徒行者2里面的长兴老大用的是一个黑莓老款,不知道什么型号, 只看楼主 收藏 回复Carrie茶 备份达人 6 使徒行者2里面的长兴...tieba.baidu.com/p/5353... - 百度快照",
"msg_type": "7",
"short_describe": "使徒行者2里面的长兴老大用的是一个黑莓老... ...",
"read_status": "",
"user_id": "101",
"updated_at": "2017-10-26 14:36:15"
}
}
然后调用, /msg/lists 接口,
参数为:
id : 1006
title : (没有)
content : (没有)
msg_type : (没有)
short_describe : (没有)
read_status : (没有)
user_id : (没有)
返回结果为:
{
"id": 1006,
"created_at": "2017-10-26 11:54:51",
"title": "使徒行者2里面的长兴老大用的是一个黑莓老款,不知道什..._百度贴吧",
"content": "使徒行者2里面的长兴老大用的是一个黑莓老款,不知道什么型号, 只看楼主 收藏 回复Carrie茶 备份达人 6 使徒行者2里面的长兴...tieba.baidu.com/p/5353... - 百度快照",
"msg_type": 7,
"short_describe": "使徒行者2里面的长兴老大用的是一个黑莓老... ...",
"read_status": 0,
"user_id": 101,
"updated_at": "2017-10-26 11:54:51"
}
看到没?问题就出在:
/msg/add 返回中, “read_status” 为 “”
/msg/lists 返回中, “read_status” 为 0
问题详细剖析,
在小组长的一语道破天机之下,我们经过了这样的过程:
Model::create() ——> compiled.php的create() ——> $model = new static ($attributes)
——> __construct()
——> $this->fill( $attributes )
——> $model -> save()
可以反复打log dd( $object )
,来调试变化了哪些信息
我们可以看到:
在save( )内部,
实现了,
1.新建query语句 newQueryWithoutScopes( ) 方法
2.查找 ‘saving’ 事件(???) fireModelEvent( ) 方法
3.执行更新或插入语句 performUpdate( ) 和 performInsert( )
4.还有不太清楚的 finishSave( ) 方法
整体而言,如下的操作按顺序执行了:
1.新建一个 new static类。(静态版的self类。类似于Android的 MainActivity.this)
2.同时调用 new static类的 __construct() 构造方法。
3.用fill()方法,将 $attributes 填入 $fillable 。过滤$atrributes,生成$final_attributes。
4.进入save()方法。
5.生成基础query语句。
6.生成created_at和updated_at时间戳。放入$final_attributes。
7.生成主键的自增id。放入$final_attributes。
8.将其它的$fillable的键值对,放入query语句。放入$final_attributes。
9.用$final_attributes,进行最后的 insert插入 操作。
10.完成插入后,返回 $final_attributes的Json形式。
综上所述,再来分析一下直接的成因:
一、Message::make 并不是返回的数据库里查询的结果。只是 attributes经过反复拼装的结果。比如这里的情况,就是返回的‘ msg` 只有8个属性,少了 $read_status 这个属性。
二、可以将 add接口返回的结果(经过 MessageTransfomer()的结果),和 lists接口返回的结果(经过数据库查询的结果),看作是 同一个$attributes
经过两种操作后的两种分支。
三、Tranformer的代码如下:
public function transformData($model) { //dd($model); return [ 'id' => $model->id, 'created_at' => $model->created_at->toDateTimeString(), 'title' => $model->title, 'content' => $model->content, 'msg_type' => $model->msg_type, 'short_describe' => $model->short_describe, 'read_status' => $model->read_status, 'user_id' => $model->user_id, 'updated_at' => $model->updated_at->toDateTimeString(), ]; }
四、可见,问题的根本是,
$attributes
里面,根本没有$read_status
这个属性。对于这个没有设定的属性,Transformer
将其设定为 默认值""
(空字符串)。MySQL Database
将其设定为 建表预设的默认值0
(整数0)
至此,#13问题
成功解决。
14.从零开始,迁移 “TODO项目” 到Laravel
前提条件:所处环境,为Windows 10下。
1.$ php composer.phar create-project --prefer-dist laravel/laravel your_dir
第一步,从GitHub上,安装了 Laravel的空白项目。
2.$ cd your_dir
第二步,进入到刚刚的空白项目。
3.$ php "../composer.phar" install
第三步,因为我用的是单文件版的 composer
,所以使用了 ../composer.phar
这个文件路径。
这一步的意思,是按照 同级文件夹下的 composer.json
,来进行依赖包的安装。
4.修改 Nginx的配置文件,使 root 属性,指向刚刚创建的 空白项目目录 的/public
文件夹
5.将所有的,用作网页显示的 php文件,拷贝至 /resources/views/
文件夹下。当然,你可以在该文件夹下,新开子文件夹,进行分类展示。
如果 /resources/views/
下有子文件夹的话,在 routes
路由中调用时,需要用 . (点)
来充当连接分隔符。
如 " (views)todo.home(.php) (括号里的只是注释说明。) "
6.将所有的 css
、 js
文件,全部放入 \public
文件夹下。这样可以很方便的给别的 php文件引用。
7.路由文件,设置在 \routes
文件夹下,推荐大多数情况下,采用 web.php
进行配置,少数情况下,再用 api.php
进行配置。
8.遇到了可怕的 403 Forbidden 错误。血一般的教训告诉我们, “路由的名称”
千万不要和 “/public/”
文件夹下的目录或文件 同名。不然你会在无声无息中被Bug杀死。
比如:建立了一个 "todo"
的路由,又建立了一个 "\public\todo\"
目录,出现了 403 Forbidden 。
9.
—
—————————————————————————————
—————————————————
—————————————————————————————
———————————————————————————
—————————————————————————————
———————————————————————————
———————————————————>这里,就是,怎么获取 /storage
下面的路径。storage_path()方法。
10.
多个网页,多个路由。
11.
用js跳转路由。
12.特定的路径,用 DIRECTORY_SEPERATOR 连接。
13.路由get请求里带参数。
14.get的路由url怎么传参?
15.view怎么带参数?view怎么取参数?
16.get带参数路由,和get不带参数路由,是两种吗?