Laravel 打造一个完整的项目

搭建简书

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

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

   使用laravel的功能
   一、路由

   二、控制器

   三、模型

   四、表单验证

   五、blade模板

   六、文件存储

   七、分页

   八、数据库迁移

   九、数据填充

扫描二维码关注公众号,回复: 4673220 查看本文章

   十、容器

   十一、服务提供者

   十二、门脸类

   十三、用户认证

   十四、用户授权

   十五、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'));  }
 

 

猜你喜欢

转载自blog.csdn.net/jartins/article/details/81195275