1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 2.1 2.2 目錄 0. 介绍 1. php 开发环境安装 2. 跑 laravel 的 hello world 3. 第一个路由 UsersController 4. 在数据库中创建一条数据 5. 简单的用户认证 6. 修改 User model 7. User model 的 getter 方法 8. view 的更多知识 9. 在 view 中共享变量 10. blade layout 11. 使用 @include 来整理 view 12. Blade if/else/unless/or 13. factories, faker and seeding 14. Blade foreach 15. 分页 16. 用中间件来限制用户必须登录 17. Route group 18. CURD 实践之改变用户表结构 19. CURD 实践之为新添加的属性修改注册功能 20. CURD 实践之用 username 来代替 email 登录 21. CURD 个人中心页面 其他 VIM 的 laravel 插件 VIM 中有效地查看 php 源码 1 2 Ruby 程序员学习 laravel 框架笔记 本教程是从 ruby 的视脚来学习 laravel 这个神奇的 php 框架,适用于 ruby 程序员 和 php 程序员浏览。 写这本教程我使用的 laravel 版本是 5.4,新的版本也应该能适用。 原文发布于我的个人博客:https://www.rails365.net 源码位于:https://github.com/yinsigan/laravel_tutorial 笔记项目的源码:https://github.com/yinsigan/laravel-blog 电子版: PDF Mobi ePbu 联系我: email: hfpp2012@gmail.com qq: 903279182 欢迎关注我的个人订阅号: 0. 介绍 3 0. 介绍 4 我是一名 ruby on rails 程序员,想学习一下 laravel 这个 php 的 web mvc 框 架。 我手头上有一台 macbook。 我现在把这个学习过程记录下来。 首先是安装环境,要先使用 laravel 框架之前,必须要先安装 php 的开发环境。 1. 安装 php 安装的 php 版本最好就是 7 以上吧,我是用 homebrew 来安装的。 你可以用以下的命令来搜索一下可以安装的 php 版本。 brew search php 最后我用下面这条命令来安装 php71。 brew install homebrew/php/php71 2. 安装 composer composer 是 php 界用来管理包的,相当于 ruby 中的 gem。 在 mac 下安装 composer 也蛮简单的,只要一条命令即可。 brew install composer 如果不是在 mac 下安装,那应该要到 composer 的官网去下载 composer 的可执行 文件,然后放到 $PATH 中。 https://getcomposer.org/download/ 1. php 开发环境安装 5 我之前在服务器上就是这么做的,因为由于网速等原因下载下来好慢,我就把 composer 的可执行文件用浏览器下载完,然后 scp 到服务器中。 sudo mv composer.phar /usr/local/bin/composer sudo chmod u+x /usr/local/bin/composer 3. 配置 composer 中国镜像 这个跟 ruby 的 gem 也是有点像,在国内安装 composer 包也是很慢,所以有了中 国镜像源。 https://pkg.phpcomposer.com/ 使用下面的命令即可。 composer config -g repo.packagist composer https://packagist.php composer.com 这样,整个 php 开发环境搭建完毕。 完结。 1. php 开发环境安装 6 下一篇:Ruby 程序员学习 laravel 框架笔记 (2)-跑 laravel 的 hello world 1. php 开发环境安装 7 2017.08.09 重新整理 上一篇笔记 Ruby 程序员学习 laravel 框架笔记 (1)-php 开发环境安装 讲了关于php 环境的安装,这篇来讲讲如何安装 laravel,并把它的 hello world 跑起来。 我们跟从官方的文档指引一步步来操作。 https://laravel.com/docs/5.4 1. 安装 laravel 一条命令就可以了。 composer global require "laravel/installer" 这样就能成功安装 laravel 框架。 2. 生成项目 然后我们要生成一个全新的项目。 laravel new blog 2. 跑 laravel 的 hello world 8 会在当前目录下生成一个叫 blog 的目录,里面包含了 laravel 项目的基本代码。 3. 启动项目 进入这个前面生成的项目目录。 cd blog 用下面的命令启动该项目。 php artisan serve 2. 跑 laravel 的 hello world 9 这样就可以跑起来了。 程序监听在 8000 端口,用浏览器运行。 至此, hello world 就跑起来了。 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (3)-第一个路由 UsersController 2. 跑 laravel 的 hello world 10 2017.08.09 内容重新修改整理,代码优化 正如上一篇 Ruby 程序员学习 laravel 框架笔记 (2)-跑 laravel 的 hello world 所说的 那样,已经把项目的 hello world 跑起来了,现在我们要改它的首页内容。 很简单,它的内容在项目文件中 resources/views/welcome.blade.php 。 里面是一些静态的 html ,加上一些 php 代码混在一起。 很简单,你打开这个文件,就可以修改它的内容了。 有一个地方定义了这个首页的路由,是这个文件: routes/web.php 内容如下: // routes/web.php [ resource_path('views'), ], 'compiled' => realpath(storage_path('framework/views')), ]; 把 resource_path('views') 的内容输出来就 是 resources/views/welcome.blade.php 这个view文件的绝对路径了。 1. 修改路由 找到 routes/web.php 文件,添加如下内容: 3. 第一个路由 UsersController 12 [ 'first_name' => 'Renato', 'last_name' => 'Hysa' ], '1' => [ 'first_name' => 'Jessica', 'last_name' => 'Alba' ] ]; return $users; }); 然后打开浏览器,输入: http://127.0.0.1:8000/users ,如下图所示 在浏览器中输出了 $users 变量的内容。 3. 第一个路由 UsersController 13 一般来说,我们不会在路由中放太多逻辑,我们应该把这些逻辑放到 controller 中。 2. 使用 php artisan 来创建 controller 像 rails 那样的,我们可以用命令来生成一个 controller,而这个命令就是 php artisan 。 你在终端上输入 php artisan 并回车,可以看到它有很多子命令。 现在我们要使用 make:controller 这个子命令。 php artisan make:controller UsersController 终端上会提示: Controller created successfully. 表示成功创建了 users 这个 controller,文件位于 app/Http/Controllers/UsersController.php 。 它的内容如下: 3. 第一个路由 UsersController 14 // app/Http/Controllers/UsersController.php [ 'first_name' => 'Renato', 'last_name' => 'Hysa' ], '1' => [ 'first_name' => 'Jessica', 'last_name' => 'Alba' ] ]; return $users; } } 就是添加了一个 index action,内容跟之前的一样。 最后,路由要重新指向到这个新创建的 controller 和 action 中,所以要跟着变一 下: // routes/web.php [ 'first_name' => 'Renato', 'last_name' => 'Hysa' ], '1' => [ 'first_name' => 'Jessica', 'last_name' => 'Alba' ] ]; // 这行变了,表示 $users 这个变量会传递到view中 return view('admin.users.index', compact('users')); } } 然后找到 resources/views 目录,再新建一个 admin 目录,再在 admin 目 录下新建 users 目录。 最后新建一个 index.blade.php 文件,位于 resources/views/admin/users/index.blade.php 。 resources/views/admin └── users └── index.blade.php 3. 第一个路由 UsersController 18 它的内容如下:
    @foreach($users as $user)
  • {{ $user['first_name'] }} {{ $user['last_name'] }} @endforeach
最后在浏览器中输入 http://127.0.0.1:8000/users 输出如下: 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (4)-在数据库中创建一条数据 3. 第一个路由 UsersController 19 2017.08.09 代码全部修改,加了动图,重新上传了截图 上一篇文章 Ruby 程序员学习 laravel 框架笔记 (3)-第一个路由 UsersController 我 们讲了如何创建一个 controller,但是在实际应用中,我们通常会把数据存到数据库 中。 这一节我们来聊聊数据库方面的知识。 1. 配置数据库 首先打开 .env 文件。 找到数据库配置的地方改一下,内容如下: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=blog_dev DB_USERNAME=root DB_PASSWORD= DB_CONNECTION 表示你要用 mysql 作为数据库。 DB_HOST 数据库服务器地址,如果是本地,就选择 127.0.0.1 。 DB_DATABASE 这个是你的数据库的名称,你可以事先创建好。 DB_USERNAME 数据库连接的用户名。 DB_PASSWORD 数据库连接的密码。 2. 迁移数据 有了数据库,并且可以连接,还需要表吧。 跟 ruby 一样,laravel 也有 migration 这样的概念,默认还创建了两个,其中有一个 是 users 表。 放 migration 的文件位于: database/migrations 。 4. 在数据库中创建一条数据 20 // database/migrations/2014_10_12_000000_create_users_table.php increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } } 执行迁移的命令如下: 4. 在数据库中创建一条数据 21 php artisan migrate 这样在数据库中就会创建一张表,它的名字叫 users 。 3. 创建路由 往后台填充数据需要表单吧,先来创建路由。 // routes/web.php // 这个csrf是一定要添加的,这个跟rails框架提供的csrf机制类似 {{ csrf_field() }} 最后来添加第二个路由 /users 对应的 action 文件,内容如下: 4. 在数据库中创建一条数据 23 // app/Http/Controllers/UsersController.php all()); return "success"; } } 下面来一张动图演示一下效果: 4. 在数据库中创建一条数据 24 添加成功后,页面上也会输出 "success" 。 同时数据库也会多一行记录,如下: 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (5)-简单的用户认证 4. 在数据库中创建一条数据 25 2017.08.09 updated, 增加了动图,修改文字 上一篇文章 Ruby 程序员学习 laravel 框架笔记 (4)-在数据库中创建一条数据 有讲 过创建一条 user 记录,其实这个相当于注册功能,今天要学习的就是跟这个注册 功能有关。 laravel 神奇的一个地方就是默认集成了登录和注册的功能,只要一条指令就可以启 动,不仅如此,连 view 都给你写好了,也就是说界面都可以不用写,就有登录和 注册的功能。 1. 启用登录注册功能 只要一条指令: php artisan make:auth 我们来查一下路由,看到底产生了些啥功能: php artisan route:list 输出如下: 5. 简单的用户认证 26 +--------+----------+------------------------+------------------ +--------------------------------------------------------------- ---------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+------------------------+------------------ +--------------------------------------------------------------- ---------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLi nkEmail | web,guest | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkReq uestForm | web,guest | | | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetFor m | web,guest | | | GET|HEAD | register | register 5. 简单的用户认证 27 | App\Http\Controllers\Auth\RegisterController@showRegistrationF orm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | | | GET|HEAD | users | | App\Http\Controllers\UsersController@index | web | | | POST | users | | App\Http\Controllers\UsersController@store | web | | | GET|HEAD | users/create | | App\Http\Controllers\UsersController@create | web | +--------+----------+------------------------+------------------ +--------------------------------------------------------------- ---------+--------------+ 2. 展示功能 现在我们来验证一下这些功能。 打开浏览器,输入 http://127.0.0.1/login 。 页面是这样子的: 页面还不错。 注册页面也有: 5. 简单的用户认证 28 注册完会自动登录,登录后的页面如下: 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (6)-修改 User model 5. 简单的用户认证 29 2017.08.09 重新修改,加了动图,修改代码 本篇所讲的知识的官方文档在于 eloquent-mutators。 上一篇文章 Ruby 程序员学习 laravel 框架笔记 (5)-简单的用户认证讲到了 laravel 本身集成了登录和注册的功能,虽然这个功能已经很不错了,但有时候还是要根据 自己的需求改改。 比如,用户名,我们要改成首字母大写的,比如,用户输入 hfpp2012 ,存到数 据库的时候,我们要自动变成 Hfpp2012 。 现在我们来实现一下。 1. 修改 controller 首字母大写还是很简单的,一个函数即可,就是 ucfirst 。 我们找到注册相关的 controller。 找到 app/Http/Controllers/Auth/RegisterController.php 文件。 把下面的这一段改一下: 6. 修改 User model 30 // app/Http/Controllers/Auth/RegisterController.php $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } ... } ?> 改成 6. 修改 User model 31 // app/Http/Controllers/Auth/RegisterController.php ucfirst($data['name']), 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } ... } ?> 这样就可以了,再去注册一个用户,应该变成了大写的首字母。 查看一下数据库,果然。 6. 修改 User model 32 2. 修改 model 就像 ruby 那样,这种代码我们一般不会放在 controller 中的,我们尽量地保持 controller 小,而 model 胖一些。 所以我们去掉刚才的改动,找到 User 这个 model,即是 app/User.php 这个文 件。 我们加入下面的方法: 6. 修改 User model 33 // app/User.php attributes['name'] = ucfirst($value); } } ?> 你会发现效果一样的。 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (7)-User model 的 getter 方法 6. 修改 User model 34 本篇所讲的知识的官方文档在于 eloquent-mutators。 这一篇内容要讲的跟上一篇 Ruby 程序员学习 laravel 框架笔记 (6)-修改 User model 密切相关。 上一篇我们使用了类似于 User model 的 setter 方法,代码如下: // app/User.php attributes['name'] = ucfirst($value); } } ?> setNameAttribute 就相当于一个 setter 方法,主要是对属性或数据进行修改。 比如上篇文章所讲的把即将要存进数据库的用户名的首字母变成大写,例 如, hfpp2012 变成了 Hfpp2012 。 而这篇要讲的是 getter 方法,就是对数据如何读取进行修饰。比如把读出来的用户 名,所有字母变成大写,而数据库的内容保持不变,例如, Hfpp2012 会变成 HFPP2012 。 这节的内容比较简单,主要就是讲一个 getter 方法,代码如下: 7. User model 的 getter 方法 35 // app/User.php attributes['name'] = ucfirst($value); } // getter方法 public function getNameAttribute($value) { return strtoupper($value); } } ?> 效果如下: 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (8)-view 的更多知识 7. User model 的 getter 方法 36 这一篇,我们来学习更多关于 view 的知识。 1. 判断 view 是否存在 为了方便演示,我们来新建一个全新的 controller。 在终端上运行如下命令: $ php artisan make:controller PagesController 有了 controller,我们先把路由加一下: // routes/web.php [ 'first_name' => 'Renato', 'last_name' => 'Hysa' ], '1' => [ 'first_name' => 'Jessica', 'last_name' => 'Alba' ] ]; // 这行变了,表示 $users 这个变量会传递到view中 return view('admin.users.index', compact('users')); } } 主要是那个 compact 方法,在上面的代码中,它表示能将 $users 这个变量传 递到 admin.users.index 这个 view 中,以后在 admin.users.index 这个 view就可以直接使用这个变量的数据。 现在我们换一个方法来实现向 view 传递变量,而不用 compact 这个函数。 改一下 PagesController 的内容,如下所示: 8. view 的更多知识 40 // app/Http/Controllers/PagesController.php 'Laravel', 'name' => 'Nicole']); else return 'No view available'; } } 看上面的代码,还是用了 view 函数,不过不用 compact 函数了, ['text' => 'Laravel', 'name' => 'Nicole'] 这里表示,要传递两个变量,分别 是 text 和 name 。 我们把这两个变量放到 view 中。 Hello, from index in pages folder.

{!! $text !!}

{{ $text }}

{{ $name }}

页面输出如下: 8. view 的更多知识 41 这里有必要提一下 {{ }} 和 {!! !!} 的区别,正如上面的效果所显示的, {{ }} 是会原样输出一些html标签,也就是会跳脱 html 标签,而这样能避免一些xss 攻击,比较安全,而 {!! !!} 不会,但是有时候又必须用到 {!! !!} ,比如 你要输出一些带格式的html标签,特别是那种富文本框的情况。 3. 另一种向 view 传递数据的方法 最后再介绍另一种向 view 传递数据的方法。 把PagesController改一下: 8. view 的更多知识 42 // app/Http/Controllers/PagesController.php with('text', 'Laravel') ->with('name', 'Nicole'); # return view('pages.index', ['text' => 'Laravel< /b>', 'name' => 'Nicole']); else return 'No view available'; } } 看上面的代码,用了 view 方法,也用了 with 方法,效果是一样的。 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (8)-view 的更多知识 8. view 的更多知识 43 从上一篇文章 Ruby 程序员学习 laravel 框架笔记 (8)-view 的更多知识 应该学会了 在如何传递变量给 view。 这一篇来说个简单的,在各种 view 中共享变量。 编辑 app/Providers/AppServiceProvider.php 文件,它的内容如下: // app/Providers/AppServiceProvider.php

Jumbotron heading

Cras justo odio, dapibus ac facilisis in , egestas eget quam. Fusce dapibus, tellus ac cursus commodo, to rtor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

Sign up today

Subheading

Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.

Subheading

Morbi leo risus, porta ac consectetur ac, vestibu lum at eros. Cras mattis consectetur purus sit amet fermentum.

Subheading

Maecenas sed diam eget risus varius blandit sit a met non magna.

10. blade layout 48

Subheading

Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.

Subheading

Morbi leo risus, porta ac consectetur ac, vestibu lum at eros. Cras mattis consectetur purus sit amet fermentum.

Subheading

Maecenas sed diam eget risus varius blandit sit a met non magna.

@endsection 关键在于第一行 @extends('layouts.master') ,表示会使用 master 这个 layout,我们来创建一下这个文件。 4. 创建 master layout 在 resources/views/layouts 目录下添加一个文件,叫 master.blade.php , 内容如下: @yield('title') 10. blade layout 49
@yield('body')

© Company 2017

再次说一下,到下面这个网址把这两个css文件下载下来(用浏览器的查看源代码功 能)。 http://getbootstrap.com/docs/4.0/examples/narrow-jumbotron/ 下载后这两个文件,都放到 public/css 目录下,目录结构如下: public/css ├── bootstrap.min.css └── narrow-jumbotron.css 5. 重在领悟 上面的各种 view,主要讲到了三个指令,分别是 @extends 、 @yield('body') , @section 。 @extends 简单,主要是在 子view 中用,表示要去使用哪个 layout。 @yield('body') 是在 layout 中用,有点像在埋一个点,等着子 view 来放真正 的内容,而 @section 才是子 view 真正放内容的地方。 如果不理解,多结合上面的例子看看吧,反正我是一下子就理解的。 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (11)-使用 @include 来整理 view 10. blade layout 51 10. blade layout 52 上一篇 Ruby 程序员学习 laravel 框架笔记 (10)-blade layout 有讲到关于 layout 的 知识,这一篇是对上一篇的细化,对上面的代码进行优化整理。 而使用的 view 的指令是 @include 。 回到 resources/views/layouts 目录,找到 layout 文件 master.blade.php ,它的内容我现在就不全列出来了,因为实在太长了,只列 出 body 标签的内容,如下: 11. 使用 @include 来整理 view 53 ...
@yield('body')

© Company 2017

... 现在我们要把这段代码整理一下。 下面请睁大你的眼睛看清楚,以 @yield('body') 这条指令为分割线,分别以它 上面和下面的内容抽成两个文件,也就是说 class 等于 header 这个 div 部分 抽成 menu.blade.php 文件,而 footer 这个标签部分抽成 11. 使用 @include 来整理 view 54 footer.blade.php ,这两个文件都放到 resources/views/layouts 目录 下。 目录结构如下: resources/views/layouts ├── app.blade.php ├── footer.blade.php ├── master.blade.php └── menu.blade.php 最后 resources/views/layouts/menu.blade.php 的内容如下: // resources/views/layouts/menu.blade.php 而 resources/views/layouts/footer.blade.php 的内容如下: 11. 使用 @include 来整理 view 55 // resources/views/layouts/footer.blade.php

© Company {{ date('Y') }}

而在 master layout 如何引用这两个文件呢,很简单,就是使用 @include 指 令。 最终 master.blade.php 的 body 部分的内容会如下面这样: ...
@include('layouts.menu') @yield('body') @include('layouts.footer')
... 效果是一样,但是代码文件被很好地整理了起来,看着也舒服。 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (12)-Blade if/else/unless/or 11. 使用 @include 来整理 view 56 这一节来讲讲 blade 这个 view engine 的一些关于判断的指令。 1. if 首先在 action 加一个变量,找到 app/Http/PagesController.php 文件,修改 其内容如下: // app/Http/PagesController.php

Your gender is @if($gender == 'male') male @elseif($gender == 'female') female @else unknown @endif

...
@endsection 页面上会这么显示: 结合上面的 @if 指令的判断,因为 $gender 的值为 femffffale ,即不是 male ,也不是 female ,所以最后显示 unknown 。 可以分别改成 male 或 female 来试试效果。 12. Blade if/else/unless/or 58 很容易理解。 2. unless unless 其实 !if , if 的相反的意思。 我们来个例子说明一下。 ... @section('body')

...

@unless(empty($text)) {{ $text }} @endunless @if(!empty($text)) {{ $text }} @endif

...
@endsection 最后显示: 12. Blade if/else/unless/or 59 3. isset 和 or isset 是判断变量是否存在。

{{ isset($variableDoesNotExist) ? $variableDoesNotExist : 'Th e variable does not exist' }}

效果如下: 它也可以用 or 来写,结果一样的。 12. Blade if/else/unless/or 60

{{ $variableDoesNotExist or 'This really does not exist' }} 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (13)-factories, faker and seeding 12. Blade if/else/unless/or 61 本来是要来介绍 view 中的 foreach 功能,这个功能需要很多数据,因为是循环 嘛。 所以要先创建好多数据。 在开发环境中,我们经常需要创建一些用于测试的假数据。 如果你是一名 ruby on rails 开发者,可能用过下面这两个 gem 。 https://github.com/stympy/faker https://github.com/ffaker/ffaker 它们就是用来创建假数据的。 比如说,你要创建一百条用户数据,而每个用户名或邮箱是不同的,这个时候,其 实我们用随机的字符串就好了,可是这个叫 faker 的东西,能让我们的用户名更 接近于现实,可读性更强。 在 laravel ,默认就有这样的功能,我们来介绍一下。 找到 database/factories/ModelFactory.php 文件,内容如下: define(App\User::class, function (Faker\Generator $fak er) { static $password; return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => $password ?: $password = bcrypt('secret'), 'remember_token' => str_random(10), ]; }); 代码也不复杂,使用的是 App\User::class 这个 model, $faker->name 表示 随机的用户名,其他的也比较好解释,密码都为 secret 。 怎么引用这个 factory 呢? 13. factories, faker and seeding 62 找到 database/seeds/DatabaseSeeder.php 文件,修改如下: create(); // $this->call(UsersTableSeeder::class); } } 怎么来执行这个 seed 呢? 在终端上输入如下指令: $ php artisan db:seed 执行完之后数据表 users 会多出一百条记录: 试着用任何一个新创建的用户登录试试。 13. factories, faker and seeding 63 登录地址是 http://127.0.0.1:8000/login ,密码是 secret 。 完结。 13. factories, faker and seeding 64 上一篇文章 Ruby 程序员学习 laravel 框架笔记 (13)-factories, faker and seeding, 我们介绍了如何创建 100 条 user 记录,这一节,我们要将这一百条记录显示出 来,而用的就是 foreach 这个 view 的指令。 还记得最早开始介绍 controller 时,有说过一个叫 users 的 controller,如果忘记 了,可以查看这篇文章 Ruby 程序员学习 laravel 框架笔记 (3)-第一个路由 UsersController 现在就来重新利用这个 controller。 找到 app/Http/Controllers/UsersController.php 这个文件,修改其内容, 如下:

    @foreach($users as $user)
  • {{ $user->name }} Joined ({{ $user->created_at->diffFo rHumans() }})
  • @endforeach
@endsection 访问 http://127.0.0.1:8000/users ,效果如下: 完结。 下一篇:Ruby 程序员学习 laravel 框架笔记 (15)-分页 14. Blade foreach 66 14. Blade foreach 67 接着 上一篇 文章的内容,我们现在来对这些显示出来的所有用户记录进行分页, 最终效果会是下面这样: 1. 分页效果 我们来一步步地完成这些效果,首先第一步是分页效果。 Laravel 框架就自带了分页的功能。 很简单,只需要改两个地方,一个是调用数据的地方,即 controller,还有一个就是 要把分页效果改出来,那就是在 view 上改。 先找到 app/Http/Controllers/UsersController.php 这个 controller 文件, 把它修改如下: 15. 分页 68 // app/Http/Controllers/UsersController.php @extends('layouts.app') @section('content')
    @foreach($users as $user) ... @endforeach
{{ $users->links() }}
@endsection {{ $users->links() }} 就是显示分页。 2. 所有记录的总数量 这个很简单,使用 total() 这个方法即可,例如:

{{ $users->total() }} total users

3. 当前页面的用户记录数量 这个可以使用 count() 方法,比如: In this page {{ $users->count() }} users 最终把所有的 view 相关的代码组成起来,就是下面这样: 15. 分页 70 @extends('layouts.app') @section('content')

{{ $users->total() }} total users

In this page {{ $users->count() }} users
    @foreach($users as $user)
  • {{ $user->name }} Joined ({{ $user->created_at->diffFo rHumans() }})
  • @endforeach
{{ $users->links() }}
@endsection 这样就有上面的那个图的效果了。 完结。 15. 分页 71 有时候我们经常会控制一些页面需要登录才能访问,这个功能在 laravel 如何做到 呢? 就是用中间件,只需要四个步骤。 现在我们来演示一下。 1. 生成 middleware 先生成 middleware 文件,使用下面的命令: $ php artisan make:middleware AuthenticatedMiddleware 这样会生成一个文件:'app/Http/Middleware/AuthenticatedMiddleware.php'。 2. 修改 middleware 把这个文件打开,修改如下: // 'app/Http/Middleware/AuthenticatedMiddleware.php' \App\Http\Middleware\AuthenticatedMiddleware: :class 最终效果如下所示: protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, ... 'authenticated' => \App\Http\Middleware\AuthenticatedMiddlew are::class ]; 这里我们定义了中间件的名称为 authenticated 。 4. 使用中间件 最后,我们来使用这个新创建的中间件。 打开路由配置文件 routes/web.php 。 把 Route::get('users', 'UsersController@index'); 修改成下面这样: Route::get('users', 'UsersController@index')->middleware('authen ticated'); 最终的效果是这样:一旦用户访问 /users 就必须要登录,否则就跳到登录页 面。 16. 用中间件来限制用户必须登录 73 效果图如下: 完结。 16. 用中间件来限制用户必须登录 74 上一篇 文章讲到了如何创建中间件,创建完后我们接着使用了这个中间件,是这样 用的: // routes/web.php Route::get('users', 'UsersController@index')->middleware('authen ticated'); 中间件名称为 authenticated ,我们只是在 users controller 中的 index action 用这个中间件。 其实我们也可以在别的地方使用,比如下面这样: Route::get('users', 'UsersController@index')->middleware('authen ticated'); Route::get('profile', 'PagesController@profile')->middleware('au thenticated'); Route::get('settings', 'PagesController@settings')->middleware(' authenticated'); 这样会重复写三次 middleware('authenticated') 。 这一篇我们会讲如何重构这个代码,让它变得更可读一些。 我们使用了 Route group 的功能。 只要将上面的那三行代码改成下面这样就可以了。 Route::group(['middleware' => ['authenticated']], function() { Route::get('users', 'UsersController@index'); Route::get('profile', 'PagesController@profile'); Route::get('settings', 'PagesController@settings'); }); 完结。 17. Route group 75 学了这么多 laravel 的知识,该来实践了,至少要会基本的增删改查吧,接下来的 几篇都会讲解这方面的知识。 之前我们有一个 user 表,现在我们往里面加两个属性,一个是用户名 username ,另一个是出生日期 dob 。 找到创建 user 表的 migration 文 件: database/migrations/2014_10_12_000000_create_users_table.php 。 把它修改如下: // database/migrations/2014_10_12_000000_create_users_table.php increments('id'); ... // 新增下面这两行 $table->string('username', 32); $table->date('dob'); ... $table->timestamps(); }); } public function down() { Schema::dropIfExists('users'); } } 现在我们执行一条命令,把所有表结构重建。 18. CURD 实践之改变用户表结构 76 $ php artisan migrate:refresh 执行完输出的内容大约是这样的: Rolling back: 2017_08_04_132046_create_photos_table Rolled back: 2017_08_04_132046_create_photos_table Rolling back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_100000_create_password_resets_table Rolling back: 2014_10_12_000000_create_users_table Rolled back: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table Migrating: 2017_08_04_132046_create_photos_table Migrated: 2017_08_04_132046_create_photos_table 查看表结构,效果如下: 一般来说,因为这个操作会重新删除所有表的数据,然后会重新跑 migration,所以 这种操作只会在开发环境上用。 完结。 18. CURD 实践之改变用户表结构 77 18. CURD 实践之改变用户表结构 78 之前为 user 表添加了两个属性,分别是 username 和 dob 。 现在我们来试一下注册功能,如下所示: 报错了!,报错的内容如下: SQLSTATE[HY000]: General error: 1364 Field 'username' doesn't ha ve a default value (SQL: insert into `users` (`name`, `email`, `password`, `updated _at`, `created_at`) values (1111, hfpp2012111222@gmail.com11, $2y$10$aJOC/aceiBf3bWh 5iIGejOkNLKXXYatLo4X.KEftiRslsdyfP5mTW, 2017-09-08 03:56:19, 201 7-09-08 03:56:19)) 大体意思是说, username 没有默认值,就是说我们没有给 username 填充 值。 我们分为三步来解决这个问题。 1. 加上 view 先给 username 和 dob 这两个属性在前端上加上可以填写的 view,当用户注册 的时候就可以填写用户名和出生日期。 找到注册的 view 文件: resources/views/auth/register.blade.php 。 19. CURD 实践之为新添加的属性修改注册功能 79 找准位置,加上下面这两段代码:
@if ($errors->has('username')) {{ $errors->first('username') }} @endif
@if ($errors->has('dob')) {{ $errors->first('dob') }} @endif
19. CURD 实践之为新添加的属性修改注册功能 80 2. 更改 controller view 改好了,controller 要接受新的字段,来修改一下。 找到 app/Http/Controllers/Auth/RegisterController.php 文件,打开之 后,找到 create 方法,修改如下: // app/Http/Controllers/Auth/RegisterController.php protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => $data['password'], // 下面两行是新增的 'username' => $data['username'], 'dob' => $data['dob'], ]); } 3. 修改 model 这样还不行,需要修改一下 model, 这个有点像 rails 的 Strong Parameters的 功能。 找到 app/User.php 方法,找到 $fillable 属性,修改如下: protected $fillable = [ // 新增了 username 和 dob 'name', 'email', 'password', 'username', 'dob' ]; 这样数据表 users 就可以存这两个属性了。 最后再试下注册功能,效果如下: 19. CURD 实践之为新添加的属性修改注册功能 81 完结。 19. CURD 实践之为新添加的属性修改注册功能 82 现在的登录页面是这样的: 填上正确的 email 和 密码 就可以登录。 现在我们需要用之前创建的 username 代替 email 来登录。 第一步是先来改 view。 找到登录页面的 view 文件: resources/views/auth/login.blade.php 。 再找到下面这部分:
@if ($errors->has('email')) {{ $errors->first('email') }} @endif
把它改一下,改成下面这样: 20. CURD 实践之用 username 来代替 email 登录 83
@if ($errors->has('username')) {{ $errors->first('username') }} @endif
改了 view 还不够,还要再改一个地方: 第二步,找到 app/Http/Controllers/Auth/LoginController.php 文件,打 开之后,添加下面这个方法: public function username() { return 'username'; } 最终的效果: 20. CURD 实践之用 username 来代替 email 登录 84 20. CURD 实践之用 username 来代替 email 登录 85 这一节我们来学习制作用户个人中心的页面。 以下所有的操作都会应用到之前所学的知识,我们一步步来。 1. 生成 controller 首先,生成显示个人页面的 controller。 $ php artisan make:controller ProfileController 把新生成的 controller 文件的内容修改一下: // app/Http/Controllers/ProfileController.php first(); return view('user.profile', compact('user')); } } 2. 修改 route 第二步,打开路由文件 routes/web.php ,添加下面这一行: Route::get('/profile/{username}', 'ProfileController@profile'); 21. CURD 个人中心页面 86 这里的 username 是可变的,你可以用你的用户名来代替。 3. 修改 view 第三步,把 view 文件 resources/views/user/profile.blade.php 修改一 下,如下所示: @extends('layouts.app') @section('content')

{{ $user->name }}

{{ $user->email }}
{{ $user->dob }}
@endsection 4. 查看效果 最终的效果是下面这样的: 21. CURD 个人中心页面 87 21. CURD 个人中心页面 88 2017.08.09 修改,增加动图和修改文字 这篇文章会来讲下开发工具,如果你的开发工具不是vim,可以略过,这篇文章只 适应于使用vim开发工具的同学。 如果你使用vim开发ruby on rails项目,可能会使用过vim-rails这个插件。 这个插件很好用,让你可以轻易地切换代码,查看特定的代码,比如我要查看各 种 users 这个 controller ,我只需要键入 :Econtroller users ,真的很方 便。 使用vim开发 laravel 项目,也有类似这样的工具。 它就是 vim-laravel。 1. vim-laravel https://github.com/noahfrederick/vim-laravel 安装起来很简单,使用你的vim插件管理器,来安装下面四个插件。 Plug 'tpope/vim-dispatch' Plug 'tpope/vim-projectionist' Plug 'noahfrederick/vim-composer' Plug 'noahfrederick/vim-laravel' 比如我是使用Neobundle来管理插件的,那么: NeoBundle 'tpope/vim-dispatch' NeoBundle 'tpope/vim-projectionist' NeoBundle 'noahfrederick/vim-composer' NeoBundle 'noahfrederick/vim-laravel' 这个工具超级好用,比如要找到一个view,就可以输入 :Eview (中间有个空 格),然后加一个tab键,你会看到各种view,选择一个你要的,或直接键入,比 如 :Eview welcome ,就会自动跳到 resources/view/welcome.blade.php 文 件中。 比如使用 :Eroutes 可以跳到各个路由去。 VIM 的 laravel 插件 89 下面是截图: 具体的命令可以查看vim-laravel的readme文档。 2. vim-blade https://github.com/jwalton512/vim-blade 这个插件是给blade的view文件加上语法格式。这样看起来就舒服多了。 安装方法跟上面的一样: NeoBundle 'jwalton512/vim-blade' 完结。 VIM 的 laravel 插件 90 VIM 的 laravel 插件 91 2017.08.09 updated 在vim中,一般如果用ctags这个命令生成一个叫 ctags 索引文件后,就可以 用 ctrl+] 来查看一些类或方法的源码,就是直接跳转到对应的源码中的定义之 处。 但是如果要有效地查看php的源码,可以使用一个叫phpctags的软件来重新生成更 好的ctags文件。 https://github.com/vim-php/phpctags 首先来安装一下。 brew install phpctags 装好之后在php源码目录下执行: phpctags -R 这样就会生成ctags文件了。 下次你使用 ctrl+] 来查看源码会发现更好用了。 完结。 VIM 中有效地查看 php 源码 92 VIM 中有效地查看 php 源码 93
还剩92页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

nkqhxj

贡献于2017-11-22

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf