澳门太阳娱乐集团官网-太阳集团太阳娱乐登录

laravel 基础教程 —— 乞求
分类:脚本专栏

在现实中,如果你明白了你所使用工具的工作原理,你就会在使用的时候非常的自信。开发应用并没有什么不同,当你弄懂了这些开发工具功能,你就会在使用时得心应手。

为了通过依赖注入能够方便的获取http请求实例,你应该在控制器的构造函数或者控制函数中写入类型声明IlluminateHttpRequest。当前请求的实例会自动的从服务容器中注入:

在其他框架中,分页通常是比较痛苦的。laravel 使其变的非常简单。laravel 可以根据当前页面快速的生成智能的范围链接,并且其生成的 HTML 是兼容 Bootstrap CSS framework 的。

这份文档会深层次的带你浏览 laravel 框架是如何工作的。通过对框架更全面的了解,一切都会显得不再那么神秘,你会更加自信的去构建应用。

<?phpnamespace AppHttpControllers;use IlluminateHttpRequest;class UserController extends Controller { public function store (Request $request) { $name = $request->input; }}

对查询构建器结果进行分页

这里有几种方式来对元素进行分页。而最简单的方式就是通过使用查询构造器或者 Eloquent 查询的 paginate 方法。paginate 方法会根据当前用户所访问的当前页面来自动的设置正确的位移和显示的范围。默认的,当前页面是通过 HTTP 请求的查询字符串 ?page 来自动获取的。当然,laravel 会自动的检测到这个值,并且会自动的在生成的分页器的链接中插入合适的值。

首先,让我们来看一下在查询中调用 paginate 方法。在这个例子中,你仅需要在 paginate 方法中传递每页所需要展示的数量。让我们来设置每页展示的数量为 15 :

<?phpnamespace AppHttpControllers;use DB;use AppHttpControllersController;class UserController extends Controller{ /** * Show all of the users for the application. * * @return Response */ public function index() { $users = DB::table->paginate; return view('user.index', ['users' => $users]); }}

注意:目前,laravel 中使用 groupBy 语法不能正确的进行分页操作。如果你需要使用 groupBy 来对结果进行分页,推荐你手动的执行查询和进行分页。

简单的分页

如果你只需要简单的显示“上一页”和“下一页”链接,你可以选择使用 simplePaginate 方法来执行一个有效的查询。这对于一些大型的数据库在视图中不需要显示每一页的链接时非常有效:

$user = DB::table->simplePaginate;

对 Eloquent 结果进行分页

你也可以对 Eloquent 查询的结果进行分页。我们来对 User 模型以每页显示 15 项的方式来进行分页。其语法和使用查询构造器进行分页非常像:

$users = AppUser::paginate;

当然,你也可以优先进行其他查询之后再进行分页操作:

$users = User::where('votes', '>', 100)->paginate;

你同样也可以在 Eloquent 模型分页时使用 simplePaginate 方法:

$user = User::where('votes', '>', 100)->simplePaginate;

如果你并不能理解该文档的所有内容,请不要伤心。你需要先试着掌握一些基本的概念,你的知识体系会随着对文档的探索而增长。

如果你的控制器方法也需要接收来自路由的参数,那么你需要在进行依赖注入的参数之后添加要接收的参数。例如,你的路由是这么定义的:

手动的创建分页器

有时候你可能需要手动的创建一个分页实例,它传递项目的数组。你可以创建 IlluminatePaginationPaginator 或者 IlluminatePaginationLengthAwarePaginator 实例,这取决于你的需求。

Paginator 类不需要知道结果中项目的总数量。事实上,正是因为这样,这个类并没有提供获取最后一页的方法。LengthAwarePaginator 类似于 Paginator 接收几乎同样的参数。但是,它需要在结果中包含项目的总数目。

另一方面,Paginator 对应查询构造器和 Eloquent 中的 simplePaginate 方法。而 LengthAwarePaginator 对应 paginate 方法。

当手动的创建分页器实例时,你应该手动的对传递到分页器中的结果进行切片操作,如果你并不明白如何去进行分片,请查看 PHP 的 array_slice 方法。

当你对查询构造器或者 Eloquent 查询使用 paginate 或者 simplePaginate 方法时,你可以获取到分页器的实例。当调用 paginate 方法时,你会获取到一个 IlluminatePaginationLengthAwarePaginator 实例,当调用 simplePaginate 方法时,你会获得一个 IlluminatePaginationPaginator 的实例。这些对象会提供多种方法来描述结果集。除了这些帮助方法,分页器本身也是一个迭代器,它可以像数组一样被循环操作。

所以,一旦你获取到了分页结果,你可以像这样在 Blade 视图中来显示和生成分页链接:

<div > @foreach ($users as $user) {{ $user->name }} @endforeach</div>{{ $users->links() }}

links 方法会根据结果集来生成分页结果。对每一个链接都会自动包含 ?page 查询变量。使用 links 方法生成的 HTML 是兼容 Bootstrap CSS 框架的。

自定义分页器 URL

setPath 方法允许你对分页器生成的链接的 URI 进行定制化。比如,你希望分页器生成类似于 http://example.com/custom/url?page=N,你可以传递 custom/urlsetPath 方法:

Route::get('users', function () { $users = AppUser::paginate; $users->setPath('custom/url');});

追加查询字符串到分页器链接

你可以通过使用 appends 方法来添加查询字符串到分页器链接中。比如,在分页器链接中追加 &sort=votes 查询字符串。你可以像下面一样调用 appends 方法:

{{ $users->appends(['sort' => 'votes'])->links() }}

如果你需要在分页器的 URLs 中添加一个 hash 分段,你可以使用 fragment 方法。比如,在分页链接中添加 #foo

{{ $users->fragment->links() }}

其他帮助方法

你可以调用分页器实例的下面的方法来访问额外的分页器信息:

  • $results->count()
  • $results->currentPage()
  • $results->firstItem()
  • $results->hasMorePages()
  • $results->lastItem() (Not avaliable when using simplePaginate)
  • $results->nextPageUrl()
  • $results->perPage()
  • $results->previousPageUrl()
  • $results->total() (Not available when using simplePaginate)
  • $results->url

laravel 的分页器类实现了 IlluminateContractsSupportJsonableInterface 契约并且暴露了 toJson 方法,所以它可以非常简单的将分页结果转换为 JSON 格式。

你也可以在路由或者控制器动作中简单的返回分页器实例来进行 JSON 格式的响应:

Route::get('users', function () { return AppUser::paginate;

分页器的 JSON 信息会包含许多的元数据,比如 totalcurrent_pagelast_page 等等。而实际的结果对象集会保存在 JSON 数组的 data 键中。下面是一个从路由中返回分页器实例的响应示例:

分页器 JSON 示例

{ "total": 50, "per_page": 15, "current_page": 1, "last_page": 4, "next_page_url": "http://laravel.app?page=2", "prev_page_url": null, "from": 1, "to": 15, "data":[ { // Result Object }, { // Result Object } ]}

第一件事

laravel 应用中的所有请求的入口都是 pulic/index.php 文件,所有的请求都会被导向该文件。 index.php 文件中并没有存储太多的代码,相反,它只是用于装载框架的其余部分的起始点。

index.php 文件会加载 Composer 生成的自动加载器配置信息,然后从 bootstrap/app.php 文件中加载 laravel 应用的实例,Laravel 的第一个动作就是创建一个服务容器的实例。

Route::put('user/{id}', 'UserController@update');

HTTP / Console 内核

根据请求进入应用程序的类型,请求将会被分配到 HTTP 内核 或 Console 内核处理。这两个内核都会作为所有请求流经过的中心处理器。现在,让我们只聚焦在 HTTP 内核上,它被存储在 app/Http/Kernel.php 文件中。

HTTP 内核继承自 IlluminateFoundationHttpKernel 类,这个类定义了一个 bootstrappers 的数组,这些类会在请求被处理前运行。这些 bootstrappers 执行错误处理,日志,检测当前应用环境的配置和提供一些其它在请求被处理前执行的任务。

HTTP 内核也定义了一些 HTTP 中间件,所有请求在被处理前都会经过这些中间件。这些中间件包括了读写 HTTP Session 的中间件,判断当前站点是否是维护状态的中间件,验证 CSRF Token 的中间件,等等。

HTTP 内核的 handle 方法非常的简单:接收一个 Request 返回一个 Response。你可以把这个核心想象成一个黑盒子,左边 HTTP 请求进去,右边返回 HTTP 响应。

那么你应该先声明依赖注入IlluminateHttpReqeust,然后再按序的传递路由参数:

服务提供者

启动内核中最重要的一步就是为你的应用加载服务提供者。所有的服务提供者都在 config/app.php 文件的 providers 数组中进行配置。首先,所有经过配置的提供者都会执行其自身的 register 方法,然后当所有提供者都完成注册之后,才会陆续的触发 boot 方法。

服务提供者主要负责启动框架中的各个组件,比如数据库组件、队列、验证和路由组件。因为框架中的各种核心功能都是从这里被提供的,所以服务提供者是整个框架启动中最重要的一环。

<?phpnamespace AppHttpControllers;use IlluminateHttpRequest;class UserController extends Controller { public function update (Request $request, $id) { // }}

分发请求

一旦应用启动完成并且所有的服务提供者都完成注册,Request 将会移交到路由器进行分发。路由器将会分发该请求到路由或者控制器中,同时也会经过路由特定的中间件。

服务提供者是 laravel 应用能够成功启动的最关键的部分。首先创建应用的实例,然后注册服务提供者,再然后处理已经启动成功应用的请求。整个请求流程就是这么简单。

能够深刻理解 laravel 是如何通过服务提供者进行启动和构建应用是非常有价值的。当然你的应用中默认的服务提供者都被存储在 app/Providers 目录中。

默认的,AppServiceProvider 是一个空的类,这里是你在应用中添加自己的启动项和做服务容器绑定的好去处。当然,在大型应用中,你可以自行的创建一些服务提供者,以使每一个提供者都具有单一的职责。

基础的请求信息

IlluminateHttpRequest的实例为你的应用提供了多种检查HTTP请求的方法,它继承自SymfonyComponentHttpFoundationRequest。这里列举了一些常用的方法:

path方法返回请求的URI.所以,当请求的目标地址是http://domain.com/foo/bar时,path方法将返回foo/bar:

$uri = $request->path();

is方法允许你来效验所请求的URI是否匹配所提供的模式。你可以使用 *字符来作为通配符:

if ($request->is('admin/*')) { //}

如果你想得到请求的完整路径,那么你可以使用 urlfullUrl 方法:

// Without Query String...$url = $request->url();// With Query String...$url = $request->fullUrl();

你也可以在获取完整请求路径的同时追加请求的参数信息,例如,如果请求的目标是 http://domain.com/foo, 下面的方法将返回http://domain.com/foo?bar=baz:

$url = $request->fullUrlWithQuery(['bar' => 'baz']);

method方法将返回HTTP请求的方式。你也可以使用isMethod方法来进行http请求方式的匹配效验:

$method = $request->method();if ($request->isMethod { //}

PSR-7 请求

PSR-7标准为http指定了一些消息接口,包括请求和响应.如果你想获得PSR-7请求的实例,你需要先安装一些支持库,laravel使用了 Symfon HTTP Bridge 组件来转换典型的laravel请求和响应为PSR-7兼容的实现:

composer require symfony/psr-http-message-bridgecomposer require zendframework/zend-diactoros

一旦你安装了这些库,你就可以简单在你的路由或控制器中使用类型提示来获取PSR-7请求:

use PsrHttpMessageServerRequestInterface;Route::get('/', function (ServerRequestInterface $request) { // });

如果路由或控制器返回的是PSR-7响应的实例, 那么它会自动的转换为laravel响应实例。

获取输入的值

你可以通过IlluminateHttpRequest实例的一些方法来简便的获取用户的输入值.而且你并不需要去关心用户所使用的HTTP请求方式,你可以通过input方法获取所有请求方式的值:

$name = $request->input;

你也可以传递第二个参数到input方法,如果该值并不存在于请求中,将作为默认值返回:

$name = $request->input('name', 'Sally');

当表单提交的一些输入值是数组时,你可以使用.操作符来访问请求中的数组值:

$name = $request->input('products.0.name');$names = $request->input('products.*.name');

获取JSON请求的输入值

你同样可以使用input方法来访问json请求,只要json请求被设置了正确的请求头 Content-Type: application/json, 那么你就可以使用 . 语法来深入访问json中的数组:

$name = $request->input('user.name');

判断输入值是否存在

你可以使用has方法来判断,请求中是否包含了用户的某个输入值,如果该值不是空的字符串,那么has方法就会返回true:

if ($request->has { //}

获取所有的输入值

你可以使用all方法来获取所有的用户输入值, 该方法返回包含所有用户值的数组:

$input = $request->all();

获取部分输入值

你可以使用only或者except方法来获取部分输入值, 这两个方法都接收一个单独的数组或者动态的参数列表:

$input = $request->only(['username', 'password']);$input = $request->only('username', 'password');$input = $request->except(['credit_card']);$input = $request->except('credit_card');

动态属性

你可以通过IlluminatHttpRequest的实例的动态属性来获取用户的输入值.如果你的应用表单中存在name字段,你可以通过下面的方式来获取该请求字段:

$name = $request->name;

当使用动态属性时,laravel会首先查找请求中是否包含该值,然后才会检索路由中的参数.

laravel允许你在下一次请求期间保持该次请求的输入。这种特性在表单验证出错时尤其有用,它可以使你复用上一次的请求进行自动的填充。如果你使用了laravel的验证服务,那么你不需要手动的调用它们,因为laravel内置的验证机制会自动的调用它们。

闪存输入到会话

IlluminateHttpRequest实例的flash方法会闪存当前请求的输入到会话中,这样可以使应用在接受用户的下次请求时进行复用:

$request->flash();

你也可以使用flashOnlyflashExcept 方法来闪存部分请求输入到会话:

$request->flashOnly(['username', 'email']);$request->flashExcept('password');

闪存输入到会话接着跳转

一个常用的场景就是你需要连同用户的输入一起返回到上一页中,那么你可以使用withInput链式方法:

return redirect->withInput();return redirect->withInput($request->except('password'));

获取旧输入

你可以使用old方法来获取上一次请求所闪存的用户请求:

$username = $request->old('username');

laravel提供了全局old帮助方法。你也可以在blade模板中使用该方法,如果上次请求未闪存该输入,则会返回null:

<input type="text" name="username" value="{{ old('username') }}">

从请求中检索cookie

在laravel中所有的cookie在被创建时都会经过一个认证码进行签证加密,这就意味着laravel会验证客户端对cookie的修改.你可以使用IlluminateHttpRequest实例的cookie方法来获取cookie值:

$value = $request->cookie;

在响应中附加一个新的cookie

laravel提供了一个全局的cookie帮助方法用来生成一个SymfonyComponentHttpFoundationCookie实例,该实例可以被IlluminateHttpResponse实例的withCookie附加:

$response = new IlluminateHttpResponse('Hello World');$response->withCookie('name', 'value', $minutes);return $response;

你可以使用cookie方法来创建一个长达5年的长cookie,它要求你使用不带参数的cookie帮助方法直接调用forever方法:

$response->withCookie->forever('name', 'value'));

获取上传的文件

你可以通过IlluminateHttpRequestfile方法来访问上传的文件。该方法会返回一个SymfonyComponentHttpFoundationFileUploadedFile类的实例,它继承自SplFileInfo,提供了多种与文件交互的方法:

$file = $request->file;

你可以使用hasFile方法来判断文件在请求中是否存在:

if ($request->hasFile { // }

验证文件是否上传成功

你可以使用isValid方法来验证文件上传的过程中是否出错:

if ($request->file->isValid { //}

移动上传的文件

你可以使用move方法来将上传的文件从临时目录中迁移到指定的目录中:

$request->file->move($destinationPath);$request->file->move($destinationPath, $fileName);

其他文件方法

UploadedFile还有其他许多可用的方法,你可以查看 该类的API文档 来了解更多.

本文由澳门太阳娱乐集团官网发布于脚本专栏,转载请注明出处:laravel 基础教程 —— 乞求

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文