“基本功能”的版本间的差异

来自tomtalk
跳转至: 导航搜索
(创建页面,内容为“==路由== <source lang='php'> // 简单路由 Route::get('/', function () { return view('welcome'); }); //为多重动作注册路由 Route::match(['get', 'po...”)
 
Tom讨论 | 贡献
blade模板
第310行: 第310行:
  
 
     <h3>include</h3>
 
     <h3>include</h3>
     @include('usersList')
+
     @include('usersList', ['users' => $users])
  
 
     <h3>each</h3>
 
     <h3>each</h3>

2017年2月14日 (二) 07:04的版本

路由

// 简单路由
Route::get('/', function () {
    return view('welcome');
});
 
//为多重动作注册路由
Route::match(['get', 'post'], '/get-post', function () {
    return 'get and post';
});
 
Route::any('foo', function () {
    return 'any foo ' . url('foo') . ' ' . url('router');
});
 
//路由参数
Route::get('posts/{pid}/comments/{comment?}', function ($pId, $commentId = 'empty') {
    return "postId = $pId, comments = $commentId";
});
 
//正则表达式限制参数。也可为参数设定全局规则pattern filter。
Route::get('user/{id}/{name?}', function ($id, $name = 'empty') {
    return "userId = $id, name = $name";
})->where(['id' => '[0-9]?', 'name' => '[a-z]+']);
 
//命名路由
Route::get('user/list', ['as' => 'userList', function () {
    return 'name router: ' . route('userList');
}]);
 
Route::get('user/info/{id?}', 'UserController@UserInfo')->name('userInfo');
 
//路由群组:中间件、命名空间、子域名、前缀
Route::group([
    /*'middleware' => 'auth',*/
    'namespace' => 'Member',
    'domain' => '{account}.tomtalk.net',
    'prefix' => 'member'], function () {
    Route::get('{id?}', 'MemberController@detail');
});
 
//CSRF保护:试了一下,还是不知道怎么用。
 
//路由模型绑定
Route::get('user/model/{user}', 'UserController@UserModel')->name('userModel');
 
//请求方法伪造 - echo method_field('PUT')
 
//抛出404错误 - abort(404)

中间件

HTTP中间件提供了一个方便的机制来过滤进入应用程序的HTTP请求。所有的中间件都放在app/Http/Middleware目录内。


创建一个中间件
php artisan make:middleware OldMiddleware
public function handle($request, Closure $next)
{
    if ($request->input('age') <= 200) {
        return redirect('home');
    }
 
    return $next($request);
}
前置中间件/后置中间件
public function handle($request, Closure $next)
{
    // 运行动作
 
    return $next($request);
}
 
public function handle($request, Closure $next)
{
    $response = $next($request);
 
    // 运行动作
 
    return $response;
}


全局中间件

若是希望每个HTTP请求都经过一个中间件,只要将中间件的类加入到app/Http/Kernel.php的$middleware属性清单列表中。


为路由指派中间件


中间件参数


Terminable中间件

有些时候中间件需要在HTTP响应被发送到浏览器之后才运行,例如,Laravel内置的「session」中间件存储的session数据是在响应被发送到浏览器之后才进行写入的。想要做到这一点,你需要定义中间件为「terminable」

控制器

基础控制器

//一旦你指定了控制器路由的名称,则可以很容易地生成能实现该行为的URL。
$url = route('name');
 
//你也可以使用action辅助函数生成指向控制器行为的URL。
$url = action('FooController@method');
 
//你可以使用Route facade的currentRouteAction方法取到正在运行的控制器行为名称。
$action = Route::currentRouteAction();

控制器中间件

可将中间件指定给控制器路由,例如:

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

不过,在控制器构造器中指定中间件会更为灵活。你可以很容易地将中间件指定给控制器。你甚至可以对中间件作出限制,仅将它提供给控制器类中的某些方法。

class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('log', ['only' => ['fooAction', 'barAction']]);
        $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
    }
}

RESTful资源控制器

Route::resource('photos', 'PhotosController');
 
//部分资源路由
Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);
Route::resource('photos', 'PhotosController', ['except' => ['create', 'store', 'update', 'destroy']]);
 
//命名资源路由
Route::resource('photos', 'PhotosController', ['names' => ['create' => 'photo.build']]);
 
//嵌套资源
Route::resource('photos.comments', 'PhotoCommentController');
 
//附加资源控制器
//如果想在资源控制器中默认的资源路由之外加入其它额外路由,则应该在调用Route::resource之前定义这些路由。否则,由resource方法定义的路由可能会不小心覆盖你附加的路由:
Route::get('photos/popular', 'PhotosController@method');
Route::resource('photos', 'PhotosController');
 
//隐式控制器
Route::controller('users', 'UserController');

请求

获取请求

要通过依赖注入的方式获取HTTP请求的实例,就必须在控制器的构造器或方法中,使用Illuminate\Http\Request类型提示。

use Illuminate\Http\Request;
 
class UserController extends Controller
{
    public function store(Request $request)
    {
        $name = $request->input('name');
        //
    }
}

如果控制器方法也有输入数据是从路由参数传入的,只需将路由参数置于其它依赖之后。

public function update(Request $request, $id)
{
    //
}
 
//基本请求信息
$uri = $request->path();  //返回请求的URI
$url = $request->url(); //获取完整的网址
 
//获取请求的方法
$method = $request->method();
if ($request->isMethod('post')) {
    //
}

获取输入数据

$name = $request->input('name');
 
$name = $request->name; //使用属性访问用户输入
 
//你可以在input方法的第二个参数中传入一个默认值。当请求的输入数据不存在于此次请求时,就会返回默认值:
$name = $request->input('name', 'Sally');
 
//确认是否有输入值
if ($request->has('name')) {
    //
}
 
//获取所有输入数据
$input = $request->all();
 
//获取部分输入数据
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
 
//将输入数据闪存至Session
$request->flash();
$request->flashOnly('username', 'email');
$request->flashExcept('password');
 
//闪存输入数据至Session后重定向
return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));
 
//获取旧输入数据
$username = $request->old('username');
{{ old('username') }}

Cookies

$value = $request->cookie('name');
 
//将新的 Cookie 附加到响应
$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;
 
//如果要创建一个可长期存在,为期五年的 cookie。
$response->withCookie(cookie()->forever('name', 'value'));

上传文件

$file = $request->file('photo');
 
//确认上传的文件是否存在:
if ($request->hasFile('photo')) {
    //
}
 
//确认上传的文件是否有效
if ($request->file('photo')->isValid()) {
    //
}
 
//移动上传的文件
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);

blade模板

所有 Blade 视图都会被编译缓存成普通的 PHP 代码,一直到它们被更改为止。这代表 Blade 基本不会对你的应用程序生成负担。

@extends('layouts.master')
 
@section('title', 'LaravelExample')
 
@section('sidebar')
    @parent
 
    <div>
        sidebar
    </div>
@endsection
 
@section('content')
    <h3>变量的使用</h3>
    <p>目前的 UNIX 时间戳为 {{ $time }}<p>目前的 UNIX 时间戳为 {{ time() }}<p>目前的 UNIX 时间戳为 @{{ time() }}<p>My name is {{ $name or 'Default' }}.
    <p>My name is {{ $html or 'html' }}.
    <p>My name is {!! $html or 'html' !!}.
 
    {{-- @符号如何显示 --}}
 
    <h3>include</h3>
    @include('usersList', ['users' => $users])
 
    <h3>each</h3>
    @each('userInfo', $users, 'name')
 
    {{-- 服务注入 --}}
 
    <h3>自定义模板指令</h3>
    @datetime(new Datetime())
@endsection