由于新加入的公司要求使用Linux系统,所以在痛苦的前两天中适应了Linux(deepin)的系统之后,现在已经基本适应了这个系统了。现在自己的工作电脑搭载的是LAMP环境,公司要求新人需要学习Laravel 框架,并且由于之前的php的知识不够扎实,在学Laravel框架的同时也将W3C中的内容过了一遍,并且在上下班的路上将PHP权威指南看了一遍。可能由于PHP设计的目的就是用于解决问题,所以基本都是很快的将知识过一遍,在往后的开发中需要的话,可能涉及到部分知识需要边工作边查。
所以接下来是要开始总结我这七天来所做的一些事情,当然我不会在这里讲太多关于PHP的内容。
LAMP环境安装
apache2 : apt-get install apache2
mysql: apt-get install mysql( 中间出现配置记得数据库的密码要记得,不然又要上网去查怎么更改自己的数据库密码(就会很麻烦) )
php: apt-get install php (以上是直接装最新的)
Laravel (内容是5.1版本的)
安装及配置(因为是从小白,从无到有这个过程,所以篇幅可能会比官方文档长一点)
在第一次接触Laravel 以及 令我头疼的Linux系统,首先要确保电脑上已经有LAMP(或者LNMP)环境,并且php需要有一些拓展(openssl、pdo、mbstring、tokenizer)(拓展的安装就是 apt-get install php-xxx,可能会是 php7.0-xxx),这个在你创建Laravel的项目如果缺少其中的拓展都会出现报错,自己根据原因来下载拓展。
上面的步骤没问题之后,就是到了安装composer这个步骤
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');"
完成了这个步骤之后,你的当前目录会有一个composer的包,用php composer 这个命令就能使用composer,当然我建议是将composer移动到全局环境(ln -s yourcomposer /usr/local/bin/)yourcomposer就是你的composer的路径(一定要绝对路径,并且指定到composer这个文件),这样往后需要用到composer 就可以直接使用composer。
完成之后,就可以安装Laravel了:
composer global require "laravel/installer=~1.1" //安装laravel到全局环境
下面就可以创建laravel项目了,不过这样子只能搭载你的laravel存在的版本,不能指定到比较旧的版本
laravel new blog
如果上面的安装成功了但是laravel还是没有存在系统环境变量该怎么办?如果我要装5.1版本的laravel怎么办?
composer create-project laravel/laravel xxx --prefer-dist // 装最新的laravel 到目录xxx
composer create-project laravel/laravel=5.1 xxx --prefer-dist // 装5.1版本的laravel 到目录xxx
基础
HTTP路由
路由是什么,它可以将 url 与你的 function 结合在一块,使得在请求的时候能够做出一些处理并响应
路由基本是在 app/Http/routes.php中定义的:
基础路由
最基础的写法 Route::method ,参数是一个url与一个闭包(return 将作为响应结果)
Route::get('/', function () {
return 'Hello World';
});
Route::post('foo/bar', function () {
return 'Hello World';
});
Route::put('foo/bar', function () {
//
});
Route::delete('foo/bar', function () {
//
});
如果是为多个动作注册路由 (有时候需要一个路由来响应不同的HTTP动作)
Route::match(['get', 'post'], '/', function () {
return 'Hello World';
});
Route::any('foo', function () { // 任何HTTP动作都可以响应这个路由
return 'Hello World';
});
生成路由对应的URLs
可以使用帮助函数 url 来生成路由对应的URLs:
$url = url('foo');
路由参数
有时我们需要在路由中捕获URI片段,比如,如果想要从URL中捕获用户ID,可以通过如下方式定义路由参数:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
可以按需要定义在路由中定义多个路由参数:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
路由参数总是通过花括号进行包裹,参数在路由被执行时会被传递到路由的闭包。
可选参数
有时候可能需要指定路由参数,并且使得该路由参数是可选的,可以通过在参数名后加一个?来标记:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
正则约束
可以使用路由实例上的where方法来约束路由参数的格式。where方法接收参数名和一个正则表达式来定义该参数如何被约束:
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]+']);
路由分组
路由分组允许我们在多个路由中共享路由属性,比如中间件和命名空间等,这样的话一大波共享属性的路由就不必再各自定义这些属性。共享属性以数组的形式被作为第一个参数传递到 Route::group
方法中。
想要了解更多路由分组,我们希望通过几个简单的应用实例来展示其特性。
中间件
要分配中间件给分组中的所有路由,可以在分组属性数组中使用middleware
键。中间件将会按照数组中定义的顺序依次执行:
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// 使用 Auth 中间件
});
Route::get('user/profile', function () {
// 使用 Auth 中间件
});
});
命名空间
另一个通用的例子是路由分组分配同一个PHP命名空间给多个控制器,可以在分组属性数组中使用namespace
参数来指定分组中控制器的命名空间:
Route::group(['namespace' => 'Admin'], function(){
// 控制器在 "App\Http\Controllers\Admin" 命名空间下
Route::group(['namespace' => 'User'], function()
{
// 控制器在 "App\Http\Controllers\Admin\User" 命名空间下
});
});
默认情况下,RouteServiceProvider
包含routes.php
并指定其所在命名空间,因此,我们只需要指定命名空间的App\Http\Controllers
之后的一部分。
子域名路由
路由分组还可以被用于子域名路由通配符,子域名可以像URIs一样被分配给路由参数,从而允许捕获子域名的部分用于路由或者控制器,子域名可以通过分组属性数组中的domain
键来指定:
Route::group(['domain' => '{account}.myapp.com'], function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
路由前缀
属性prefix
可以用来为分组中每个给定URI添加一个前缀,比如,你想要为所有路由URIs前面添加前缀admin
:
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// 匹配 "/admin/users" URL
});
});
你还可以使用prefix
参数为分组路由指定公共参数:
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($account_id) {
// 匹配 accounts/{account_id}/detail URL
});
});
命名路由
命名路由使生成URLs或者重定向到指定路由变得很方便,在定义路由时指定路由名称,然后使用数组键as
指定路由别名:
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
还可以为控制器动作指定路由名称:
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
路由分组 & 命名路由
如果你在使用路由分组,可以在路由分组属性数组中指定as关键字来为分组中的路由设置一个共用的路由名前缀:
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// 路由被命名为 "admin::dashboard"
}]);
});
为命名路由生成URLs
一旦你为给定路由分配了名字,通过route函数生成URLs时就可以使用路由名字:
$url = route('profile');
$redirect = redirect()->route('profile');
如果路由定义了参数,可以将路由参数作为第二个参数传递给route
函数。给定的路由参数将会自动插入URL中:
Route::get('user/{id}/profile', ['as' => 'profile', function ($id) {
//
}]);
$url = route('profile', ['id' => 1]);