2016年1月31日 星期日

如何獨立使用Laravel Eloquent

Laravel的套件是可以獨立使用的,並不需要加入整個framework 我們一起來了解如何操作 composer 新增套件 ```bash composer require illuminate/container illuminate/contracts illuminate/database illuminate/events illuminate/hashing illuminate/support nesbot/carbon ``` 新增bootstrap.php ```php require __DIR__.'/../vendor/autoload.php'; use Illuminate\Container\Container; use Illuminate\Support\Facades\Facade; use Illuminate\Support\Str; class Application extends Container { public $aliases = [ \Illuminate\Support\Facades\Facade::class => 'Facade', \Illuminate\Support\Facades\App::class => 'App', \Illuminate\Support\Facades\Schema::class => 'Schema', ]; public function __construct() { date_default_timezone_set('UTC'); if (class_exists('\Carbon\Carbon') === true) { \Carbon\Carbon::setTestNow(\Carbon\Carbon::now()); } $this['app'] = $this; $this->setupAliases(); $this->setupDispatcher(); $this->setupConnection(); Facade::setFacadeApplication($this); Container::setInstance($this); } public function setupDispatcher() { if (class_exists('\Illuminate\Events\Dispatcher') === false) { return; } $this['events'] = new \Illuminate\Events\Dispatcher($this); } public function setupAliases() { foreach ($this->aliases as $className => $alias) { class_alias($className, $alias); } } public function setupConnection() { if (class_exists('\Illuminate\Database\Capsule\Manager') === false) { return; } $connection = new \Illuminate\Database\Capsule\Manager(); $connection->addConnection([ 'driver' => 'sqlite', 'database' => ':memory:', ]); if (isset($this['events']) === true) { $connection->setEventDispatcher($this['events']); } $connection->bootEloquent(); $connection->setAsGlobal(); $this['db'] = $connection; } public function migrate($method) { if (class_exists('\Illuminate\Database\Capsule\Manager') === false) { return; } foreach (glob(__DIR__.'/../database/migrations/*.php') as $file) { include_once $file; if (preg_match('/\d+_\d+_\d+_\d+_(.*)\.php/', $file, $m)) { $className = Str::studly($m[1]); $migration = new $className(); call_user_func_array([$migration, $method], []); } } } public function environment() { return 'testing'; } } if (function_exists('bcrypt') === false) { /** * Hash the given value. * * @param string $value * @param array $options * * @return string */ function bcrypt($value, $options = []) { return (new \Illuminate\Hashing\BcryptHasher())->make($value, $options); } } if (function_exists('app') === false) { function app() { return App::getInstance(); } } if (Application::getInstance() == null) { new Application(); } ``` 只要再建立資料表及建立Model 就可以正常使用Eloquent了

2016年1月3日 星期日

git 刪除遠端branch

只要在分支前加入『:』即可 ##Example ```bash git push origin : ```

2015年12月28日 星期一

遠振主機 escapeshellarg() has been disabled for security reasons

用遠振主機又踩雷啦,遠振將escapeshellarg這個函式disabled 所以只要有用到 SebastianBergmann\Environment\Runtime Symfony\Component\Console\Input\Input Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser Symfony\Component\Process\ProcessUtils Tracy\Debugger 都會提示 escapeshellarg() has been disabled for security reasons 不過還好php5.3之後就支援namespace,可以讓我們輕鬆略過這個問題 (如果使用的套件不支援namespace那就只好認命的去修改程式囉) 只要require下面的檔案就可以解決這些問題了 ```php namespace Yuan\Jhen { if (function_exists('escapeshellarg') === true) { function escapeshellarg($input) { return \escapeshellarg($input); } } else { function escapeshellarg($input) { $input = str_replace('\'', '\\\'', $input); return '\''.$input.'\''; } } } namespace SebastianBergmann\Environment { function escapeshellarg($input) { return \Yuan\Jhen\escapeshellarg($input); } } namespace Symfony\Component\Console\Input { function escapeshellarg($input) { return \Yuan\Jhen\escapeshellarg($input); } } namespace Symfony\Component\HttpFoundation\File\MimeType { function escapeshellarg($input) { return \Yuan\Jhen\escapeshellarg($input); } } namespace Symfony\Component\Process { function escapeshellarg($input) { return \Yuan\Jhen\escapeshellarg($input); } } namespace Tracy { function escapeshellarg($input) { return \Yuan\Jhen\escapeshellarg($input); } } ```

2015年12月22日 星期二

利用Git來升級Laravel

照著影片操作,就會出現conflicts,處理完conflicts之後,再執行 ```bash composer install ``` 這樣大致上就升級完畢了,而且如果升級出問題還可以利用git本身的功能來進行還原...

2015年12月20日 星期日

php 偵測語系

```php function getDefaultLanguage() { if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { return parseDefaultLanguage($_SERVER['HTTP_ACCEPT_LANGUAGE']); } else { return parseDefaultLanguage(null); } } function parseDefaultLanguage($http_accept, $deflang = 'zh-TW') { if (isset($http_accept) && strlen($http_accept) > 1) { # Split possible languages into array $x = explode(',', $http_accept); foreach ($x as $val) { #check for q-value and create associative array. No q-value means 1 by rule if (preg_match("/(.*);q=([0-1]{0,1}.\d{0,4})/i", $val, $matches)) { $lang[$matches[1]] = (float) $matches[2]; } else { $lang[$val] = 1.0; } } #return default language (highest q-value) $qval = 0.0; foreach ($lang as $key => $value) { if ($value > $qval) { $qval = (float) $value; $deflang = $key; } } } return strtolower($deflang); } echo getDefaultLanguage(); ```

資料庫備份工具

```php class DatabaseClone { public $link; public function __construct($host, $username, $password) { $this->link = mysqli_connect($host, $username, $password); mysqli_query($this->link, 'SET NAMES utf8'); mysqli_query($this->link, 'SET AUTOCOMMIT = 0'); mysqli_query($this->link, 'SET UNIQUE_CHECKS = 0'); mysqli_query($this->link, 'SET FOREIGN_KEY_CHECKS = 0'); } public function fetch($query) { $results = []; $query = mysqli_query($this->link, $query); while ($row = mysqli_fetch_assoc($query)) { $results[] = $row; } return $results; } public function copy($copyTo) { set_time_limit(-1); ini_set('memory_limit', -1); $query = mysqli_query($this->link, $sql = 'show databases'); while ($database = mysqli_fetch_assoc($query)) { $database = $database['Database']; if (in_array($database, ['mysql', 'information_schema', 'performance_schema'], true) === true) { continue; } $createDatabase = mysqli_fetch_assoc(mysqli_query($this->link, 'SHOW CREATE DATABASE `'.$database.'`')); mysqli_query($copyTo->link, $sql = 'DROP DATABASE IF EXISTS `'.$database.'`') or var_dump($sql); mysqli_query($copyTo->link, $sql = $createDatabase['Create Database']) or var_dump($sql); mysqli_select_db($this->link, $database); mysqli_select_db($copyTo->link, $database); $query2 = mysqli_query($this->link, $sql = 'show tables'); while ($table = mysqli_fetch_assoc($query2)) { $table = current($table); $createTable = mysqli_fetch_assoc(mysqli_query($this->link, 'SHOW CREATE TABLE `'.$table.'`')); mysqli_query($copyTo->link, $sql = $createTable['Create Table']) or var_dump($sql); $counts = current(mysqli_fetch_assoc(mysqli_query($this->link, 'SELECT COUNT(*) as counts FROM `'.$table.'`'))); $range = range(0, $counts - 1); $offset = 0; $limit = 200; $chunks = array_chunk($range, $limit); foreach ($chunks as $chunk) { $query3 = mysqli_query($this->link, $sql = 'SELECT * FROM `'.$table.'` LIMIT '.$limit.' OFFSET '.$offset) or var_dump($database, $sql); while ($row = mysqli_fetch_assoc($query3)) { $keys = []; $values = []; foreach ($row as $key => $value) { $keys[] = '`'.$key.'`'; $values[] = "'".addslashes($value)."'"; } mysqli_query($copyTo->link, $sql = 'INSERT INTO `'.$table.'` ('.implode(',', $keys).') VALUES ('.implode(',', $values).')') or var_dump($database, $sql); } $offset += count($chunk); } } } } } $database = new DatabaseClone('localhost:3306', 'root', ''); $database->copy(new DatabaseClone('localhost:3308', 'root', '')); ```

2015年11月7日 星期六

使用instance來進行Tracy Panel

```php // PHP程式碼 include __DIR__.'/vendor/autoload.php'; use Tracy\Debugger; use Tracy\IBarPanel; class CustomPanel implements IBarPanel { /** * Renders HTML code for custom tab. * @return string */ public function getTab() { return 'sql'; } /** * Renders HTML code for custom panel. * @return string */ public function getPanel() { $data = $this->data; ob_start(); require __DIR__.'/custompanel.php'; return ob_get_clean(); } public function push($data) { $this->data[] = $data; } public $data = []; private static $_instance; public static function instance() { if (static::$_instance === null) { static::$_instance = new static; } return static::$_instance; } } // 開發環境 $environment = Debugger::DEVELOPMENT; // 啟用 Debugger::enable($environment); Debugger::getBar() ->addPanel(CustomPanel::instance()); $i = 0; CustomPanel::instance()->push([ 'sql' => 'select * from user where id = '.++$i, ]); CustomPanel::instance()->push([ 'sql' => 'select * from user where id = '.++$i, ]); CustomPanel::instance()->push([ 'sql' => 'select * from user where id = '.++$i, ]); ``` ```php //樣板<h1>SQL</h1>

<div class="tracy-inner">
    <table>
        <?php foreach ($data as $key => $value): ?>
            <tr><td><?php echo $value['sql']; ?></td></tr>
        <?php endforeach ?>
    </table>
</div> ```