Laravel 学习笔记

写在前面

以前学习laravel的时候记录的一些笔记,内容有点多,也有点乱,可能对有些人有用。

主要内容有:服务器搭建,git裸仓库搭建,laravel常用组件,laravel架构组成等。

搭建lamp环境

安装ubuntu14.04 LTS版本

搭建lamp环境:

切换到root:

sudo su

更新源:

apt-get update

安装apache2:

apt-get install apache2

安装php5.5.9:

apt-get install php5

安装mysql:

apt-get install mysql-server mysql-client

安装php对myslq的扩展:

apt-get install php5-mysql

安装laravel需要的加密算法库:

apt-get install mcrypt

安装php加密库:

apt-get install php5-mcrypt

php5的这个加密扩展需要手动修改配置文件才可以使用:

cd /etc/php5/mods-available/   #这个目录是php已经下载的扩展

cd /etc/php5/apache2/conf.d/   #这个目录是php已经加载的扩展(都是软连接)

我们只需要建立个软连接就可以了:

ln -s /etc/php5/mods-available/mcrypt.ini ./

ls  #查看文件,软连接建立成功,扩展就可以用了

重启apache:

apachectl restart

建立phpinfo文件:

cd /var/www/html/  #这是apache的网站根目录

vim info.php

    <?php
        phpinfo();
    ?>

查看服务器IP

ifconfig  (假设为192.168.1.50)

浏览器访问192.168.1.50/info.php

可以看到mcrypt已经加载进去了

安装一些常用的工具:

apt-get install wget      #下载工具 

apt-get install curl  #模拟浏览器

apt-get install openssl 

连接远程服务器

mac电脑用ssh连接:

ssh laravel@192.168.1.50

windowx电脑使用xshell,或者putty连接

composer的安装

下载composer.phar包:
下载地址

上传composer.phar包到服务器:

使用上传工具:

FileZilla

或者mac 终端使用 scp

windows下使用xhsell,  使用rz命令

添加可执行权限:

chmod +x ./composer.phar

每次都要在这个使用很麻烦,添加成全局的就方便了:

 mv composer.phar /bin/composer

验证:

composer -v

更换成国内源:

composer config -g repo.packagist composer https://packagist.phpcomposer.com

安装laravel

全局安装(适用于一个服务器多个laravel项目):

composer global require "laravel/installer"

配置全局环境变量:

cd

vim .profile

最后面写入:

export PATH=$PATH:/root/.config/composer/vendor/bin/

生成laravel项目:

laravel new blog

局部安装(适用于服务器只有一个laravel项目):

composer create-project --prefer-dist laravel/laravel blog

ps:注意虚拟机内存一定要大于1G,不然会报内存不足的错误

修改文件权限:

cd blog

chmod -R 777 storage

本地域名解析和apache虚拟主机配置

修改hosts文件:

mac 在 /etc/hosts

windows 在C:\Windows\System32\drivers\etc\hosts

加入:

192.168.1.50 laravel.demo

配置虚拟主机:

cd /etc/apache2/sites-available

cp 000-default.conf laravel.demo.conf

vim laravel.demo

打开服务器名字配置:

ServerName laravel.demo

建立软连接:

ln -s /etc/apache2/sites-available/laravel.demo.conf ../sites-enabled/

重启服务就可以了:

apachectl restart

git仓库建立与git服务器的搭建

安装git:

apt-get install git

设置你的仓库用户名:

git config --global user.name 'lwt'

git config --global user.email '13521760670@163.com'

初始化git仓库:

cd /var/www/demo

git init

搭建git服务器:

添加用户:
adduser git

克隆裸仓库:
git clone --bare demo demo.git

移动位置:
mv demo.git/ /home/git/

修改权限:
chown -R git:git demo.git/

另一个服务器操作:

生成密钥对(生成位置在当前用户的家目录的.ssh文件里)
ssh-keygen -t rsa

上传公钥到git服务器,这样可以免密码克隆和提交:
cd
cd .ssh
找到 
id_rsa.pub
想办法把这个文件里面的内容弄到git服务器,git用户家目录里面的
.ssh文件夹里面的authorized_keys里面(没有就手动创建,可能会有权限的问题)

这样做完之后,这个服务器就可以免密码克隆git服务器的内容了:
git clone git@git服务器IP:test.git(这个空仓库是在git服务器的git家目录里面的)

apache2重定向(隐藏index文件)

加载重定向模块:

ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/

修改配置文件:

vim /etc/apache2/apache2.conf

找到:
Directory /var/www/
把 AllowOverride Node
改为:
AllowOverride all

保存退出,重启apache:

:wq
apachectl restart

安装laravel调试工具

安装:

composer require barryvdh/laravel-debugbar

全格式打印:

dd();

如果没有新的文件,git快捷提交:

git commit -a -m "show"

设置服务提供者:

vi /var/www/demo/config/app.php

找到:
Application Service Providers...

在里面写入:
Barryvdh\Debugbar\ServiceProvider::class,

起个别名,找到:
Class Aliases
写入:
'Debugbar' => Barryvdh\Debugbar\Facade::class,

生成配置文件:
cd /var/www/demo/
php artisan vendor:publish

手动输出错误日志:
php文件中写:
/Debugbar::error('Something is definitely goding wrong');

环境配置和数据库连接

连接:

1. 安装Navicat Premium

2. 然后新建一个mysql连接

3. 然后配置ssh

4. 输入远程服务器的ip和用户名密码

5. 然后配置常规

6. 这里面是以ssh的远程服务器为基础的,所以ip地址就写localhost(代表远程服务器)

7. 输入数据库的用户名和密码

8. 连接成功

配置:

配置文件都在根目录的config文件夹下,找到database.php

可以看到里面的mysql配置,使用了一个env函数

这个函数可以动态加载根目录下得.env里面的全局变量

所以我们只需要修改.env里面的配置就可以了

数据迁移

生成信息记录表:

根目录下:
php artisan migrate

在根目录下 database/migrations 里面存放了动态建表文件

利用laravel命令建立表,有利于数据库迁移:

根目录下:
php artisan make:migration crteate_news_table

会在根目录下的database/migrations文件里夹里生成对应的文件,可以在这个文件里定义表结构

静态资源管理elixir工具

安装nodejs:

wget https://nodejs.org/dist/v4.4.4/node-v4.4.4.tar.gz

tar -zxvf node-v4.4.4.tar.gz

cd node-v4.4.4

./configure

make && make install

安装gulp:

npm install --global gulp

npm install

配置文件在:

根目录下:
gulpfile.js

测试合成文件:

合并多个css文件:
vi gulpfile.js

注释:
min.sass('app.scss');
添加:
mix.styles(['a.css','b.css'],'public/assets/css');
注意:a.css,b.css都在项目根目录下resources下assets的css目录(没有自己建立个)
注意:合成输出的目录在public/assets/css下(没有自己建立)

编译合成:
gulp

查看效果:
cat public/assets/css/all.css

测试编译sass:

vim resources/assets/sass/app.scss
打开文件中的注释,导入bootstrap

测试驱动开发

项目根目录下有一个tests文件夹,在这个里面写测试用例:

cd tests

其中TestCase.php是系统封装的测试,我们自己写的驱动都要集成这个类

ExampleTest.php就是一个列子

我们自己写的测试用例,命名一定要按照规范,即xxxTest.php

测试:

项目根目录下:
./vendor/bin/phpunit 

显示绿色的就是测试通过,红色的的就是没有测试通过

ps:我们在实际的项目开发中,先根据用户需求,写出测试用例,执行测试,肯定都是
红色的呀,然后我们就一个模块一个模块的去完成,让红色慢慢的都变绿,项目也就做完啦

laravel项目生命周期

laravel运行流程

1.public/index.php

项目入口文件

2.bootstrap/cache

    框架的启动文件夹
    cache是项目编译后的所有需要的类和资源

contract容器,帮助我们创建我们需要的对象

3.配置文件

provider:服务提供者
命名空间加类,写在这里面的类,系统会自动帮我们创建对象

aliases:别名
给对象起个别名,方便我们使用

app/console:命令行相关

kenel.php 命令行要使用的东西在这里

app/events:注册事件

app/http:网页请求走这里

app/jobs:消息

  1. 加载app/http/内核 kenel.php

    先走里面的中间件,中间件分全局中间件,和路由中间件

app/http/route路由文件,是整个web项目最开始的地方了

模板使用

路由文件位置:

app/Http/routes.php

加载模板

模板位置在:

resources/views/

模板名字:
name.blade.php

加载模板用:
return view('name');

加载views/dir/下的模板:
return view('dir.name');

模板包含

在要页面中这样写:

@include('inc.name')

模板继承

在要继承的页面中这样写:

@extends('layout.app')

我们只继承那些不变的内容,动态的内容我们要留空,在被继承的模板文件中用这个占位:

@yield('content')
在继承它的页面中去实现这个占位的内容

接着在继承页面中这样写:

    @section('content')
        要实现的代码内容...
    @endsection

控制器与resfulApi的使用

控制器方法约定(resfulApi):

GET index  列表
GET create 创建
POST index 添加一个
GET id 查看
GET edit 修改

创建控制器:

项目目录中使用命令:

php artisan make:controller HomeController --resource

会在app/Http/Controller/下面生成对应的控制器

路由设置

在路由文件中配置:

基本路由:

Route::get('/','HomeController@index');

resful路由:

Route::resource('/home/','HomeController');
Route::resource('/home/create','HomeController');
Route::resource('/home/edit','HomeController');

注意:顶级目录好像不支持get方式

对控制器的控制:

生效的方法:

Route::resource('/','HomeController',['only'=>['index','create']]);

不生效的方法设置:

Route::resource('/','HomeController',['except'=>['index','create']]);

服务容器和工厂模式

方便扩展的核心架构就是容器: Service Container

index入口文件中,包含了核心框架应用程序对象:

$app = require_once __DIR__.'/../bootstrap/app.php';

app.php是一个Application对象:

$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')

);

Application继承Container对象:

class Application extends Container implements ApplicationContract, HttpKernelInterface

Container就是一个容器对象,利用各种机制来帮助我们创建对象

Application对象给我们一个这样的方法:

$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,  //访问这个类名
App\Exceptions\Handler::class                          //放入这个类
);

在服务提供者中,我们可以方便的注册类或接口:

$this->app->bind('A', function ($app) {
return new HelpSpot\API($app['HttpClient']);  //返回一个对象或者类名称 new \App\User();
});
$u->$this->app->make('A');

在app.php文件中绑定:

//相当于给这个类做一个标记,名字是A
$app->bind('A', function ($app) {   
return new HelpSpot\API($app['HttpClient']);  //返回一个对象或者类名称 new \App\User();
});
//这里通过标记,告诉Application工厂给我生产一个对象:
$u->$this->app->make('A');

那么如果是已经new好的对象我们怎么放到容器中进行统一管理呢?

$u = new User();
$this->app-instance('u',$u);

优点:如果我们这个类是需要替换成其他的类的话,我们不用做太多的改动,只需要修改个返回的类的就行了,标记在其他地方都是通用的

根据不同需求生产不同的对象

单例模式:

//这样绑定
$app->singleton('A', function ($app) {   
    return new HelpSpot\API($app['HttpClient']);  //返回一个对象或者类名称 new \App\User();
});
//这样生成
$this->app->make('A');
简介写法:
$this->app['A'];

还可以把我们实例化好的对象放到APP里面统一管理:

$fooBar = new FooBar(new SomethingElse);
$this->app->instance('FooBar', $fooBar);

依赖注入和ioc控制反转

控制反转就是在我们需要一个对象的时候,根据参数的类型,把我们需要的函数注册进来,比如:

class Tb{
    private $ta;
    public function __constauct(\App\Ta $a){
        $this->ta = $a;
    }
}
说明:在我们需要使用Tb这个对象的时候,工厂的方法在创建Tb对象的时候,会同时把我们需要的
参数也创建好,并且填充进来,这样在我们开发程序的时候就会方便很多

要想使用依赖注入和控制反转,就必须先注册类:

$app->bind(\App\Ta::class, \App\Ta::class); $app->bind(\App\Tb::class, \App\Tb::class);

//为什么我们的绑定和官方源码不一样呢,来看看
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,  //其实就是一个接口
App\Exceptions\Handler::class                         //具体实现接口的一个类
);

并不是在bootstrap/app.php里面注册,后面会说道

服务提供者和laravel低耦合架构

在入口index.php文件中make 了一个内核:

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

内核继承了HttpKernel,在httpKernel中:

//启动配置
protected $bootstrappers = [
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    'Illuminate\Foundation\Bootstrap\LoadConfiguration',
    'Illuminate\Foundation\Bootstrap\ConfigureLogging',
    'Illuminate\Foundation\Bootstrap\HandleExceptions',
    'Illuminate\Foundation\Bootstrap\RegisterFacades',
    'Illuminate\Foundation\Bootstrap\RegisterProviders',
    'Illuminate\Foundation\Bootstrap\BootProviders',
];   
//启动了LoadConfiguration配置文件

在config/app.php中,return了一个数组,其中:

这个提供了服务提供者的路径:
'providers' => [
    Illuminate\Auth\AuthServiceProvider::class,
    Illuminate\Broadcasting\BroadcastServiceProvider::class,
    Illuminate\Bus\BusServiceProvider::class,
    Illuminate\Cache\CacheServiceProvider::class,
    Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
    Illuminate\Cookie\CookieServiceProvider::class,
    Illuminate\Database\DatabaseServiceProvider::class,
    Illuminate\Encryption\EncryptionServiceProvider::class,
    Illuminate\Filesystem\FilesystemServiceProvider::class,
    Illuminate\Foundation\Providers\FoundationServiceProvider::class,
    Illuminate\Hashing\HashServiceProvider::class,
    Illuminate\Mail\MailServiceProvider::class,
   ]
httpKernel中会根据这个路径注册服务提供者,生成对应的对象

在Providers文件夹下,有各种注册的服务提供者:

AppServiceProvider.php中继承了Serviceprovider,Serviceprovider中传了一个$app对象:
    public function __construct($app)
{
    $this->app = $app;
}
在AppServiceProvider.php中,有两个函数:
    public function boot()   //启动函数,先执行这个,可以进行一些前提配置
{
    //
    $a = 111;
}
 public function register()  //注册绑定类
{
    //
    $this->app->bind('\App\Ta::class',\App\Ta:class);
        $this->app->bind('\App\Tb::class',\App\Tb:class);
}

总结一下

laravel是怎么运行的

最大就是容器对象:Application

管理laravel框架里面的所有内容
要想使用这些功能,我们要先注册

什么是服务:

 把解决某一个相关功能一系列相关的类打包封装,就是一个服务

服务提供者做什么的:

服务提供者就是扩展我们功能的地方
Application根据配置文件帮我们把服务注册,而所有我们需要的服务功能都是在
服务提供者文件中进行注册的(/app/Providers/AppServiceProvider.php)

这样在多人开发的时候,每个人把要注册的类写在自己的服务提供者中
Providers/的文件中(自己建立)的register的方法里面

Facades的使用

为了在每次使用类的使用不在生成重复的对象,或者夸文件使用一个对象,我们需要这样使用对象:

User::getName();

这样来配置我们自己的类:

namespace App\Http;
class Z extends \Illuminate\Support\Facades\Facade
{
    protected static function getFacadeAccessor()
    {
        return '\App\TA';
    }
}

Z继承Facade,返回一个类名,这样我们在使用Z类的时候,会自动调用TA类的方法
使用: \App\Http\Z::getTitle() 调用的就是TA类脸的getTitle()方法
注意:必须用单列模式注册TA类

我们来做个简化,在用的时候不带命名空间:

在配置文件中,我们给\App\Http\Z起个别名就好了:

'Z' => \App\Http\Z::class,

中间件

为了不把大量的代码都写在controler里面,我们把某一些特定的服务提取出来,当做中间件

各种验证什么的就由中间件来做

创建中间件

项目更目录下:

php artisan make:middleware testMiddleware

然后注册中间件:

配置文件/app/Http/Kernel.php

protected $middlewareGroups = [ ]
全局中间件,无论如何都是会执行的

protected $routeMiddleware = [ ]
自定义别名中间件,我们一般把中间件注册在这里

调用中间件:

单个:
Route::get('/mid', ['middleware'=>'test',function () {
return redirect('/facades');
}]);

多个:
Route::get('/mid', ['middleware'=>['test','test2'],function () {
return redirect('/facades');
}]);

路由组使用中间件:
Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // 使用 Auth 中间件
    });

    Route::get('user/profile', function () {
        // 使用 Auth 中间件
    });
});
路由组共用中间件 auth
在路由里配置中间件很适合很多个方法都使用同一个中间件
一般用于生产验证和权限验证

只对一个控制器生效的中间件:
在控制器的构造函数中这样写:
public function __construct()
{
    $this->middleware('test');
}
这样在使用控制器的时候,优先加载中间件

Request

laravel默认帮我们开启了csrf验证,这样我们在本地提交表单是提交不过去的,我们为了测试,先关闭:

在app/Http/Kernel.php文件中,注释掉这个:
//            \App\Http\Middleware\VerifyCsrfToken::class,

这个csrf认证可以验证非法请求或者表单的重复提交,后面会说道

测试request

在方法里这样用:

public function store(Request $request)
{
   //提交到数据库
   dd($request);
 }
 打印可以看出,里面包含了关于一次请求的所有信息

 取值:
 $requset['name'];

validate验证

在stroe方法中这样写:

$this->validate($request, [
  'name' => 'required',
  'email' => 'required|email',
]);

开启错误提示:

在模板引擎中这样写:

@if (count($errors) > 0)
<div class="alert alert-danger">
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
</div>
@endif

但是呢,验证都放在方法中,代码就不会那么纯洁了,我们需要一个单独表单请求验证文件:

php artisan make:request StoreBlogPostRequest

新生成的类文件会被放在 app/Http/Requests 目录下。让我们将一些验证规则加入到 rules 方法中:
public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

在控制器的方法中这样使用:
public function store(StoreBlogPostRequest $request)
{
    // 传入的请求是有效的...
}

开启csrf认证

打开我们之前关闭的中间件:

\App\Http\Middleware\VerifyCsrfToken::class,

然后呢,我们需要在表单中加入一个隐藏域,用来传递服务器传来的token:

<input type="hidden" name="_token" value="{{ csrf_token() }}">

表单助手插件:

安装:

composer require laravelcollective/html

配置,在config/app.php中:

Collective\Html\HtmlServiceProvider::class

别名:
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class, 

模板中这样用:

{!! Form::open(array('route'=>'test.store','class'=>'form','novalidate'=>'novalidate')) !!}
{!! Form::label('your name') !!}
{!! Form::text('name',null,
    array('required',
        'class'=>'form-control',
        'placeholder'=>'your name')) !!}
{!! Form::label('your email') !!}
{!! Form::text('email',null,
    array('required',
        'class'=>'form-control',
        'placeholder'=>'your email address')) !!}
{!! Form::submit('添加') !!}

在用户填写错误的时候,会保留用户的填写信息

orm模型

就是把数据表的结构跟我们的一个类对应上了

创建模型

数据模型建立(生成文件在app文件夹下):

普通建立:
php artisan make:model Test

建立的同时生成数据库迁移:
php artisan make:model Test --migration

之后我们就可以在控制其中很方便的使用模型对象了:

    $test = new Test();  //要现在开始引入命名空间
    $test->name = $request['name'];
    $test->email = $request['email'];
    $test->save();
    // $test->where('id',1)->delete();
    dd($test->all());

利用邮件服务将表单推送到手机

为了方便将提示信息推送给用户,我们使用邮箱服务:

首先安装email扩展:

composer require guzzlehttp/guzzle

然后修改配置文件,根目录下得.env文件,这样改:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=n13521760670@163.com
MAIL_PASSWORD=******
MAIL_ENCRYPTION=null

config/mail.php也要修改:

  'from' => ['address' => 'n13521760670@163.com', 'name' => 'n13521760670@163.com'],

在控制器中这样使用:

    $data = [
        'name' => $request->get('name'),
        'email' => $request->get('email')
    ];
    \Mail::send('email', $data, function ($m) use ($data) {
        $m->from('n13521760670@163.com', '测试发送邮件');
        $m->to('975974740@qq.com',$data['name'])->subject('laravel练习使用邮件');
    });

模板中这样设置信息:

<p>
用户:{{$name}} email:{{$email}}
正在练习使用laravel
</p>

利用laravel认证模板完成用户注册登录

主要是利用框架自带的Auth模块

未完待续...

本帖已被设为精华帖!
本帖由系统于 6年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6

没有看完,但看了前面一部分,非常详细不说,还非常容易懂!

7年前 评论

太罗嗦了、

7年前 评论

@爱在初念 很早以前学laravel的时候记录的笔记,不啰嗦点我怕以后自己看不懂,嘿嘿

7年前 评论
小小青喻

mark一下,有时间慢慢看!

7年前 评论

composer require guzzlehttp/guzzle 这不是 email 扩展吧

6年前 评论
Destiny

file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!