Laravel 打造一个完整的项目

搭建简书

   开发过程:
      1、数据库迁移
      2、数据填充
      3、模型关联建立
      4、elasticsearch全文检索引擎服务搭建使用
      5、基于数据库的异步队列操作
      6、如何设计表格更符合laravel的默认约定
      7、如何理解laravel的依赖注入容器等思想
      8、如何设计权限管理系统
      9、如何使用laravel控制用户权限

   前台模块
      文章模块、用户模块、评论模块、赞模块、搜索模块、个人中心模块
   后台模块
      后台架构、管理人员模块、审核模块、权限模块、专题模块、系统通知模块

   使用laravel的功能
   一、路由

   二、控制器

   三、模型

   四、表单验证

   五、blade模板

   六、文件存储

   七、分页

   八、数据库迁移

   九、数据填充

   十、容器

   十一、服务提供者

   十二、门脸类

   十三、用户认证

   十四、用户授权

   十五、scout全文搜索

   十六、Elasticsearch搜索引擎

   十七、模型关联

   十八、Artisan命令

   十九、adminlte的后台模板

   二十、jQuery

   二十一、bootstrap

   二十二、队列

 



laravel的介绍(5.4)

   Laravel的特性
      优雅:多种设计模式(依赖注入、门帘等思想)
      简介:复杂的逻辑已经封装好了
      工程化:框架较重 但是编写的代码风格样式都是差不多的

   Laravel的历史和版本
      2011年出现laravel1.0版本出现
      2015年LTS版本 long time support
      需要注意的是 4.1~5.0 的版本有较大的变化,主要在路由文件结构等方面
               5.0~5.4 中 5.2 的版本变化比较大(文件夹及结构)
               5.4版本及之后的才有搜索的功能

   Laravel的社区生态
      官网:       https://laravel.com
      中文社区:  https://laravel-china.org           (建议使用)
      5.4中文文档    https://laravel-china.org/docs/laravel/5.4
      Laravel源码地址 https://github.com/laravel/laravel

   Laravel的优势
      Laravel 包含的功能更为丰富
         队列(redis,beanstalk,失败延时重启等)、搜索、数据库迁移、定时脚本

      Laravel 使用了丰富的第三方类包
         composer管理、数据填充包: https://github.com/fzaninotto/Faker

      Laravel 的思想更为先进
         服务容器、不同的环境下不同的服务提供者 =》比如缓存服务

      Laravel 的社区更为丰富
         国际化、基于laravel的开源项目多、开源



安装


安装环境要求
   PHP版本 》= 5.6.4
   相关扩展
   MySQL

采用composer安装laravel
   composer create-project laravel/laravel laravel54 "5.4.*"
            创建项目      github中的此目录 下载后的名称 下载其中的分支

启动laravel
   方式一是配置webserve需看官网的文档
   方式二 php artisan serve    /    php artisan help serve(可以设置端口 模式等)

Laravel目录结构介绍
   文件夹介绍
      app       逻辑代码
      config    配置文件
      database   数据库管理
      public    对外资源
      resource   视图等资源文件
      storage       日志文件(在配置时需要有读写的权限)
      tests     测试用例
      vendor    第三方类包

修改.env数据库配置文件
   首先使用.env的好处是可以在使用版本库的时候 可以有效的避免关键数据秘钥的泄露 可以有效的规避.evn文件
   所在位置/laravel54/config/databases.php > 'default' => env('DB_CONNECTION', 'mysql'),
   env(方法如果存在读取.env中的数据 , 如果不存在读取配置文件下mysql的值)

   .gitignore 文件在上传时 避免将.env数据存储且上传

   在.env文件修改好了数据库的信息之后 需要测试是否成立 所以在项目命令行中输入 php antisan 里面有创建表的命令
      migrate : 表示用来做数据迁移的
      migrate:install      Create the migration repository 

   结果
   GoogoldeMBP:laravel54 googol$ php artisan migrate:install
   Migration table created successfully.

   创建成功

 



一、项目模块相关的介绍


   文章模块
      路由
         1.路由         文章路由:文章列表、添加文章、编辑文章、删除文章、文章详情
            laravel路由的几种形式                 增量更新资源  查询资源支持哪些方法
               1.http 方法  Route::get/post/put/patch/delete/options($url , $callback);
               2.路由参数    Route::get('user/{id}', function ($id){ return 'User'.$id; })
               3.路由分组    路由分组是将路由中多次出现的访问标识进行一个分组 默认会访问组名(标识)
                  Route::group(['prefix' => 'posts'],function(){
                     Route::get('/{id}',)
                  })
               4.绑定模型    将路由绑定给模型 直接去找模型的方法 可以减少代码
                  Route::get('api/users/{user}',function(App\User $user){
                     return $user->email;
                  })

               支持所有的路由 可以Route::any
               支持get与post 可以Route::match(['get','post'],);
               注意:因为form表达只支持get post 如果想做修改 需要将 from action='post' 内
                  input name="_method" value="PUT" 就能访问到Route为put 等价于 {{method_filed("PUT")}}

               路由地址 routes/web.php
               路由写法 Route::get('/posts','\App\Http\Controllers\PostController@index');
                              url访问     [控制器需要带命名空间]@[行为]

         2.命令行创建控制器的便捷方法
            cd /laravel/..php artisan..有..make controller
            php artisan help make:controller..可以查看关于make controller的相关说明
            localhost:laravel54 googol$ php artisan make:controller PostController 创建控制器

         3.文章模板的页面渲染
            return view('视图文件夹/模块名',第二个参数是数据值array类型);
               第二个传至也可以是compact

         4.模板
             将样式文件都放置在public中  样式中只需要添加 '/'
            使用的是blade模板
            模板语法{{}}      @if @endif    @foreach $endforeach
            参数传递 //$posts[] $arr[]   compact('posts','arr');
            继承模型 extension/ section/ yield/ content
            引入视图 include

            文章模块的页面模板调整(使用继承)
                    找到页面模板公共的部分
                    创建views/layout/main.blode.php写入公共的视图文件 将非公共的区域使用 yield('这里的字符串将会引入活动的页面')
                    在正式的页面需要将公共的内容剥离 只留下动态的数据页面 在顶部写入
                        @extends("layuot.main")
                        用
                        @section("content")    活动页面    @endsection 结构 就可以使用公共的页面 提高了代码的复用率

      表设计
         1.表设计
             使用migration创建posts数据表
             laravel中建议表名及先关的字段都遵守建议的标准名称
                 比如:posts 表名、 user_id 外键、 created_at / updated_at 创建与修改字段
             创建命令使用如下
                 localhost:laravel54 googol$ php artisan help make:migration
                    localhost:laravel54 googol$ php artisan make:migration create_posts_table
                        create_posts_table 是创建 posts 表的格式
                        执行是 php artisan migration
                        回滚是 php artisan migrate:rollback

                    localhost:laravel54 googol$ php artisan migrate
                        5.4唯一出现的问题
                       In Connection.php line 647:
                         SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key lengt
                         h is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

                       In Connection.php line 449:
                         SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key lengt
                         h is 767 bytes

                    解决办法
                        在 app/Providers/AppServicePriders.php 中的 boot方法是在ServicePrider启动之后    register 是在启动之前
                        public function boot()
                        {
                            //mb4string 类型 每个占位4bytes; 767/4
                            Schema::defaultStringLength(191);
                        }
                    输入 localhost:laravel54 googol$ php artisan migrate     就可生成数据表
         2.模型
             使用ORM创建文章模块模型
             ORM
                 什么是ORM是一个class对应一个表 使用这个类完成对于数据库的操作
             创建posts的模型
                 模型放置的位置 /app/Http/
                 如果表与模型名称不一,需要定义 protected $table = "表名定义";
             tinker 的使用
                 tinker是一款和应用程序的插件
                 启动  localhost:laravel54 googol$ php artisan tinker      显示的是shell脚本
                    在创建完成模型之后检测模型中的方法 可以使用tinker 无需再让控制器去调用
                    写法
                       Psy Shell v0.9.6 (PHP 7.1.7 — cli) by Justin Hileman
                       >>> $post = new \App\Posts();
                       => App\Posts {#2806}
                       >>> $post->title = "this is post1";
                       => "this is post1"
                       >>> $post->content = 'this is content1';
                       => "this is content1"
                       >>> $post->save();
                       => true                  《== 查看数据库 是否有值

                    问题:在创建之后 这里会有一个时区的问题(默认是英国的时区 需要将其设置为中国的时区 设置办法如下)
                        /config/app.php  》 'timezone' => 'UTC', 等价于原生的 date_default_timezone_set
                        设置为 Asia/Shanghai; 最后需要将tinker关闭 重启 方可修改时区信息

                Tinker的基本的增删改查
                    增:
                        >>> $post = new \App\Posts();
                        => App\Posts {#2806}
                        >>> $post->title = "this is post1";
                        => "this is post1"
                        >>> $post->content = 'this is content1';
                        => "this is content1"
                        >>> $post->save();
                        => true

                    删:
                        >>> $post = \App\Posts::find(3);
                        => App\Posts {#2801
                             id: 3,
                             title: "this is post1",
                             content: "this is content1",
                             user_id: 0,
                             created_at: "2018-07-24 23:05:04",
                             updated_at: "2018-07-24 23:05:04",
                           }
                        >>> $post->delete();
                        => true

                    改:
                        >>> $post = \App\Posts::find(2);
                        => App\Posts {#2812
                             id: 2,
                             title: "this is post1",
                             content: "this is content1",
                             user_id: 0,
                             created_at: "2018-07-24 15:04:21",
                             updated_at: "2018-07-24 15:04:21",
                           }
                        >>> $post->title = '修改数据';
                        => "修改数据"
                        >>> $post->save();
                        => true

                    查:
                        >>> \App\Posts::find(2);
                        => App\Posts {#2809
                             id: 2,
                             title: "this is post1",
                             content: "this is content1",
                             user_id: 0,
                             created_at: "2018-07-24 15:04:21",
                             updated_at: "2018-07-24 15:04:21",
                           }

                        >>> \App\Posts::where('title','this is post1')->first();
                        => App\Posts {#2799
                             id: 1,
                             title: "this is post1",
                             content: "this is content1",
                             user_id: 0,
                             created_at: "2018-07-24 14:57:40",
                             updated_at: "2018-07-24 14:57:40",
                           }

                        >>> \App\Posts::where('title','this is post1')->get();
                        => Illuminate\Database\Eloquent\Collection {#2811
                             all: [
                               App\Posts {#2801
                                 id: 1,
                                 title: "this is post1",
                                 content: "this is content1",
                                 user_id: 0,
                                 created_at: "2018-07-24 14:57:40",
                                 updated_at: "2018-07-24 14:57:40",
                               },
                                   ..... 省略 .....
                             ],
                           }
                        >>>

 

      页面逻辑
         1.文章列表 + 添加文章 + 编辑文章 + 删除文章

             逻辑实现
                 模型查找
                        $posts = Posts::orderBy('created_at','desc')->get();
                 页面渲染
                        return view('post/index',compact('posts'));
                 时间格式
                     将 2018-07-24 15:04:21 转换为 Jul 24, 2018 以下是转换方式
                     \\{{$value->created_at}} 是一个对象,显示的时间不是正确时区的时间
                        https://carbon.nesbot.com/docs/
                        Carbon类继承自PHP DateTime类。
                 数据填充
                        https://github.com/fzaninotto/Faker
                        填充的实现流程
                            1. 在 database/factories/ModelFactory.php 工厂中设置
                                $factory->define(App\Posts::class, function (Faker\Generator $faker){
                                    return [
                                        'title' => $faker->sentence(6),     // 长度
                                        'content'=>$faker->paragraph(10),  // 10个句子
                                    ];
                                });

                                https://github.com/fzaninotto/Faker 中找方法
                                需要注意的是 每次修改完文本文件内容 必须重新启动 tinker

                            2. 生成 + 入库
                                >>> factory(App\Posts::class, 10)->make();  // 生成
                                >>> factory(App\Posts::class, 20)->create();// 入库

                 字符截断 + 分页
                        $posts = Posts::orderBy('created_at','desc')->paginate(6); 分页控制器
                        {{$posts->link()}}       // 前端显示页码

                        字符截断:对于页面内容显示过长 可以 {{str_limit($values->content,长度,'超过长度显示的内容')}}

         5.文章详情
                使用的是模型绑定
                    Route::get('/posts/{post}','\App\Http\Controllers\PostController@show');

                详情页面 只需要在 function(post $post){ return view('post/show',compact('posts'));  }
 

 

你可能感兴趣的:(PHP框架)