作为程序员一定要保持良好的睡眠,才能好编程

总结 laravel 常见使用代码

发布时间:2016-07-22

php artisan --version 如果使用artisan 出现这样的问题:

t12.jpg

这是环境变量的问题:

修改php版本为5.5.9以上即可




 //路由
/**
    #跨站请求伪造#
    HTML 表单没有支持 PUT、PATCH 或 DELETE 动作。所以在从 HTML 表
    单中调用被定义的 PUT、PATCH 或 DELETE 路由时,
    你将需要在表单中增加隐藏的 _method 字段。跟随 _method 
    也可以使用 method_field('PUT') 代替  <input type="hidden" name="_method" value="PUT">
    字段送出的值将被作为 HTTP 的请求方法使用:
**/
<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>


<?php echo method_field('PUT'); ?>

如果你使用了blade模版,那么也可以用:
{{method_field('PUT')}}
这样的方法去自动的生成 <input type="hidden" name="_method" value="PUT">

这三种方法使用哪种方式都是可以的。


路由的形式:
//http://www.myblog.com/foo/aabb
Route::get("foo/{name}",function($name){
    return $name;
})->where("name",'[A-Za-z]+');

//可选路由
//http://www.myblog.com/boo  这样默认显示  aaa
//http://www.myblog.com/boo/james  如果是这样就显示  james
//这不可以填写 数字 
Route::get("boo/{name?}",function($name="aaa"){
    return $name;
})->where("name",'[A-Za-z]+');


带自定义名称的路由
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
你也可以使用 route 辅助函数,生成命名控制器路由的 URL:
//解析写在route.php 中的url地址
$url = route('name');


//生成url地址
url("admin/login");


//得到正在编辑的这个控制器与方法
namespace App\Http\Controller\Admin;
class ManageController extends CommonController{
    
    public function index(){
        $url = Route::currentRouteAction();
        echo $url;            
    }
}
//打印出:App\Http\Controllers\Admin\ManageController@index


//通过正在编辑的控制器得到访问这个控制器的url地址
namespace App\Http\Controller\Admin;
class ManageController extends CommonController{
    
    public function index(){
        $url = action('Admin\ManageController@store');
        echo $url;           
    }
}
// 打印出:http://www.myblog.com/admin/manage


正则表达式限制参数#

Route::get('user/{name}', function ($name) {
    //
})
->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    //
})
->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

/*
全局限制
解析:项目中id,sortId这个属性就是数字,没有其他的格式,如果要控制{id} 
这个参数全部使用正则来匹配,一个一个规则的写岂不是太麻烦?
这样就使用到了全局限制。
打开app\Providers\RouteServiceProvider.php 这个文件
找到boot方法
public function boot(Router $router){
        //
       parent::boot($router);
    }
修改成

public function boot(Router $router){
        //
        $router->pattern('id', '[0-9]+');
        parent::boot($router);
    }   
    
    
这样就可以限制Id的类型了。  

模式一旦被定义,便会自动应用到所有使用该参数名称的路由上:
Route::get('user/{id}', function ($id) {
    // Only called if {id} is numeric.
});
  
*/

资源路由

Route::resource("user","UserController");  //处理全部的路由


也可选择性的声明:可以指定让路由仅处理一部分的行为:

Route::resource("manage","ManageController",['only'=>['index','show']]);

Route::resource("manage","ManageController",['only'=>['index','show']]);
Route::resource("manage","ManageController",['except'=>['store','create','edit','update','destroy']]);

//控制器中间件
//可以将某一个中间件指定给一个控制器使用,例如下代码:

Route::get('profile', [
    'middleware' => 'auth',
    'uses' => 'UserController@showProfile']
    );

class UserController extends Controller{
    /**
     * 添加一个 UserController 实例。
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log', ['only' => ['fooAction', 'barAction']]);

        $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
    }
}



HTTP请求:



说一下$request的来源

//get|head manage/{manage}/edit
//声明了$request
public function edit($manage,Request $request){
    $_data=Manage::find($manage);
    Tools::P($request->url());
    //$_data->pass=Crypt::encrypt("adminb");
    //$_data->save();
    dd($_data);
}

//声明了 $request 
public function edit(Request $request,$manage){
    $_data=Manage::find($manage);
    Tools::P($request->url());
    //$_data->pass=Crypt::encrypt("adminb");
    //$_data->save();
    dd($_data);
}

//上面有了$request了,就可以调用方法了。
http://www.myblog.com/admin/login
public function login(Request $request){
    
    Tools::P($request->path());  //admin/login
    Tools::P($request->is("admin/*")); // 1
    Tools::P($request->url());// http://www.myblog.com/admin/login
    Tools::P($request->method()); // POST
    Tools::P($request->isMethod("post")); //1
    Tools::P($request->except("_token")); 
    /**
     * Array
    (
    [username] => sdafasdfasdf
    [password] => asdfadsf
    [code] =>
    )
    **/
}



表单验证失败后,保存原有的数据不丢失:

第一步:
$request->flash();
$request->flashOnly("username,level");
$request->flashExcept("pass");

第二步:使用withInput() 这样的方法去把变量输出出去。

return redirect("admin/manage/login")->withdErrors($validator)->withInput();

return back()->withdErrors($validator)->withInput();
return back()->withErrors($validator)->withInput($request->except("level"));  
 //如果不想保存哪个值,直接在这里填写即可 level 不保存
 //这是一种方法,还有一种方法就是 {{old("level")}}  这句代码不写在input 的value上面。
return back()->withErrors($validator)->withInput($request->only("level"));

第三步:输出缓存

php: $request->old("username");

blade模版:{{old("username")}}


以上就可以保证表单验证失败,保证数据不丢失。

public function store(Request $request){
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

        // 保存文章...    
}



代码如下:
public function store(Request $request){
        //$input=Input::all();
        $input=Input::except("_token");
        //需要进行验证
        $rules=[
            "username"=>"required",
            "pass"=>"required"
        ];
        $message=[
            "username.required"=>"用户名不能为空",
            "pass.required"=>"密码不能为空"
        ];
        $validator=Validator::make($input,$rules,$message);
        if($validator->passes()){
            //保存
            $res=Manage::create($input);
            if($res){
                echo "success";
            }else{
                $request->flash();
                return back()->with("errors","数据添加失败")->withInput();
            }
        }else{
            $request->flash();
            //return back()->withErrors($validator)->withInput($request->except("level"));
            return back()->withErrors($validator)->withInput($request->only("level"));
        }
    }
    
    
    //create.blade.php  模版文件
     <form action="{{url('admin/manage')}}" method="post">
        {{csrf_field()}}
        <p>姓名:<input type="text" value="{{old('username')}}" name="username"></p>
        <p>密码:<input type="password" name="pass"></p>
        <p>昵称:<input type="text" name="nicename"></p>
        <p>等级:<input type="text" value="{{old('level')}}" name="level"></p>
        <p><input type="submit" value="提交"></p>
    </form>

    
/**
上传文件#
获取上传文件#
你可以使用 Illuminate\Http\Request 实例中的 file 方法获取上传的文件。
file 方法返回的对象是 Symfony\Component\HttpFoundation\File\UploadedFile 
类的实例,该类继承了 PHP 的 SplFileInfo 
类并提供了许多和文件交互的方法:
**/
$file = $request->file('photo');
/**
确认文件是否有上传#
你可以使用请求的 hasFile 方法确认上传的文件是否存在:
**/
if ($request->hasFile('photo')) {
    //
}
/**
确认上传的文件是否有效#
除了检查上传的文件是否存在外,
你也可以通过 isValid 方法验证上传的文件是否有效:
**/
if ($request->file('photo')->isValid()) {
    //
}
/**
移动上传的文件#
若要移动上传的文件至新位置,则必须使用 move 方法。
该方法会将文件从缓存位置(由你的 PHP 配置决定)
移动至你指定的永久保存位置:
**/
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);



路由响应

Response

/**
重定向#
重定向响应是类 Illuminate\Http\RedirectResponse
 的实例,并且包含用户要重定向至另一个 URL 所需的标头。
 有几种方法可以生成 RedirectResponse 的实例。
 最简单的方式就是通过全局的 redirect 辅助函数:
 **/
Route::get('dashboard', function () {
    return redirect('home/dashboard');
});
/**
有时你可能希望将用户重定向至前一个位置,
例如当提交一个无效的表单之后。
这时可以使用全局的 back 辅助函数来达成这个目的:
**/
Route::post('user/profile', function () {
    // 验证该请求...

    return back()->withInput();
});
/**
重定向至命名路由#
当你调用 redirect 辅助函数且不带任何参数时,
将会返回 Illuminate\Routing\Redirector 的实例,
你可以对该 Redirector 的实例调用任何方法。
举个例子,要生成一个 RedirectResponse 
到一个命名路由,你可以使用 route 方法:
**/
return redirect()->route('login');
/**
如果你的路由有参数,
则可以将参数放进 route 方法的第二个参数:
**/
// For a route with the following URI: profile/{id}

return redirect()->route('profile', [1]);
/**
如果你要重定向至路由且路由的参数为 Eloquent 模型的「ID」,
则可以直接将模型传入,ID 将会自动被提取:
**/
return redirect()->route('profile', [$user]);
/**
重定向至控制器行为#

你可能会希望生成重定向至 控制器的行为。要做到这一点,
只需传递控制器及行为名称至 action 方法。请记得,
你不需要指定完整的命名空间,因为 Laravel 的 
RouteServiceProvider 会自动设置默认的控制器命名空间:
**/
return redirect()->action('HomeController@index');
/**
当然,如果你的控制器路由需要参数的话,
你可以传递它们至 action 方法的第二个参数:
**/
return redirect()->action('UserController@profile', [1]);
/**
重定向并加上 Session 闪存数据#

通常重定向至新的 URL 时会一并 
写入闪存数据至 session。所以为了方便,
你可以利用链式调用的方式创建一个 RedirectResponse 
的实例 并 闪存数据至 Session。
这对于在一个动作之后保存状态消息相当方便:
**/
Route::post('user/profile', function () {
    // 更新用户的个人数据...

    return redirect('dashboard')->with('status', 'Profile updated!');
});
/**
当然,在用户重定向至新的页面后,
你可以获取并显示 session 的闪存数据。
举个例子,使用 Blade 的语法:
**/
@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif


其它响应类型

//使用辅助函数 response 可以轻松的生成其它类型的响应实例。
//当你调用辅助函数 response 且不带任何参数时,
//将会返回 Illuminate\Contracts\Routing\ResponseFactory
 //contract 的实现。
 //此 Contract 提供了一些有用的方法来生成响应。
 
//视图响应#
//如果你想要控制响应状态码及标头,
//同时也想要返回一个 视图作为返回的内容时,
//则可以使用 view 方法:

return response()->view('hello', $data)->header('Content-Type', $type);

//当然,如果你没有自定义 HTTP 状态码及标头的需求,
//则可以简单的使用全局的 view() 辅助函数。

//JSON 响应#
//json 方法会自动将标头的 Content-Type 设置为 application/json,
//并通过 PHP 的 json_encode 函数将指定的数组转换为 JSON:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);

//如果你想创建一个 JSONP 响应,
//则可以使用 json 方法并加上 setCallback:
return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

文件下载#
//download 方法可以用于生成强制让用户的浏览器下载指定路径文件的响应。
//download 方法接受文件名称作为方法的第二个参数,
//此名称为用户下载文件时看见的文件名称。
//最后,你可以传递一个 HTTP 标头的数组
//作为第三个参数传入该方法:

return response()->download($pathToFile);

return response()->download($pathToFile, $name, $headers);                 






//验证规则
'username'              => 'required|unique:users,username|between:4,25',
'name'                  => 'required|max:75',
'email'                 => 'required|email|max:75|unique:users,email|confirmed',
'password'              => 'required|min:4|confirmed',