PHP正式开发第1日

1 篇文章 0 订阅
1 篇文章 0 订阅

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 某某数据Modelextends 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 ,对应 ApiSessionMiddlewareCheckSessionMiddleware两个值。)————>不能通过检验的原因,就是跳过了 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:8000http://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_attributes4.进入save()方法。
5.生成基础query语句。
6.生成created_at和updated_at时间戳。放入$final_attributes7.生成主键的自增id。放入$final_attributes8.将其它的$fillable的键值对,放入query语句。放入$final_attributes9.$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.将所有的 cssjs 文件,全部放入 \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不带参数路由,是两种吗?

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值