laravel5基础用法

来源:互联网 发布:词汇量测试什么软件 编辑:程序博客网 时间:2024/05/17 19:21

配置

如果您使用的是Apache服务器,需要找Httpd.conf文件中开启

并且laravel对php版本有所要求,因为laravel使用了很多php的新特性,建议使用php7,现在还有什么理由不使用php7呢?需要开启如下的php扩展

extension=php_openssl.dll
extension=php_mbstring.dll
extension=php_pdo_mysql.dll

还要把storage和vendor目录权限配置为777
安装完 Laravel 后,需要配置一些目录的读写权限:storage 和 bootstrap/cache 目录应该是可写的

还有

控制器

使用laravel提供的命令创建控制器

php artisan make:controller IndexController

在app\Http\Controllers\IndexController.php中
在路由中写

Route::get('/test', 'IndexController@index');

在控制器中写

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class IndexController extends Controller{    public function index()    {        echo '11';    }}

路由

laravel一开始走的是public/index.php.
当然我们也可以把外面的service.php改为index.php并且把public里面.htaccess复制到外面,这样我们访问laravel就不要跟public/index.php了
内置服务器缓存清理

php artisan serve
这时候我们不要关闭cmd,一关闭,站点就不能用了.

在laravel5.2里面路由是放在app/Http/routes.php这里的.然而在laravel5.4中路由是写在routes/web.php中的

项目的静态资源文件是存放在resources/views中的,在这里面我们可以看到欢迎页面的welcome.blade.php

请求

在routes.php(5.2)或者web.php(5.4)中写路由,(postman测试)

Route::get('/hd',function(){    echo 'get-hd';});Route::post('/hd',function(){    echo 'post-hd';});

可以用postman测试出相应的结果.
有时候还需要注册路由响应多个HTTP请求–这可以通过match方法来实现,或者也可以通过使用any方法注册一个路由来响应所有的HTTP请求

Route::match(['get','post'],'/hello',function(){    echo 'get-post';});Route::any('/foo',function(){    echo 'any';});

同时可以在路由中定义参数

Route::get('userId/{userID}/posts/{posts}',function($Id,$posts){        echo $Id.'--'.$posts;});#地址栏输入http://127.0.0.1:8000/userId/jdxia/posts/17#结果:jdxia--17#注意参数后面加个?,表示可以不写,但是后面形参建议给个默认值Route::get('userId/{userID?}/posts/{posts?}',function($Id=0,$posts=null){        echo $Id.'--'.$posts;});#地址栏输入http://127.0.0.1:8000/userId/20/posts#结果:20--#如果这样,路由不知道和那个对应了,直接报错#http://127.0.0.1:8000/userId/posts#里面的参数还可以正则约束:#可以使用路由实例上的where方法来约束路由参数的格式。where方法接收参数名和一#个正则表达式来定义该参数如何被约束:Route::get('user/{id}/{name}',function(){    //})->where(['id'=>'[0-9]+','name'=>'[a-z]+']);

还有更多参考官方手册

在laravel里面return数组会在页面上显示json,无需我们在编码成json了

Route::get('/hd', function () {    return ['name'=>'jdxia'];});{'name':'jdxia'}

注意:

Route::get('/hd', function () {    return true;});#这种是不行的会报错,如果我们要返回一个bool类型外面用dd套下就行

命名路由

命名路由为生成 URL 或重定向提供了便利。实现也很简单,在定义路由时使用数组键 as 指定路由名称:

Route::get('user',['as'=>'profile',function(){    echo route('profile'); //http://127.0.0.1/user    return '<br />命名路由';}]);

此外,还可以为控制器动作指定路由名称:

Route::get('user1',[    'as'=>'profix','uses'=>'IndexController@index']);#as后面跟的路由  uses表示使用哪个控制器下面的那个方法#在对应的控制器下面写class IndexController extends Controller{    public function Index()    {        echo route('profile');//http://127.0.0.1/user1    }}

以后我们可以使用route(路由)表示URL地址

路由分组

我们通常把控制器放在各个文件夹中,比如在app\Http\Controllers下面创建一个Admin文件夹
控制器:

<?phpnamespace App\Http\Controllers\Admin;//和继承的Controller不在同一个文件夹下面要使用命名空间use App\Http\Controllers\Controller;class IndexController extends Controller{    public function index()    {        echo 'index';    }    public function login()    {        echo 'login';    }}

路由:

Route::get('admin/index', 'Admin\IndexController@index');Route::get('admin/login', 'Admin\IndexController@login');#这样写路由太麻烦了,可以把路由分组Route::group(['prefix'=>'admin','namespace'=>'Admin'],function(){    Route::get('index', 'IndexController@index');    Route::get('login', 'IndexController@login');});

php artisan route:list

资源路由

Route::resource('article','ArticleController');

创建ArticleController,在命令行运行下面命令,会发现我们所有的路由

php artisan route:list

比如上面get方式请求article他会请求ArticleController控制器下index方法

数据迁移

在项目目录下有database文件夹,database/migrations有laravel为我们提供的迁移文件

使用 Artisan 命令make:migration来创建一个新的迁移

php artisan make:migration create_table_questions --create=questions

新的迁移位于database/migrations目录下,每个迁移文件名都包含时间戳从而允许 Laravel 判断其顺序,然后我们把laravel提供的迁移文件删除.如果不删除会生成其他的表

打开对应的迁移文件,里面可以看到有up和down方法 在up方法中我们创建一个表名为table1,并添加些字段

up方法写好了,现在用artisan来创建对应的表

php artisan migrate

可以看到有migrations和table_1这2张表,migrations这张表是记录迁移的

在down方法里面可以写对应代码删除表

public function down(){    //参数是存在的表名    Schema::drop('table_1');}

然后在控制台里运行回滚迁移,删除这张表

php artisan migrate:rollback

对应的数据库里面可以看到已经删除这张表

在对应的命令后面加 –pretend 比如

php artisan migrate --pretend

可以看到这条命令将要执行什么,实际上他还没执行

数据填充

在这个文件夹下会生成这个文件,编辑下,可以用db类

再运行执行单个填充文件就可以

如何批量执行

然后运行批量执行填充文件就可以

中间件

中间件在app/Http/kernel.php这个文件中,其中

protected $middlewareGroups=[    'web'=>[

这是系统的,如果我们要使用中间件可以自己创建一个

这是我们自己设置的中间件,把上面一行复制下改个名称就好了,在laravel5.2也是一样
在命令行敲> php artisan 可以看到很多命令,里面就有创建中间件的命令
然后我们开始创建中间件

php artisan make:middleware 中间件名字
php artisan make:middleware AdminLogin

可以在对应文件夹里面看到app\Http\Middleware\AdminLogin.php
现在可以使用中间件

Route::group(['middleware'=>['web','Admin.login']],function (){    Route::get('login','IndexController@login');});

视图

单个分配,后面的with可以写多个with();

在resources/views下面新建my/my_laravel.blade.php

上面的视图分配过于繁琐,我们可以使用compact来简化

return view('my/my_laravel',compact('data','name','age'));

但是视图中数组要这样写

{{$data['rel']}}

Blade模板引擎

所有blade视图页面都会编译成原生的php代码并缓存起来,除非模板被修改,否则不会重新编译
支持php语法:

{{in_array($name,$arr)?'true','false'}}

注释

{{--{{11}}--}}这个注释f12看不到

如果不想让模板引擎解析,就在前面加@

{{$data}} @{{$data}} {{$data}}
#上面会输出11 {{$data}} 11

模板引擎还有一个功能是防止恶意脚本注入:

$data='<script>alert("1");</script>'
return view('my/my_laravel',compact('data'));

上面会在blade模板中显示:

<script>alert('1');</script>

看网页源代码,他把对应的符号解析为实体了,如果想让这js代码能正常执行可以使用这个

<div>{!! $data !!}</div>

如果没有值,值=null,但是模板不想输出null,可以使用这个,有就输出值,没有输出默认

{{$data or 'ok'}}或者
{{isset($data)?$data:'ok'}}

流程控制

ifelse

<div>    @if($data<60 && $data>10)        不及格        @elseif($data<10)        太差        @else        及格        @endif</div>  

unless

<div>    @unless($data>60)        不及格        @endunless</div>#除非大于60,不进来,否则都不进来

for

@for($i=0;$i<=$data;++$i)    {{$i}}<br />    @endfor

foreach

@foreach($data as $k=>$v)    {{$k}}-->{{$v}}<br />    @endforeach

forelse

@forelse($data as $v)    {{$v}}<br />    @empty    没有数据    @endforelse#有数据就输出$v,没有就输出那段话

模板引擎子视图

比如:


如果我们要把html也放到公共地方呢

外面页面写,其中@section() @endsection是固定格式表示要替换模板中什么内容

如果主模板里面写了内容

那么不会在子模板显示,如果要在子模板显示就要写@parent

URL

三种方式
url()通过路由名字生成url
action()通过制定的控制器和方法生成url
route()通过路由的别名生成url

路由中点击传递参数

数据库基本操作

.env配置和读取

在.env文件中APP_DEBUG=true

生成模式开启true,线上模式为false
.env里面还有APP_KEY这项,可以用命令行 php artisan key:generate 来改变key值,他是对项目中一些敏感的加密,有时候这个还会绑定电脑的mac地址,比如win的laravel传到linux上,可以运行不了,就要改变这个

在.igitignore下面有.env这个文件,提交时候会忽略

.env文件其实就是对config文件夹做一些通用的提取

在config文件夹中有database.php文件里面有数据库相关配置

比如上面数据表前缀

''prefix' => env('DB_PREFIX', ''),'
这样写就可以把前缀写到.env文件,他会读取到.env文件

Laravel读取文件信息文件后面会跟个点
下图读取config文件夹下面的一些文件里面的配置信息

上面一行输出app文件下debug值
下面一行输出database文件下default的值
再下面一行是读取database这文件里面多维数组中的值

数据库连接

不要忘记在配置文件中.env更改连接数据库的一些值
测试连接数据库,注意要在DB前面加\

$pdo=\DB::connection()->getPdo();
dd($pdo);

CURD

DB facade

基本用法

注意这边from后面要跟完整的表名,就算.env文件配置过了也不行

查询构造器

不要写完整表名了,完整表名的blog_stu,然后.env文件里面配置过表名的前缀了


删除数据

自增自减

查询数据

聚合函数

连接查询

内连接(等值连接)

查询构建器还可以用于编写基本的 SQL “内连接”,你可以使用查询构建器实例上的 join 方法,传递给 join 方法的第一个参数是你需要连接到的表名,剩余的其它参数则是为连接指定的列约束,当然,正如你所看到的,你可以在单个查询中连接多张表:

$users = DB::table('users')            ->join('contacts', 'users.id', '=', 'contacts.user_id')            ->join('orders', 'users.id', '=', 'orders.user_id')            ->select('users.*', 'contacts.phone', 'orders.price')            ->get();

左连接
如果你是想要执行“左连接”而不是“内连接”,可以使用 leftJoin 方法。该方法和 join 方法的用法一样:

$users = DB::table('users')        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')        ->get();

交叉连接
要执行“交叉连接”可以使用 crossJoin 方法,传递你想要交叉连接的表名到该方法即可。交叉连接在第一张表和被连接表之间生成一个笛卡尔积:

$users = DB::table('sizes')        ->crossJoin('colours')        ->get();

联合(union)
查询构建器还提供了“联合”两个查询的快捷方式,比如,你可以先创建一个查询,然后使用 union 方法将其和第二个查询进行联合:

$first = DB::table('users')            ->whereNull('first_name');$users = DB::table('users')            ->whereNull('last_name')            ->union($first)            ->get();

ORM

php artisan make:model User

会发现Model already exists!
在app\User.php发现里面之前有个User.php这是他的一个示例文件,把这文件删除
删除之后再创建,然后建个Model文件夹,把创建好的user.php移动到这里,改下命名空间

查询

这图是在控制器写,注意命名空间

ORM中新增,自定义时间戳及批量赋值
通过模型新增数据(涉及到自定义事件戳)
使用模型的create方法新增数据(涉及到批量赋值)

查询数据库有没有这条记录

新增


默认会在数据表中有create_atupdated_at

时间


如果我们想存储时间戳呢?记住字段的类型不要搞错
在模型中写

create新增数据


然后要在模型中写

修改数据

删除

通过模型删除 通过主键值删除 根据指定条件删除

销毁结果集

$a=xx::where('id','=',12)->firstorFail();
$a->destory();

表单篇

Controller之Request

Laravel请求组件用的是symfony/http-foundation组件

上面通过input取值

Request::only(''); 只要请求参数里面的值
Request::except(''); 只要过滤请求参数里面的值
Request::url(); 输出url,?后面不输出
Request::fullurl(); 输出完整url,?也输出

Route::get('/', function () {    $rel=Request::only('name');    dd($rel);    // return view('welcome');});

Controller之session

Session配置文件保存在config/session.php
默认使用file驱动,如果使用的是数据库驱动

'table'=>'sessions'

表名就是这个
使用session前要开启session,laravel开启session要设置中间件

第一种

注意这边session是使用request组件的

第二种
Session辅助函数

第三种
Session类


如果想存个数组进去

读取所有

判断有没有存在

删除指定key的session

Session::forget('student');

清空所有的session

Session::flush();

laravel中session支持二级存储

session()->set('person.name','jdxia');session()->set('person.friend.age',17);dd(session()->all());/***array:4 [▼* "_token" => "LdCqI9SydkSeur9xrGcWS7ntQGyzDmO5jURx11Ve"* "_previous" => array:1 [▶]* "_flash" => array:2 [▶]* "person" => array:2 [▼* "name" => "jdxia"* "friend" => array:1 [▼* "age" => 17*  ]* ]*]

Session暂存

Controller之Response

就是响应
响应常见类型:字符串 视图 json 重定向

重定向

重定向并传递一个暂存的session数据过去

redirect跳转还有return redirect()->action(‘StudentController@show’)->with(‘msg’,’暂存session数据’);//下面路由别名跳转return redirect()->route(‘show’ ->with(‘msg’,’暂存session数据’);

重定向上一层数据

return redirect()->back();

Controller之Middleware

用来过滤进入程序的http请求
首先在kernel.php中创建中间件

'activity'=>\App\Http\Middleware\Activity::class

然后在routes.php中

宣传页面就不要放在中间件中
然后控制器页面

然后中间件文件中

如果请求是/act1,时间没有满足就跳跳act0,满足就执行操作
在请求前执行叫前置,后面执行叫后置

也可以把这个打印出来

Input

表单提交上来可以用Input类来获取
获取所有的Input::all()
获取get的Input::get()
获取上传文件的Input::file()
里面也可以写参数,如:Input::file('filename')

请求历史

Route::get('/', function () {    //把请求数据暂存到session中    Request::flash();   });Route::get('/old', function () {    //返回之前存在session中的值,输出一次就销毁    return Request::old();});

只存某个值flashOnly('name')
除了某个值其他都存flashExcept('name')

CSRF


路由首先要放在中间件中,否则csrf_field中token值为””
控制器

视图

hash加密和验证

加密,生成长度60,每次不一样的加密字符串

$num=123;$rel=Hash::make($num);echo $rel;

简便写法:bcrypt($password);

验证

$num1=123;$rel=Hash::make($num1);$num2=123;$bool=Hash::check($num2, $rel);dd($bool);

一致返回true,不一致false

crypt加密和解密

加密

解密
Crypt::decrypt($str);

Validator验证

密码和确认密码有个注意点在视图上名字要

还有注意命名空间


电话号码验证,首先确定是数字
'phone'=>'numeric'
如果是名字唯一
'username'=>unique:users 表示唯一是users这个表

分页


Student是模型类,每页去2条
页码在视图中这样写就行了

加选中样式

另一中分页
rq是自己定义的函数,获取请求的信息的

表单添加

input里面student是表单名字

Debug


不推荐使用,有时候会出问题

用户认证

php artisan make:auth 在控制台中创建,layout里面用{{asset(‘ ’)}}包含js,css


顺便还要创建表php artisan migrate

文件上传

配置文件config/filesystems.php

支持这些驱动,s3是亚马逊的

Storage_path对应的是这个目录

建立一个上传文件

建一个控制器

如果要判断上传文件的大小可以在上面添加
$file->getSize()

文件在这里

如果想放到public可以改下config/filesystems.php

文件上传方法二:

发送邮件

邮件功能基于swiftMailer函数库之上,提供了简洁的API
配置config/mail.php

支持这些驱动
发件人的全局配置

在.env文件里面可以配置这些

然后在控制器写个方法

缓存

为各种缓存提供了一致的api,支持各种常见的后端缓存系统:如File,memcache和redis
配置文件config/cache.php


有一系列缓存的函数


在文件夹下多了很多文件就是我们缓存目录

错误&日志

错误

配置config/app.php 进行本地开发,应该配置APP_DEBUG环境变量为true,在线上环境应该false

503错误模板

日志

提供了debug,info,notice,warning,error,critical和alert7个错误级别
config/app.php中
模式为single

在控制器里面写

可以看下日志

模式为daily的,每天生成一个日期文件

队列

配置文件config/queue.php


在.env文件中驱动改为数据库驱动

然后在命令行中

迁移文件生成成功,然后执行迁移

创建一个任务类,名字叫SendEmail

可以看到对应文件夹下多出这些文件

然后在SendEmail.php文件下写对应的代码,写个发邮件的


然后可以在我们控制器方法中使用队列了

为什么能直接使用dispatch,因为在控制器继承的controller这个基类已经实现了这个dispatch

如果在模型中要自己手动use,然后运行对应控制器下面方法,可以看到数据库有队列的记录的

然后执行这个队列监听器,有队列进来就执行

处理失败队列
如果队列执行失败会把记录放到一个失败的表里面去,迁移创建一个表
建立失败的表的迁移文件

创建成功现在开始生成表


迁移成功
失败会放到failed_jobs中
这里写图片描述
如果有很多失败的记录想重新执行
首先查看错误的记录

执行所有的失败队列

删除id4的失败队列记录

全部清除失败的队列记录

帮助函数

array

head
$arr=[1,2,3];
dd(head($arr));
返回1,返回数组第一个元素

arry_only
只要数组中指定的值

$arr=[        'name'=>'jdxia',        'job'=>'php',        'age'=>17    ];dd(array_only($arr,['name','age']));

array_add
在数组中添加元素,添加到末尾

$arr=[        'name'=>'Bob',        'age'=>18    ];dd(array_add($arr,'job','php'));array:3 [▼  "name" => "Bob"  "age" => 18  "job" => "php"]

array_except
返回数组除了那个值

$arr=[        'name'=>'Bob',        'age'=>18    ];dd(array_except($arr,'age'));

array_flatten
返回数组最终的值,不管数组维度多深

$arr=[        'a'=>1,        'b'=>[            'a'=>2,            'b'=>3        ]    ];dd(array_flatten($arr));array:3 [▼  0 => 1  1 => 2  2 => 3]

last
返回数组中最后一个值

$arr=[    'name'=>'Bob',    'age'=>18,    'job'=>'php'];return last($arr);

path

路径类的帮助函数

app_path
返回项目中app的绝对路径
return app_path();
返回D:\develop\laravel5.4\app

config_path
返回项目中config的绝对路径
return config_path();
返回D:\develop\laravel5.4\config

public_path
返回项目中public的绝对路径
return public_path();
返回D:\develop\laravel5.4\public

storage_path
返回项目中public的绝对路径
return storage_path();
返回D:\develop\laravel5.4\storage

string

str_plural
英语单词,单数变复数,本来复数的他不会变,有些变复数y变i加es
return str_plural('apple'); apples
return str_plural('ability'); abilities

starts_with
判断某个单词是不是以某个字符开始,返回bool
dd(starts_with('abcd','a')); true

ends_with
判断某个单词是不是以某个字符结束,返回bool
dd(ends_with('abcd','d')); true

camel_case
把单词转换成驼峰命名法
dd(camel_case('hello_world'));//"helloWorld"

class_basename
输出命名空间最后一个单词
dd(class_basename('App\Controller\Mylaravel'));//Mylaravel

str_limit
限制字符长度
dd(str_limit('abcd',3));//"abc..."
dd(str_limit('你好啊',4));//"你好..."

str_is
判断后面字符串是不是匹配前面模式
dd(str_is('ab*','abcd'));

优化

性能一直是laravel的缺点,所以一定要调优laravel程序

1.配置信息缓存
php artisan config:cache
使用这个命令,把config文件夹里所有的配置信息合并到一个文件里,减少运行时所有配置信息合并到一个文件里,减少运行时文件的载入数量
php artisan config:clear
上面的命令会把bootstrap/cache/config.php 文件删除
注意配置信息缓存不会随着更新而自动加载,所以开发的时候建议关闭信息缓存,一般在生产环境中使用,可以配合Envoy任务运行器 一起使用

2.路由缓存
php artisan route:cache
以上命令会生成 bootstrap/cache/routes.php 文件,需要注意的是,路由缓存不支持路由匿名函数编写逻辑,详见:文档 - 路由缓存。

可以使用下面命令清除路由缓存:
php artisan route:clear
此命令做的事情就是把bootstrap/cache/routes.php 文件删除。
注意:路由缓存不会随着更新而自动重载,所以,开发时候建议关闭路由缓存,一般在生产环境中使用,可以配合Envoy 任务运行器 一起使用。

  1. 类映射加载优化
    optimize 命令把常用加载的类合并到一个文件里,通过减少文件的加载,来提高运行效率:
    php artisan optimize --force
    会生成 bootstrap/cache/compiled.phpbootstrap/cache/services.json 两个文件。
    你可以可以通过修改 config/compile.php 文件来添加要合并的类。
    production 环境中,参数 --force 不需要指定,文件就会自动生成。

要清除类映射加载优化,请运行以下命令:
php artisan clear-compiled
此命令会删除上面 optimize 生成的两个文件。

注意:此命令要运行在 php artisan config:cache 后,因为 optimize 命令是根据配置信息(如:config/app.php 文件的 providers数组)来生成文件的。

  1. 自动加载优化
    此命令不止针对于 Laravel 程序,适用于所有使用 composer 来构建的程序。此命令会把 PSR-0PSR-4 转换为一个类映射表,来提高类的加载速度。
    composer dumpautoload -o
    注意:php artisan optimize --force命令里已经做了这个操作。

  2. 使用 Memcached 来存储会话
    每一个 Laravel 的请求,都会产生会话,修改会话的存储方式能有效提高程序效率,会话的配置信息是 config/session.php,建议修改为 Memcached 或者Redis 等专业的缓存软件:
    'driver' => 'memcached',

  3. 使用专业缓存驱动器
    「缓存」是提高应用程序运行效率的法宝之一,默认缓存驱动是 file 文件缓存,建议切换到专业的缓存系统,如Redis或者Memcached,不建议使用数据库缓存。
    'default' => 'redis',

  4. 数据库请求优化
    数据库请求优化
    数据关联模型读取时使用 延迟预加载 和 预加载 ;
    使用 Laravel Debugbar 或者 Clockwork留意每一个页面的总数据库请求数量;
    这里的篇幅只写到与 Laravel 相关的,其他关于数据优化的内容,请自行查阅其他资料。

  5. 为数据集书写缓存逻辑
    合理的使用 Laravel 提供的缓存层操作,把从数据库里面拿出来的数据集合进行缓存,减少数据库的压力,运行在内存上的专业缓存软件对数据的读取也远远快于数据库。

$posts = Cache::remember('index.posts', $minutes = 30, function(){    return Post::with('comments', 'tags', 'author', 'seo')->whereHidden(0)->get();});

remember 甚至连数据关联模型也都一并缓存了,多么方便呀。

  1. 使用即时编译器
    HHVMOpCache 都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高 50% 或者更高的性能

  2. 前端资源合并
    作为优化的标准,一个页面只应该加载一个 CSS 和 一个JS 文件,并且文件要能方便走 CDN,需要文件名随着修改而变化。
    Laravel Elixir 提供了一套简便实用的方案,详细请见文档:Laravel Elixir 文档。

1 0
原创粉丝点击