分类目录归档:PHP

一步一步学Laravel,安装并使用laravel-menu

原项目地址:https://github.com/lavary/laravel-menu

1. 首先在 composer.json的require项目中添加

"lavary/laravel-menu": "dev-master"

2. 然后在Shell中执行

composer update

3. 找到config/app.php,在providers中添加

Lavary\Menu\ServiceProvider::class,

在aliases添加

'Menu' => Lavary\Menu\Facade::class,

5. 如果你还没有安装laravel-ide-helper,请按照https://onlyke.com/html/450.html,安装laravel-ide-helper
已经安装laravel-ide-helper的,在Shell中执行如下命令

php artisan ide-helper:generate

6. 这样就可以使用了,我们可以创建一个中间件,在Shell中执行下面命令

php artisan make:middleware Sidebar

下面是Siderbar.php的简单例子,注意use Menu;

<?php

namespace App\Http\Middleware;

use Closure;
use Menu;

class Sidebar
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        Menu::make('Sidebar',function($menu){
            $menu->add('Home');
        });
        return $next($request);
    }
}

当然了,官方github有更详细的例子和说明

一步一步学Laravel,5.2版本遇到Session store not set on request

最近重新开始看Laravel,发现登录和注册页面只要模板里使用old函数页面就会出错:Session store not set on request

遇到这个问题是因为所有需要session,csrf等控制器必须要放在web中间件下面,所以我们可以创建一个路由分组

Route::group(['middleware' => 'web'], function (){
    Route::get('/', function () {
        return view('welcome');
    });

    Route::auth();
});

解决方案来自:https://laracasts.com/discuss/channels/laravel/l5-session-store-not-set-on-request

在Nginx下新建虚拟主机搭建wordpress(新手向)

搭建环境:

Nginx-1.8.0,安装目录:/usr/local/nginx

PHP-7.0,虚拟主机目录在/home/vhosts/

下载wordpress,建立虚拟主机目录

首先,我们进入虚拟主机目录,新建一个wordpress目录,下载wordpress并解压

cd /home/vhosts/
mkdir wordpress
cd wordpress
wget https://cn.wordpress.org/wordpress-4.4-zh_CN.zip
unzip wordpress-4.4-zh_CN.zip

然后我们把wordpress解压文件夹里面的文件移动到外面来,删除刚才下载的压缩包和wordpress-4.4-zh_CN.zip

mv wordpress/* ./
rm -rf wordpress*

然后我们把wordpress文件夹的权限和所有者更改一下(当前目录还为/home/vhosts/wordpress )

这里演示的是Nginxphp-fpm的用户和用户组均为nginx

chmod -R 755 ./
chown -R nginx.nginx ./

配置虚拟主机

然后,我们到Nginx的安装目录,到你虚拟主机的配置文件目录中增加一份配置(这里我新建了一个专门的目录来放虚拟主机配置文件,在/usr/local/nginx/vhosts 下)

cd /usr/local/nginx/vhosts
vi wordpress.conf

把下面的配置文件内容粘贴进去(用Windows的注意下回车和编码)

注意,其中的root目录为你wordpress虚拟主机的目录

server_name为监听的域名,这里用www.yourdomain.com做演示

server {
	listen			80;
	server_name		www.yourdomain.com;
	index			index.html index.htm index.php;
	root			/home/vhosts/wordpress;
	location ~ .*\.(gif|jpg|jpeg|png|bmp|ico|webp)$
	{
		expires 30d;
	}
	location ~ .*\.(woff|ttf|svg|otf|eot)$
	{
		expires 180d;
	}
	location ~ .*\.(js|css)?$
	{
		expires 12h;
	}
	location /
	{
		#支持wordpress的rewrite
		if (!-e $request_filename) { 
			rewrite ^(.*)$ /index.php/$1 last;
			break;
		}
	}
	location ~ \.php($|/)
	{
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include	fastcgi_params;
	}
}

接着按下Esc,输入:wq 退出vi

MySQL配置

然后我们进入mysql

mysql -u root -p

输入你的密码之后,创建wordpress数据库

create database wordpress;

接着创建一个wordpress数据库的帐号,账号名为wp,密码为123456(修改成你自己的)

grant all privileges on wordpress.* to wp@localhost identified by '123456';

完成

然后我们重载入nginx

service nginx reload

现在,访问www.yourdomain.com,用刚才创建的数据库用户名和密码安装wordpress吧

Linux编译安装PHP7

下载PHP7

这里是版本7.0.1,使用下面命令下载编译包然后解压

wget http://php.net/get/php-7.0.1.tar.gz/from/this/mirror -O php-7.0.1.tar.gz
tar zxvf php-7.0.1.tar.gz

安装必要的环境

yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

配置

./configure \
--prefix=/usr/local/php-7.0.1 \
--with-mcrypt \
--with-mhash \
--with-openssl \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-gd \
--with-iconv \
--with-zlib \
--enable-zip \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--disable-fileinfo

其中可以增加–with-mysql-sock=[dir] 来设置mysql的sock文件的位置,默认是/tmp/mysql.sock

–prefix 是你要安装的位置

编译和安装

make
make install

设置配置文件,还是刚才编译的目录中,执行

cp php.ini-production /usr/local/php-7.0.1/lib/php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cp /usr/local/php-7.0.1/etc/php-fpm.conf.default /usr/local/php-7.0.1/etc/php-fpm.conf
cp /usr/local/php-7.0.1/etc/php-fpm.d/www.conf.default /usr/local/php-7.0.1/etc/php-fpm.d/www.conf

其中/usr/local/php-7.0.1/ 是你的安装位置,请替换成你自己的

添加服务并启动

chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
service php-fpm start

环境变量

修改/etc/profile文件使其永久性生效,并对所有系统用户生效,在文件末尾加上如下两行代码

PATH=$PATH:/usr/local/php-7.0.1/bin
export PATH

Let’s Encrypt在XP下的支持问题

目前Let’s Encrypt在Windows XP下总共遇到了两种问题

第一种是因为不支持SNI,SNI允许HTTPS在握手的时候发送主机名,从而使得每个虚拟主机可以根据域名配置不同的证书,如下图所示

QQ图片20151222224447 - 副本 QQ图片20151222224452 - 副本

第二种,可能是因为交叉信任的原因,导致的是证书不信任,但是名称正确

QQ图片20151222224458

总之,还是淘汰XP系统吧

 

PHP7.0+Nginx-1.8.0禁止跨虚拟主机执行脚本

在你的Nginx每个虚拟主机的Server中写如下代码(貌似PHP5.3以上版本就支持了,不过我是7.0的版本)

#PHP Prohibit cross-Hosting
fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/";

当然,你也可以把这段代码放在Conf的fastcgi.conf或者fastcgi_params里,这要看你在Server中include了哪个文件。

一步一步学Laravel,使用默认的Auth控制器在登录时增加字段验证(验证用户登录字段是否为邮箱地址)

在laracasts的14期视频中,作者讲述了在Laravel中如何使用默认的Auth控制器来快速构造用户验证的功能。

其中我发现,这个Auth控制器默认情况,并不会在登录时检测用户输入的用户名是否为邮箱(默认登录字段为邮箱)

这导致用户输入其他字段的时候也会进入到数据库进行查询。

下面是一个在不修改原有vendor下AuthenticatesUsers的方式(低耦合)来实现检查登录字段是否为邮件功能

在AuthController.php,找到下面的代码

use AuthenticatesAndRegistersUsers, ThrottlesLogins

修改为:

use AuthenticatesAndRegistersUsers, ThrottlesLogins {
    AuthenticatesAndRegistersUsers::postLogin as parentPostLogin;
}

QQ图片20151202020735

上面做的目的是把AuthenticatesAndRegistersUsers(其实这个类继承了AuthenticatesUsers)postLogin修改为parentPostLogin,方便我们对postLogin进行重写。

然后我们在AuthController.php中重写postLogin方法,进行我们的Email验证,并且在把流程归还给原先的parentPostLogin

public function postLogin(Request $request)
    {
        $this->validate($request, [
            $this->loginUsername() => 'email'
        ]);
        return $this->parentPostLogin($request);
    }

然后运行成功

QQ截图20151202020933

 

其实这里面主要是要看懂和学会php的trait新特性,也就是多继承