言十年的博客

上善若水,水善利萬物而不爭

物盡其用!人盡其才!兩全其美!


Laravel5.2框架使用one

开发环境mb pro,laravel (v5.2.29)

查看代码

Laravel的环境要求

  • PHP >= 5.5.9 #你需要用 命令 php -v看下版本
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
  • Tokenizer PHP Extension

我的版本是 5.5.3几 但是,用了curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6。变成PHP 7.05。奇怪

##建立

###安装composer(php的包管理工具)

brew install homebrew/php/composer
# 至于brew怎么安装呢?看我总结的另一篇博客

composer 创建一个叫weixin的项目

composer create-project --prefer-dist laravel/laravel weixin
#weixin是我们的项目的名字

下载过程比较缓慢,laravel引用的三方库比较多。有人写了一篇博客吐槽laravel吐槽系列之一

artisan 命令

我们在weixin文件夹的目录下执行

php artisan serve
#然后看到Laravel development server started on http://localhost:8000/
#php5.4之后自带一个web服务器。artisan用的就是自带的服务器。你也可以使用apache,nginx

打开http://localhost:8000/,白纸黑字映入眼帘 Laravel 5

###框架配置

./weixin/config目录下放置各种配置文件。其实,看下目录名字就知道底下文件是干啥的。

|____app.php #应用的配置:配置调试模式(开发时true,上线false),时区
|____auth.php #权限的配置
|____broadcasting.php
|____cache.php #缓存配置
|____compile.php #编译配置
|____database.php #数据库配置
|____filesystems.php #文件系统配置
|____mail.php #邮箱服务的配置
|____queue.php #队列的配置
|____services.php #
|____session.php #session的配置
|____view.php #视图的配置:视图的放置位置(默认放置目录'resources/views'),编译后放置的位置。
#mac没有tree的命令所以使用 find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
#当然你可以自定义一个tree命令 http://www.jb51.net/os/MAC/388865.html

Laravel 完整开源项目大全 http://www.echoci.com/programme/language/7932.html

Laravel 5.1 基础教程 http://laravelacademy.org/laravel-tutorial-5_1

brackets 编辑器

##基础

###路由

./weixin/app/Http/routes.php。文件中我们看到有下面这样的代码。

Route::get('/', function () {
    return view('welcome');
});

上面代码。翻译成大白话就是:get方式访问http://localhost:8000/。你去视图目录resources/views找一个叫’welcome’的模板。于是找到了./weixin/resources/views 下面有个welcome.blade.php(blade模板)。真相大白,第一次启动看到的黑字Laravel 5就在其中。

ps.除了view('welcome')你也可以使用View::make('welcome')

路由都放在routes.php中。ok!我们自己建一个模板。叫做about.blade.php。介绍下这个项目。如果不配置route直接写http://localhost:8000/about。会报错,因为找不到么Sorry, the page you are looking for could not be found.。下面配置:

Route::get('about', function () {
    return view('about');
});

接着,我们写个POST请求的。

Route::post('dev', function () {
    return "公众号开发"; // 也可以写成 echo "公众号开发";
});

在这里使用模拟请求软件paw。当然也可以使用谷歌的插件postman或者其他的。

模拟post之后我们并没有成功,反而抛出了异常:

Whoops, looks like something went wrong.

1/1
TokenMismatchException in VerifyCsrfToken.php line 67:

原因何在?laravel默认有个Token。我们看下cookie就明白了。这么一大截。

Cookie XSRF-TOKEN=eyJpdiI6IktcL0M2V1VBUUMxMjZlaldRNHFwVmxnPT0iLCJ2YWx1ZSI6Iit3bkk3Y1FrQzBIXC9XZnh1VnhtVFFhRnpVUXlpZWhYSStEOFwvUUVHb3ljNk1MM1lET01lVkd3amtidGF4NEJMWjdMTWlSbk5YeTFmNzVuQ01vXC9yak13PT0iLCJtYWMiOiIxZmU5Zjc3Y2ZmNjc2ZmFiZjI5OWQ2OTk5NGVmZmZiNTBkMWM1MTBkMWQxMTZkMmJhMWQ2ZDcyZGQwYzY4NGFjIn0%3D; laravel_session=eyJpdiI6IlYwdm9GWG04YzZcL0ZYcklzSlhrZXhnPT0iLCJ2YWx1ZSI6Ik9lbHRaUER6NjFhWUJCMFpjSmUxaVpXd3ppdXFGM3dQbHJSblQ4enYydEpQSjhmQlV2a1BFMnJpb2Q2Y3g3QitRaVwvQnZGK1ZxQkpxZlEzcUxxMFwvSnc9PSIsIm1hYyI6Ijk1MjVjNTViMzhhZjQwOGE0OTBhZGI2YTNlNjk1MTIwNGQ1OGQ0NTE0ZGI2ZTgzZWYzOTgzZDA5ZDMxNWYzNjEifQ%3D%3D

我们尝试关掉这个叫做CsrfToken的东西。你不是要验证么?我先关掉,让我的post成功。找到一个比较温柔的方式。打开App/Http/Middleware/VerifyCsrfToken.php。把你想避免CSRF验证的url添加进去。这样模拟的post内容就显示出来了。

protected $except = [
     //
    'dev'
];

然而我又加了两个post的路由

Route::post('dev/article', function () {
    return "公众号开发:文章";
});

Route::post('dev/picture', function () {
    return "公众号开发:图片";
});

这样屏蔽?

protected $except = [
     //
    'dev',
    'dev/article',
    'dev/picture'
];

no,no,no。下面比较好。当然我觉得开启CSRF还是好的。否则真被攻击了,就哭了!

protected $except = [
     //
    'dev/*',
];

###带参数的请求

单个参数

Route::get('text/{tid}', function ($tid) {
    return '文本消息id='.$tid;
});

多个参数

Route::get('text/{catId}/{tid}', function ($catId,$tid) {
    return '文本分类:'.$catId.'文本消息id='.$tid;
});

验证参数:where

正则表达式约束参数

是否为数字:

Route::get('text/{tid}', function ($tid) {
    return '文本消息id='.$tid;
})
->where('tid', '[0-9]+');

多个参数验证

Route::get('text/{catId}/{tid}', function ($catId,$tid) {
    return '文本分类:'.$catId.'文本消息id='.$tid;
})
->where('tid'=>'[0-9]+', 'catId'=>'[0-9]+');

传递数据到视图

单个变量

Route::get('article', function () {
    return view('article')->with('content','警惕起来');
});
Route::get('article', function () {
    return view('article', ['title'=> 'CSRF攻击', 'content'=> '很危险的攻击']);
});

另一种写法

Route::get('article', function () {
    return view('article')->withTitle('CSRF攻击')->withContent('的确很危险');
});
Route::get('article', function () {
    return view('article')->with(['title'=> 'CSRF攻击', 'content'=> '防止危险啊']);

});

####嵌入子视图

为了便于管理一个模块的视图。我们创建一个article的文件夹,把文件放进去。访问目录下的模板变成了article/article或者article.article都是可以的。

Route::get('article', function () {
    return view('article.article')->with('content','警惕起来')->nest('listview', 'article.listview');
});

####子视图传递数据

Route::get('article', function () {
    return view('article.article')->with('content','奥巴马病毒')->nest('listview', 'article.listview', ['articleCatName'=> '病毒防治']);
});

####定义视图块

@section('articleListView')
<ul>
	<li>文章1</li>
	<li>文章2</li>
	<li>文章3</li>
	<li>文章4</li>
	<li>文章5</li>
</ul>
@stop

调用方式

@yield('articleListView')

引入外部模板,比如我们在views文件夹下创建了。layout文件夹专门存放公共常用的模板。在需要的页面引入。

@extends('layout.commonpage')

例如:

listview.blade.php

@extends('layout.commonpage')
<p>文章分类--<?php echo $articleCatName?>--列表</p>

@section('articleListView')
<ul>
	<li>文章1</li>
	<li>文章2</li>
	<li>文章3</li>
	<li>文章4</li>
	<li>文章5</li>
</ul>
@stop

commonpage.blade.php

<div style="background-color:red;width:300px;height:400px;">
	@yield('articleListView')
</div>	

上面两段代码的意思就是。listview需要commonpage。于是extends了。然后,commonpage里面需要暴多调用listview。于是@yield('articleListView')

我们在commonpage 添加了一个直接显示的区块

@section('gallery')
<ul>
	<li>图片1</li>
	<li>图片2</li>
	<li>图片3</li>
</ul>
@show

提示:commonpage跟listview父子关系。当在listview中定义一个同样的区块gallery

@section('gallery')
	来自 listview
<ul>
	<li>图片1</li>
	<li>图片2</li>
	<li>图片3</li>
</ul>
@stop

后定义的覆盖了commonpage里面的gallery

如果想让这先后定义的区块gallery都显示。如下使用@parent:

@section('gallery')
	@parent
	来自 listview
<ul>
	<li>图片1</li>
	<li>图片2</li>
	<li>图片3</li>
</ul>
@stop

###模板变量

除了我们使用原生的标签<?php echo $content; ?>

还可以模板标签`

打的,被坑,记

晚了,没了地铁,在a地铁站打了的然后回b地铁站!

司机见我背个包觉得上车不便!让我坐后面!不过我半个身子已进车!司机面孔严肃!

我随意寒暄了一句:“师傅您这忙了一天了!”(我通常上车就扯闲篇)。

师傅也淡淡的回应。师傅不知道B地铁站在哪里,他问我知道路吗?我想我虽然走过两次可是我记性不太好!我假装说我手机没流量了不能导航了,知道一个方向!为什么骗他呢?我只是潜台词告诉他别宰我,我还是有导航的,只是没流量而已!想到这里我也认为我自己多心了!

我观察方向盘那里没有手机!通常北京的司机大多会放个手机,他们会使用滴滴打车!也能当导航!(我没用过滴滴,我想有地图功能肯定能知道位置)我对师傅说怎么没有用滴滴软件呢?我也忘了他怎么说的了!

车在微雨濛濛中继续行驶!到了B地铁站那个路口!

我说过了那个红灯哪里就停吧!师傅说拐弯停!我礼貌说道谢谢师傅!红灯变绿,车左拐到路口停罢!我看了看打表的钱!14.4。跟前几天打车的价钱貌似一样!师傅说15。我在想上次是要了我14。我又想多一块就一块吧!我掏了十五给了师傅准备下车!

师傅说你这十块缺个角(我用ipad打字到这里我只想说句ciao(意大利语:你好))!我想晚上B同学说道阿阳打车被坑的事情!我立刻警惕起来!我以为真是缺个角!同时我开始防御!可惜我口袋里没有十块钱了,只有一百,我掏了一张稍微有裂痕的一百!我对师傅说师傅您看没缺角!同时我眼睛盯着他的左手!师傅说你再换张吧,你这都是啥钱?我说我平时钱随便放的!我留意到他左手有一张一百块!我想坏了,那是张假一百!

于是我说这样吧,我用手机打过去吧!他不耐烦的说好!我掏手机边想我扫他二维码的时候一定要注意数字!我见他想用微信!我说师傅我只能用支付宝!这时手机没电了!我想还是掏一百吧!拿了张新的一百!我重复了之前说的那句话–师傅您看没有缺角!他拿起验钞。验完后我拿到手里!我眼睛就盯着他的左手!我不能让他拿到我的一百换成他的一百!于是假装看我自己的一百!验自己的钱假装没问题(哥这是真钱,我还得装下)然后避免司机接触就放到仪表盘上的台子上(我不懂车的构造)。

司机师傅左手拿了折的一叠钱给我找!我想这回应该没问题了!他给了我九十!我接过来!看了看两个二十是真的!当我看五十的时候我已经放松了警惕,简单的看了看那条线。没有触摸其他地方!我礼貌的说师傅您晚上好好休息!下车之后我发现我书包打开着(是我没拉住?)。我忙着拉拉链没再看钱!拉完拉链!我一看钱,一摸坏了假五十(平的跟飞机场……)。我借着路边烤摊的灯光看了看!假的!烤肉的小哥说怎么了,假钱?我说你看假的。兴致来了!跟小哥聊了几句,旁边等串的哥们也参与了进来!小哥说你没让他打小票?我说没有。

于是我想起刚才司机师傅说要不要打票!我说打不打无所谓。我觉得没人给我报销,要那干啥!烤肉的小哥说有小票可以打服务台投诉,他应该还没走远!我想起了我跟龙同学开的玩笑我说有时候看情况拍车牌!主要这次看着正规就没有事先警惕!跟小哥聊了几句(爱路人扯闲篇)!小哥说花钱买个教训!我笑着说就当捡了个乐!漫步在微雨中!走向住的地方。感受着淋雨的气氛!想想最近的不顺,只道是世界不是你坑我就是我坑你,如是而已!并无愤怒之情!end!

ps.关于为什么不打小票,B同学说为啥不多扯点卫生纸。是这样的,以前我大便两格纸到三格!这两年没数!反而怕不够!擦屁股明明可以少用一格,但是用完算了!还有卫生纸样子不同,就没再数格子!其实浪费了纸!所以我不愿意浪费纸!我见别人擤鼻涕用纸是我两倍!你们真大方!另外,我买东西,书包能放,手里能拿就不用袋子!避免浪费!妈的!小时候环保看多了!见了烟头就踩灭!扔垃圾一定要分清哪个是可回收哪个是不可回收,等等!

小言打车被找假五十,大家来围观来点赞!

好了,防骗小贴士,小言温馨提示:

1.打夜车尽量别打黑车

2.可以拍下出租车的车牌记下司机的工牌名字,发给朋友

3.打小票。不要像我一样省纸。另外你公司万一避税要用呢?

4.多带零钱,十五个硬币随便撕,十五个十块随便撕

5.先确认自己的钱是否完整再出示给司机

6.盯着他盯着他的手不要分神,就算他打岔你也要盯着

7.拿到钱验证(别大意)

8.可以采用支付宝方式打钱避免接触真钱,一定要注意数字

9.使用滴滴打车

10.自己想吧,反正我大意了,防了一招。第二招没防住。左手攥着假一百!一叠钱里还有其他假钱!

娱乐完毕!晚安!听雨ing

晒下,我50元买的书签。

假五十

<div class="ds-share flat" data-thread-key="/dadibeikeng" data-title="打的,被坑,记" data-images="http://yanshinian.com/avatar.png" data-content="打的,被坑,记" data-url="http://yanshinian.com/dadibeikeng"> <div class="ds-share-aside-right"> <div class="ds-share-aside-inner"> </div> <div class="ds-share-aside-toggle">分享到</div> </div> </div>

`。乍一看跟angularJS一样一样滴。

调用函数


默认情况下``会对html标签进行转义,这样不利于显示模板变量。

``会如下显示:

<p>文章分类--病毒防治--列表</p> <div style="background-color:red;width:300px;height:400px;"> <ul> <li>文章1</li> <li>文章2</li> <li>文章3</li> <li>文章4</li> <li>文章5</li> </ul> 来自commonpage <ul> <li>图片1</li> <li>图片2</li> <li>图片3</li> </ul> 来自 listview <ul> <li>图片1</li> <li>图片2</li> <li>图片3</li> </ul> </div>

下面就解决了显示问题:

{!! $listview !!}

###控制语句

@if (count($content) > 2)
	大于 2
@elseif (count($content) == 100)
	等于100
@else
	就是1
@endif

其他的循环操作等等,参考Blade Templates

###HTML标签

####生成链接


#http://localhost:8000/css/bootstrap.min.css 

#http://localhost:8000/image/avatar.png 

#http://localhost:8000/js/jquery.js 

#http://baidu.com

####Forms & HTML组件

安装

在composer.json,找到require。增添"laravelcollective/html": "5.2.*"

"require": {
    "laravelcollective/html": "5.2.*"
}

接着执行composer update。下载,加载laravelcollective/html

配置

config/app.php中,找到providers。添加Collective\Html\HtmlServiceProvider::class,

 'providers' => [
    // ...
    Collective\Html\HtmlServiceProvider::class,
    // ...
  ],

找到aliases添加

  'aliases' => [
    // ...
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
    // ...
  ],

然后我们就能用它的方法了。文档链接

打开一form表单

{!! Form::open(array('url' => 'article/add')) !!}
    //
{!! Form::close() !!}

生成效果是

<form method="POST" action="http://localhost:8000/article/add" accept-charset="UTF-8"><input name="_token" type="hidden" value="7QbcrEdsyQ7nQ6i503t8waG68fCdfDNWeuMQ5srg">
</form>

生成表单Label标签

{!! Form::label('name', 'Name:') !!}
#<label for="name">Name:</label>

其他表单标签的生成

{!! Form::text('name', null, ['class' => 'common']) !!}
#<input class="common" name="name" type="text" id="name">

{!! Form::select('区域',array(1=>'北京', 2=>'上海', 3=>'还是上海') , 2, ['name'=> 'city','class' => 'select']) !!}
#后面的name ctiy会覆盖掉区域
#<select name="city" class="select"><option value="1">北京</option><option value="2" selected="selected">上海</option><option value="3">还是上海</option></select>

{!! Form::radio('sex','1') !!}
#<input name="sex" type="radio" value="1">

{!! Form::textarea('content', null, ['class' => 'first-class  second-class', 'id' => 'textarea-id', 'cols'=>'50', 'rows'=>20]) !!}
#<textarea class="first-class  second-class" id="textarea-id" cols="50" rows="20" name="content"></textarea>

{!! Form::submit("提交", ['class' => 'submit']) !!}
#<input class="submit" type="submit" value="提交">

ps.刚才想安装一个验证码的组件greggilbert/recaptchaGithub地址。需要谷歌的服务。作罢。另外验证码长得不符合国情。

我们由此得出一个结论。组件安装都是改那几个地方。composer.json,还有config/app.php

参考资料:

分享到