Larvae 的配置都在 config 目录下非常方便管理,可以通过config()帮助函数来实现对配置项目的设置和获取,同时用 DotEnv 来实现项目内环境变量的控制,非常强大和方便。我们在日常开发中如果没有使用 Laravel 框架,比如写一些脚本,或者自己写的项目框架,但是想集成这样的配置管理。这里就讲讲如何集成illuminate/config 到自己的项目中实现 Laravel 那种 config 配置。 首先通过 composer 来安装illuminate/config 和 vlucas/phpdotenv,composer.json 如下: { "require": { "illuminate/config": "^5.2", "vlucas/phpdotenv": "^2.3" }, "autoload": { "psr-4": { "App\\": "app/" } } } 创建.env 文件,同时创建对应环境的 env 文件,为了解决不同环境加载不同配置的问题。比如: .env 里面只写入当前环境,比如local,develop , production .local.env 表示本地开发环境的配置项 .develop.env 表示测试环境的配置项 .production 表示生产环境的配置项 关于 Laravel 在不同环境加载不同配置的方法可以参考我的这篇文章《Laravel 在不同的环境调用不同的配置文件》 我们在新建一个配置文件,比如 config/app.php 或者 config/path/to.php 加载配置文件,新建 app/Config.

阅读全文

Laravel Tips 之 forelse

我们在 Laravel Blade 模板中经常在循环输出前先判断一下集合是否有值,然后再foreach 比如: @if ($posts->count()) @foreach ($posts as $post) <p>This is post {{ $user->id }}</p> @endforeach @else <p>No posts found.</p> @endif 其实在 Laravel Blade 中可以使用forelse: @forelse ($posts as $post) <p>This is post {{ $post->id }}</p> @empty <p>No posts found.</p> @endforelse 它的实现可以在Illuminate/View/Compilers/BladeCompiler.php找到: /** * Compile the forelse statements into valid PHP. * * @param string $expression * @return string */ protected function compileForelse($expression) { $empty = '$__empty_'.++$this->forelseCounter; return "<?php {$empty} = true; foreach{$expression}: {$empty} = false; ?

阅读全文

Docker 快速入门指引

Docker 是什么? Docker 是 Docker.Inc 公司开源的一个基于 LXC 技术之上构建的 Container 容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。 开发者可以搭建他们的应用仅仅一次,就能保证让这个应用保持一致的跑在任何地方。运营人员可以将他们的服务器配置一遍,就能跑任何应用。 What is Docker’s architecture? Docker uses a client-server architecture. The Docker client talks to the Dockerdaemon, which does the heavy lifting of building, running, and distributing your Docker containers. Both the Docker client and the daemon can run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate via sockets or through a RESTful API.

阅读全文

Ubuntu LNMP 一键安装脚本

这两天整了个 Ubuntu(14.04 LTS)上安装配置 Nginx,MySQL,PHP 环境的一键安装的 shell 脚本,一劳永逸。 Github:ubuntu-lnmp-installer 包括的软件包: Jemalloc(4.2.0) PHP(7.07) MySQL(5.6.29) Nignx(1.10.0) Redis(3.2.0) Node.js(5.8.0) PM2 Beanstalkd Supervisor 使用方法: git clone cd ubuntu-lnmp-installer ./install.sh 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: Ubuntu LNMP 一键安装脚本 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

Laravel 集成 Monolog 来做日志处理,Monolog 非常强大,也容易扩展,其实它本身已经支持很多Handler了,你可以把日志发送到邮件或者其他日志收集服务器或者系统中,因为我们团队使用Bearychat 作为团队沟通工具,所以把 Laravel 项目的实时错误日志推送到 Bearychat 的一个讨论组中,方便组员迅速发现异常和解决问题 ,其实很简单没多少行代码就搞定了。 首先创建 BearyChatHandler <?php namespace App; use Monolog\Handler\AbstractProcessingHandler; use Monolog\Logger; use Monolog\Handler\Curl; class BearyChatHandler extends AbstractProcessingHandler { private $data; private $webhook; public function __construct($webhook, $channel, $level = Logger::NOTICE, $bubble = true) { $this->data['channel'] = $channel; $this->webhook = $webhook; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { $postData = [ 'text' => $record['datetime']->format('Y-m-d H:i:s') . '-' .

阅读全文

简单粗暴的Caddy Server

在上一篇的《Mac 极简的开发环境 Laravel Valet 实践》中提到Valet是利用系统后台启用的Caddy来提供 web 服务的,这个Caddy是个 web server?今天玩了一下,非常赞,当然简单粗暴是有点标题党了。 Caddy是一个 Go 写的服务器软件,官方的宣传语“The HTTP/2 web server with automatic HTTPS”以及“Serve The Web Like It’s 2016”简明表达了这个软件的优点和趋势,它拥有基本的 apache 或者 nginx 有的 web server 模块,同时还有一些很有特色的功能,比如: HTTP/2 Automatic HTTPS Multi-core Websockets Markdown IPv6 Git …… 用 Caddy 我们就可以很方便的部署一个 Markdown 文本作为静态网站访问,或者它的 Git 指令完成代码的自动化部署,当然它很大的特色就是它的语法非常简洁,比 nginx 还要简单,配置部署起来很方便,下面随便举几个例子吧。 对网站添加BasicAuth,用户名 ryan,密码 12345 basicauth / ryan 12345 用CORS解决跨域问题 cors / { origin http://allowedSite.com origin http://anotherSite.org https://anotherSite.org methods POST,PUT allow_credentials false max_age 3600 allowed_headers X-Custom-Header,X-Foobar exposed_headers X-Something-Special,SomethingElse } IP 过滤 ipfilter / { rule block ip 212.

阅读全文

Laravel Valet 是一个Mac下面的极简的开发环境,不但可以本地开发,还可以分享到公网访问,当你的电脑开机后会在后台一直启动 Caddy ,Valet通过 DnsMasq 把所有的 .dev域名指向你本地安装的站点,比如站点所在目录blog, 通过浏览器访问blog.dev就会自动访问到blog了。分享到公网其实主要依靠ngrok来实现的。 先来安装一下 更新Homebrew brew update 确保brew services可用 brew services list 安装php70如果没有安装的话 brew install php70 确保~/.composer/vendor/bin已经添加到系统 PATH 目录中 安装Valet composer global require laravel/valet 安装 Valet 和 DnsMasq valet install 如果上一步出现下面的错误: [ReflectionException] Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist 这是由于Composer\Repository\ComposerRepository::whatProvides API 更新了,你已经全局安装了fxp/composer-asset-plugin,所以你需要更新一下: composer global require fxp/composer-asset-plugin --no-plugins 如果DnsMasq安装失败的话手动安装一下 brew install dnsmasq Ping 一下 *.dev,如果 Ping 通了说明就 OK 了 ⇒ ping *.

阅读全文

Laravel 的分页很方便,其实扩展起来也挺容易的,下面就来做个示例,扩展一下paginate()和 simplePaginate()方法,来实现我们自定义分页样式,比如显示**“上一页”**和**“下一页”**,而不是**"《"**和**"》"**,当然扩展的方法掌握了你就可以肆无忌惮的扩展一个你想要的分页了,比如跳转到某一页,分页显示一共多少记录,当前显示的记录范围等等巴拉巴拉的。。。 5.1 和 5.2 应该是同样的方法,我这里用的是 5.2 的版本。文档告诉我们Paginator 对应于查询语句构造器和 Eloquent 的 simplePaginate 方法,而 LengthAwarePaginator则等同于 paginate 方法。那我们还是来看下源码,具体这个 paginate 是如何实现render()的, Illuminate/Pagination/LengthAwarePaginator.php <?php namespace Illuminate\Pagination; ...... class LengthAwarePaginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Jsonable, LengthAwarePaginatorContract { ...... public function render(Presenter $presenter = null) { if (is_null($presenter) && static::$presenterResolver) { $presenter = call_user_func(static::$presenterResolver, $this); } $presenter = $presenter ?: new BootstrapThreePresenter($this); return $presenter->render(); } ...... } render()中传入的是一个Presenter的实例,并调用这个实例化的render方法来实现分页的显示的。如果没有则调用BootstrapThreePresenter 中render()的,来看看BootstrapThreePresenter是干嘛的

阅读全文

Larval 自带 Auth 密码重置源码解析及扩展实现手机号密码找回 Larval 技术群小伙伴问密码重置时 PasswordController 中需要设置的$broker是干嘛用的,正好来写一下 Laravel 中 Auth 的ResetsPasswords,以及实践一下扩展,所以大体这篇博客写写: 密码重置源码分析 实现自定义邮件发送方式进行密码重置,比如使用第三方或者自己发送邮件方式找回 实现手机号密码重置 首先来看一下 PasswordController 中的 ResetsPasswords trait trait ResetsPasswords { use RedirectsUsers; public function getEmail() { return $this->showLinkRequestForm(); } /** * 这里就是设置密码重置邮件内容的 * * @return \Illuminate\Http\Response */ public function showLinkRequestForm() { //所以我们可以在PoasswrodController 中设置 protected $linkRequestView 来定义密码重置邮件模板 if (property_exists($this, 'linkRequestView')) { return view($this->linkRequestView); } if (view()->exists('auth.passwords.email')) { return view('auth.passwords.email'); } return view('auth.password'); } /** * 发送密码重置邮件 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function postEmail(Request $request) { return $this->sendResetLinkEmail($request); } /** * 给重置密码的用户发送邮件 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function sendResetLinkEmail(Request $request) { $this->validate($request, ['email' => 'required|email']); $broker = $this->getBroker(); //获取broker,下面会讲 $response = Password::broker($broker)->sendResetLink($request->only('email'), function (Message $message) { $message->subject($this->getEmailSubject()); }); //根据 broker 来发送密码重置邮件,下面会详细讲 switch ($response) { case Password::RESET_LINK_SENT: //状态,下面会讲 return $this->getSendResetLinkEmailSuccessResponse($response); case Password::INVALID_USER: default: return $this->getSendResetLinkEmailFailureResponse($response); } } /** * 邮件标题 * * @return string */ protected function getEmailSubject() { return property_exists($this, 'subject') ?

阅读全文

Larval 5.2 的默认 Auth 登陆传入邮件和用户密码到attempt 方法来认证,通过email的值获取,如果用户被找到,经哈希运算后存储在数据中的password将会和传递过来的经哈希运算处理的passwrod值进行比较。如果两个经哈希运算的密码相匹配那么将会为这个用户开启一个认证 Session。 但是往往我们一些老的系统是通过 salt+passwrod 来认证的,现在重构迁移到 Laravel 框架中,那么密码认证如何不用默认的 passwrod 的方式而用 salt+password 的方式认证? 要解决问题,我们最好还是先要弄明白根源,顺藤摸瓜 首先看一下 Laravel 默认如何做密码验证的,看看Auth::guard($this->getGuard())->attempt($credentials)方法做了什么: Illuminate/Contracts/Auth/StatefulGuard.php namespace Illuminate\Contracts\Auth; interface StatefulGuard extends Guard { /** * Attempt to authenticate a user using the given credentials. * * @param array $credentials * @param bool $remember * @param bool $login * @return bool */ public function attempt(array $credentials = [], $remember = false, $login = true); ...... 上面代码看到attempt 是StatefulGuard 接口中的方法,第一个参数为需要认证的字段,第二个参数为是否记住登陆,第三个参数是否登陆,继续往下看attempt 在 SessionGuard 中是如何实现的

阅读全文

作者的图片

Ryan是菜鸟 | 技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京