Laravel

目录

安装

配置

目录

路由

控制器

简言


安装

本次安装环境为Windows操作系统+ php 7.3.12+ composer。

本次安装的Laravel版本是4.2.8。

首先需要保障php.ini里面开启了Laravel所需要的一些拓展,例如openssl,fileinfo,mbstring,PDO等。

运行

composer global require laravel/installer

然后就可以使用laravel命令了。全局安装路径是在C盘的composer文件夹下,安装的文件体积小,不用移除。

然后在网站目录,运行

laravel new blog

或者

composer create-project --prefer-dist laravel/laravel blog

就能够自动下载一个目录名称是blog的Laravel应用程序,可以此为模板来学习开发。

如果安装出错,那么就根据错误提示【可能是因为php.ini未开启所需拓展】来处理,处理完后删除blog应用,然后重新生成blog应用。

然后在命令行里切换目录到blog目录下,运行

php artisan serve

再在浏览器里访问http://localhost:8000/正常情况下就可以看到如下页面:

 可以取消app\Providers\RouteServiceProvider.php里对于$namespace的那行注释,以方便在路由配置文件里制定控制器方法路径时,不需要带上命名空间。

配置

安装完成后,需要将Laravel项目的public文件夹作为网站根目录,index.php作为入口文件。

项目的配置文件存放在config文件夹。需要根据实际情况修改config文件夹里的debug、timezonelocale这两个配置项。

示例代码:

'debug' => (bool) env('APP_DEBUG', true),
'timezone' => 'PRC',
'locale' => 'zh_cn',

需要保障bootstrap/catchstorage文件夹有写入权限,如果使用了Homestead虚拟机,那么权限应该会被自动设置好。

需要给Laravel应用设置一个随机字符串应用密钥,这个密钥保存在项目根目录下的.env文件里的配置项APP_KEY里。

.env文件【环境配置文件】属于私密文件,不应该被提交到应用程序的源代码管理【如git】。但是可以提交.env.example文件到应用程序的源代码管理,以方便项目的其它开发者知道自己开发项目需要用到哪些环境变量。

还可以在项目根目录下创建一个.env.testing文件,里面的内容会在运行PHPUnit单元测试或运行Artisan命令指定--env=testing时覆盖.env文件里的内容。

.env文件里的配置值都可以被系统配置或者环境配置所覆盖。如果配置值里含有空格,则配置值前后应使用双引号。

.env文件里的所有设置在应用运行时会被解析为字符串并加载到php全局变量$_ENV中,如empty会被解析为空字符串。

Laravel提供了一个助手函数env用于读取环境配置文件里的参数,第二个参数值用来设置默认值。

代码示例:

'debug' => env('APP_DEBUG'.false),

 Laravel提供了config函数来读取和设置配置项。

示例代码:

$timezone = config('app.timezone');
config(['app.timezone' => 'UTC']);

可以通过php artisan down指令来启动应用的维护模式,还有一些选项用来设置显示信息、HTTP标头值、特定通过IP或网段。当应用程序处于维护模式时,将会对应用程序的所有请求显示一个自定义视图【resources/views/errors/503.blade.php】。

可通过php artisan up指定来停用应用的维护模式。

目录

【模型目录】

app/Models 为应用的模型目录。

【应用程序目录】

app目录里存放有应用的核心代码。其中Http目录里存放着控制器和中间件,Providers目录存放着应用程序的默认提供服务类,Exceptions目录里存放着处理应用程序异常的文件【Handler.php】。

【引导目录】

bootstrap目录里存放有框架引导文件app.php和cache文件夹,cache文件夹里包含有【框架生成的】用于性能优化的文件。

【配置目录】

config目录里存放有应用程序的所有配置文件。所有的应用程序服务提供者【Service Providers】注册在config/app.php。

【数据库目录】

database目录里存放有数据库迁移,模型工厂和子数据库。

【公共目录】

public目录里存放有应用程序接收所有请求的入口文件index.php,和图像、css、js等静态文件。

【资源目录】

resources目录里存放有视图、未编译的原始文件【如sass】、语言文件。

【路由目录】

routes目录里web.php可用来提供csrf防护和cookie加密,channels.php可用来注册应用程序支持的所有事件广播频道。

【存储目录】

storage目录里的app目录可用来存放应用程序生成的任何文件,framework目录可用来存放框架生成的缓存文件,logs目录里存放有应用程序的日志文件。

【测试目录】

tests目录里可用来进行PHPUnit单元测试,每个测试类的名称都应该用Test结尾,可以使用phpunit或者php vendor/bin/phpunit 命令来测试。

【依赖类库目录】

vendor目录存放着Composer下载的应用程序依赖类库文件。

路由

路由器允许注册响应get、post、put、patch、delete、options这些HTTP 请求方式的方法。如果需要注册响应不止一个HTTP请求方式的路由,可以使用match方法。如果需要注册响应HTTP所有请求方式的路由,可以用any方法。

代码示例:

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('/', function () {
    //
});

所有指向get、post、delete路由方式的表单里都需要加上一个CSRF Token【令牌】表单项,否则请求会被拒绝。

示例代码:

<form method="POST" action="/profile">
    @csrf
    ...
</form>

Route::redirect方法可用来重定向,还可以制定HTTP响应状态码。

Route::View方法可用来返回一个视图,第三个参数可用来给视图传递数据。

如果某条路由URI中需要传入参数,可以在传入参数位置用{}符号将参数名括起来,默认该项不能为空,否则会匹配不上该条路由。如果该参数是可选参数,那么应该在参数名后加上一个符号?【同时注意处理该路由参数时设置默认值】。

示例代码:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

路由参数里可以使用字符'_',不可使用字符'-'。

如果需要限制路由参数格式,那么可以对路由实例使用where方法。

示例代码:

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

如果想对所有路由里的某个参数名称固定一个限制规则,可以在app/Providers/RouteServiceProvider.php的boot方法里对该路由参数设置限制规则。

示例代码:

public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

可用Route::group方法来设置共享路由属性【如中间件或命名空间】的路由组,如果共享的路由属性是中间件的话,那么会按照设置的顺序执行。

示例代码:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });

    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

可使用Route::fallback方法注册一个路由规则,并将其放在路由文件的末尾,来处理其它路由都匹配不上传入的请求URL的情况,一种常用的处理方式是跳往404页面。

可通过对路由设置throttle中间件来限制请求访问的频率。

示例代码:

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

如果直接在路由规则里设置闭包函数返回视图,那么就不需要经过控制器再去处理请求。但要注意基于闭包的路由不能被缓存,如果需要使用路由缓存,那么需要将路由规则里的闭包函数改为控制器类。

如果应用是专门使用基于控制器类的路由,那么就应该设置路由缓存,这可以大大减少注册应用程序所有路由的时间,有时提升速度可以达到100倍。不建议在项目调试期间开启路由缓存,可以在应用部署后,在服务器应用根目录下运行:

php artisan route:cache

如果需要清除路由缓存,则可以运行:

php artisan route:clear

可以通过name方法给路由规则起个名称,然后就可以通过route('路由名称')来调用路由。

示例代码:

//控制器处理
Route::get('/user', 'UserController@login')->name(login);

//直接返回视图
Route::view('/user', 'user.login')->name('login');

//调用路由
return route(login);

控制器

继承基础控制器类可以直接使用一些简便方法,例如middleware方法可帮助在控制器里注册中间件,validate方法可用来验证请求是否符合给定的验证规则,dispath方法可用来分派作业给相对应的处理程序。

可以通过在应用根目录下执行

php artisan make:controller TestController

来实现在应用的控制器目录下新增一个TestController文件,然后需要在/routes/web.php文件里添加访问这个控制器方法的路由,如:

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

注意如果app/Providers/RouteServiceProvider.php里没有取消对$namespace的注释,那么在路由规则里指定控制器方法路径时就需要带上命名空间,而且命名空间应该放在路由设置语句里,如果在/routes/web.php文件里用use引入控制器类的命名空闲,可能会无效而导致访问时出现404错误。

如果控制器里只有一个方法,那么可以将该方法名设置为__invoke,这样在设置访问该方法的路由路径时不需要写上方法名。可通过在命令行运行

php artisan make:controller ShowController --invokable

来创建这样的控制器。

注册资源控制器可通过如下命令创建:

php artisan make:controller PhotoController --resource

创建成功后,就可以在生成的控制器文件里看到具有RESTful风格的几个方法,其中indexcreateshowedit方法对应是GET请求方式,store方法对应的是POST请求方式,update方法对应的是PUT或PATCH请求方式,destroy方法对应的是DELETE请求方式。

然后可以在/app/route/web.php按如下方式注册资源路由:

Route::resource('/photo','PhotoController');

可以在注册资源路由时通过except【排除】和only【仅限】方法进一步限制路由匹配。也可以在设置资源路由前针对个别请求方式另外设置路由规则【放在前面优先级更高】。

HTML表单不支持PUT、PATCH和DELETE方式提交表单,如果需要PUTPATCHDELETE方式提交表单,那么可使用@method指令创建一个名称为“_method”的隐藏表单域,Laravel会将_method隐藏表单域里的值当作HTTP请求方式。

示例代码:

<form action="/foo/bar" method="POST">
    @method('PUT')
</form>

简言

1. Laravel会根据请求类型将传入的请求发送到HTTP内核或控制台内核。HTTP内核位于app/Http/kernel.php。

2. Laravel服务容器是用来管理类依赖和执行依赖注入的工具。依赖注入是指通过构造函数或者其它方法将类的依赖注入到类中。如果一个类不依赖于任何接口,则不需要将其绑定到容器中。

3. 容器可以根据反射自动解析传入的对象,因此不需要指示容器如何构建这些对象。

4. 服务容器每次解析对象时都会触发一个事件,可以通过resolving()方法把正在解析的对象传给自定义回调函数,这样就能在将对象提供给使用者之前对这个对象进行额外操作,例如增加属性。

5. 中间件可用于处理和过滤传入应用的HTTP请求,例如登录验证和防CSRF攻击。创建新的中间件,可以通过在命令中使用make:middleware来实现。例如:

php artisan make:middleware CheckAge

可以把中间件理解为是一系列请求和应用程序之间的“中间层”。可在app/Http/Kernel.php$middleware【路由组则是$middlewareGroups属性】属性中注册应用于所有HTTP请求的中间件,如果需要针对路由来使用中间件,那么就需要在app/Http/Kernel.php里的$routeMiddleware属性里注册该中间件,然后在路由文件的对应路由规则里设置它。

6. Service Providers是整个Laravel应用程序引导的中心,负责引导框架的各种组件。服务提供类里有register和boot两个方法,register【注册】方法用来绑定服务到容器,boot【引导】方法是在所有服务里的register方法执行完后才执行,因为有的服务可能需要调用其它注册的服务。一旦应用程序被引导并且注册了所有的服务提供者,那么请求就会被交给路由器进行调度。

7. 对于一些网站共用的版块,例如热门文章,可以提取出来作为小的视图文件,然后在app/Http/ViewComposers目录下新建一个类用于实现获取数据并将数据注入到视图中,再在AppServiceProvider.php里将获取数据的类注册给那些小的视图文件。注意ViewComposer类里的是compose方法【Laravel在渲染指定的模板时调用】,而AppServiceProvider.php里用的composer方法【注册一个视图composer事件】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值