From 44ed5460dcefe5f1f7dd69dbd14ba2efcd555131 Mon Sep 17 00:00:00 2001 From: kenden Date: Tue, 8 Oct 2013 13:47:59 +0200 Subject: [PATCH 01/22] Update 09-04-01-Complementary-Testing-Tools.md Updating link to the PHPUnit-Selenium integration page to the current version of PHPUnit --- _posts/09-04-01-Complementary-Testing-Tools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/09-04-01-Complementary-Testing-Tools.md b/_posts/09-04-01-Complementary-Testing-Tools.md index 034937a..1cbc304 100644 --- a/_posts/09-04-01-Complementary-Testing-Tools.md +++ b/_posts/09-04-01-Complementary-Testing-Tools.md @@ -8,6 +8,6 @@ Besides individual testing and behavior driven frameworks, there are also a numb ### Tool Links -* [Selenium](http://seleniumhq.org/) is a browser automation tool which can be [integrated with PHPUnit](http://www.phpunit.de/manual/3.1/en/selenium.html) +* [Selenium](http://seleniumhq.org/) is a browser automation tool which can be [integrated with PHPUnit](http://phpunit.de/manual/current/en/selenium.html) * [Mockery](https://github.com/padraic/mockery) is a Mock Object Framework which can be integrated with [PHPUnit](http://phpunit.de/) or [PHPSpec](http://www.phpspec.net/) * [Prophecy](https://github.com/phpspec/prophecy) is a highly opinionated yet very powerful and flexible PHP object mocking framework. It's integrated with [PHPSpec](http://www.phpspec.net/) and can be used with [PHPUnit](http://phpunit.de/). From 737c15f18e628c816fe12a6e9588dab306cddf9f Mon Sep 17 00:00:00 2001 From: Jacek Kobus Date: Tue, 8 Oct 2013 22:27:05 +0200 Subject: [PATCH 02/22] added link to symfony coding standards --- _posts/02-01-01-Code-Style-Guide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_posts/02-01-01-Code-Style-Guide.md b/_posts/02-01-01-Code-Style-Guide.md index e9d4657..f7a6d0c 100644 --- a/_posts/02-01-01-Code-Style-Guide.md +++ b/_posts/02-01-01-Code-Style-Guide.md @@ -19,6 +19,7 @@ and applications that implement the components can have consistency even when wo * [Read about PSR-2][psr2] * [Read about PEAR Coding Standards][pear-cs] * [Read about Zend Coding Standards][zend-cs] +* [Read about Symfony Coding Standards][symfony-cs] You can use [PHP_CodeSniffer][phpcs] to check code against any one of these recommendations, and plugins for text editors like [Sublime Text 2][st-cs] to be given real time feedback. @@ -35,6 +36,7 @@ by all current and future parties who may be working on the codebase. [psr2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md [pear-cs]: http://pear.php.net/manual/en/standards.php [zend-cs]: http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards +[symfony-cs]: http://symfony.com/doc/current/contributing/code/standards.html [phpcs]: http://pear.php.net/package/PHP_CodeSniffer/ [st-cs]: https://github.com/benmatselby/sublime-phpcs [phpcsfixer]: http://cs.sensiolabs.org/ From d02c7d66e827e9fdaa98be0a0d6d6648733d40e3 Mon Sep 17 00:00:00 2001 From: Matthew Malinowski Date: Wed, 6 Nov 2013 10:03:23 -0500 Subject: [PATCH 03/22] Add Mavericks PHP version to Mac Setup. --- _posts/01-04-01-Mac-Setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_posts/01-04-01-Mac-Setup.md b/_posts/01-04-01-Mac-Setup.md index c394dea..aa2fa29 100644 --- a/_posts/01-04-01-Mac-Setup.md +++ b/_posts/01-04-01-Mac-Setup.md @@ -4,8 +4,8 @@ isChild: true ## Mac Setup {#mac_setup_title} -OSX comes prepackaged with PHP but it is normally a little behind the latest stable. Lion comes with PHP 5.3.6 and -Mountain Lion has 5.3.10. +OSX comes prepackaged with PHP but it is normally a little behind the latest stable. Lion comes with PHP 5.3.6, +Mountain Lion has 5.3.10, and Mavericks has 5.4.17. To update PHP on OSX you can get it installed through a number of Mac [package managers][mac-package-managers], with [php-osx by Liip][php-osx-downloads] being recommended. From 7136211fd0ad2d224192b17343cd26a55997cc36 Mon Sep 17 00:00:00 2001 From: Alastair Hole Date: Wed, 20 Nov 2013 16:29:44 +0000 Subject: [PATCH 04/22] Update 03-06-01-XDebug.md Corrected MacGBDp to MacGDBp --- _posts/03-06-01-XDebug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/03-06-01-XDebug.md b/_posts/03-06-01-XDebug.md index 402eb1e..8334b5c 100644 --- a/_posts/03-06-01-XDebug.md +++ b/_posts/03-06-01-XDebug.md @@ -31,7 +31,7 @@ Your IDE will now intercept the current state as the script executes, allowing y values in memory. Graphical debuggers make it very easy to step through code, inspect variables, and eval code against the live runtime. -Many IDE's have built-in or plugin-based support for graphical debugging with xdebug. MacGBDp is a free, open-source, +Many IDE's have built-in or plugin-based support for graphical debugging with xdebug. MacGDBp is a free, open-source, stand-alone xdebug GUI for Mac. * [Learn more about XDebug][xdebug-docs] From c5ebc871dc801f4acb171a2f677e86d470d5f551 Mon Sep 17 00:00:00 2001 From: happyaccidents Date: Tue, 26 Nov 2013 14:35:06 +0000 Subject: [PATCH 05/22] Renamed posts to allow Dependency Injection to be added --- _posts/{06-01-01-Databases.md => 08-01-01-Databases.md} | 0 _posts/{07-02-01-Errors.md => 08-02-01-Errors.md} | 0 _posts/{07-03-01-Exceptions.md => 08-03-01-Exceptions.md} | 0 _posts/{08-01-01-Security.md => 09-01-01-Security.md} | 0 ...plication-Security.md => 09-02-01-Web-Application-Security.md} | 0 ...{08-03-01-Password-Hashing.md => 09-03-01-Password-Hashing.md} | 0 _posts/{08-04-01-Data-Filtering.md => 09-04-01-Data-Filtering.md} | 0 ...-01-Configuration-Files.md => 09-05-01-Configuration-Files.md} | 0 ...{08-06-01-Register-Globals.md => 09-06-01-Register-Globals.md} | 0 .../{08-07-01-Error-Reporting.md => 09-07-01-Error-Reporting.md} | 0 _posts/{09-01-01-Testing.md => 10-01-01-Testing.md} | 0 ...-Driven-Development.md => 10-02-01-Test-Driven-Development.md} | 0 ...ven-Development.md => 10-03-01-Behavior-Driven-Development.md} | 0 ...y-Testing-Tools.md => 10-04-01-Complementary-Testing-Tools.md} | 0 ...rvers-and-Deployment.md => 11-01-01-Servers-and-Deployment.md} | 0 ...Platform-as-a-Service.md => 11-02-01-Platform-as-a-Service.md} | 0 ...icated-Servers.md => 11-03-01-Virtual-or-Dedicated-Servers.md} | 0 _posts/{10-04-01-Shared-Servers.md => 11-04-01-Shared-Servers.md} | 0 ...-your-Application.md => 11-05-01-Building-your-Application.md} | 0 _posts/{11-01-01-Caching.md => 12-01-01-Caching.md} | 0 _posts/{11-02-01-Bytecode-Cache.md => 12-02-01-Bytecode-Cache.md} | 0 _posts/{11-03-01-Object-Caching.md => 12-03-01-Object-Caching.md} | 0 _posts/{12-01-01-Resources.md => 13-01-01-Resources.md} | 0 _posts/{12-02-01-Frameworks.md => 13-02-01-Frameworks.md} | 0 _posts/{12-03-01-Components.md => 13-03-01-Components.md} | 0 _posts/{13-01-01-Community.md => 14-01-01-Community.md} | 0 26 files changed, 0 insertions(+), 0 deletions(-) rename _posts/{06-01-01-Databases.md => 08-01-01-Databases.md} (100%) rename _posts/{07-02-01-Errors.md => 08-02-01-Errors.md} (100%) rename _posts/{07-03-01-Exceptions.md => 08-03-01-Exceptions.md} (100%) rename _posts/{08-01-01-Security.md => 09-01-01-Security.md} (100%) rename _posts/{08-02-01-Web-Application-Security.md => 09-02-01-Web-Application-Security.md} (100%) rename _posts/{08-03-01-Password-Hashing.md => 09-03-01-Password-Hashing.md} (100%) rename _posts/{08-04-01-Data-Filtering.md => 09-04-01-Data-Filtering.md} (100%) rename _posts/{08-05-01-Configuration-Files.md => 09-05-01-Configuration-Files.md} (100%) rename _posts/{08-06-01-Register-Globals.md => 09-06-01-Register-Globals.md} (100%) rename _posts/{08-07-01-Error-Reporting.md => 09-07-01-Error-Reporting.md} (100%) rename _posts/{09-01-01-Testing.md => 10-01-01-Testing.md} (100%) rename _posts/{09-02-01-Test-Driven-Development.md => 10-02-01-Test-Driven-Development.md} (100%) rename _posts/{09-03-01-Behavior-Driven-Development.md => 10-03-01-Behavior-Driven-Development.md} (100%) rename _posts/{09-04-01-Complementary-Testing-Tools.md => 10-04-01-Complementary-Testing-Tools.md} (100%) rename _posts/{10-01-01-Servers-and-Deployment.md => 11-01-01-Servers-and-Deployment.md} (100%) rename _posts/{10-02-01-Platform-as-a-Service.md => 11-02-01-Platform-as-a-Service.md} (100%) rename _posts/{10-03-01-Virtual-or-Dedicated-Servers.md => 11-03-01-Virtual-or-Dedicated-Servers.md} (100%) rename _posts/{10-04-01-Shared-Servers.md => 11-04-01-Shared-Servers.md} (100%) rename _posts/{10-05-01-Building-your-Application.md => 11-05-01-Building-your-Application.md} (100%) rename _posts/{11-01-01-Caching.md => 12-01-01-Caching.md} (100%) rename _posts/{11-02-01-Bytecode-Cache.md => 12-02-01-Bytecode-Cache.md} (100%) rename _posts/{11-03-01-Object-Caching.md => 12-03-01-Object-Caching.md} (100%) rename _posts/{12-01-01-Resources.md => 13-01-01-Resources.md} (100%) rename _posts/{12-02-01-Frameworks.md => 13-02-01-Frameworks.md} (100%) rename _posts/{12-03-01-Components.md => 13-03-01-Components.md} (100%) rename _posts/{13-01-01-Community.md => 14-01-01-Community.md} (100%) diff --git a/_posts/06-01-01-Databases.md b/_posts/08-01-01-Databases.md similarity index 100% rename from _posts/06-01-01-Databases.md rename to _posts/08-01-01-Databases.md diff --git a/_posts/07-02-01-Errors.md b/_posts/08-02-01-Errors.md similarity index 100% rename from _posts/07-02-01-Errors.md rename to _posts/08-02-01-Errors.md diff --git a/_posts/07-03-01-Exceptions.md b/_posts/08-03-01-Exceptions.md similarity index 100% rename from _posts/07-03-01-Exceptions.md rename to _posts/08-03-01-Exceptions.md diff --git a/_posts/08-01-01-Security.md b/_posts/09-01-01-Security.md similarity index 100% rename from _posts/08-01-01-Security.md rename to _posts/09-01-01-Security.md diff --git a/_posts/08-02-01-Web-Application-Security.md b/_posts/09-02-01-Web-Application-Security.md similarity index 100% rename from _posts/08-02-01-Web-Application-Security.md rename to _posts/09-02-01-Web-Application-Security.md diff --git a/_posts/08-03-01-Password-Hashing.md b/_posts/09-03-01-Password-Hashing.md similarity index 100% rename from _posts/08-03-01-Password-Hashing.md rename to _posts/09-03-01-Password-Hashing.md diff --git a/_posts/08-04-01-Data-Filtering.md b/_posts/09-04-01-Data-Filtering.md similarity index 100% rename from _posts/08-04-01-Data-Filtering.md rename to _posts/09-04-01-Data-Filtering.md diff --git a/_posts/08-05-01-Configuration-Files.md b/_posts/09-05-01-Configuration-Files.md similarity index 100% rename from _posts/08-05-01-Configuration-Files.md rename to _posts/09-05-01-Configuration-Files.md diff --git a/_posts/08-06-01-Register-Globals.md b/_posts/09-06-01-Register-Globals.md similarity index 100% rename from _posts/08-06-01-Register-Globals.md rename to _posts/09-06-01-Register-Globals.md diff --git a/_posts/08-07-01-Error-Reporting.md b/_posts/09-07-01-Error-Reporting.md similarity index 100% rename from _posts/08-07-01-Error-Reporting.md rename to _posts/09-07-01-Error-Reporting.md diff --git a/_posts/09-01-01-Testing.md b/_posts/10-01-01-Testing.md similarity index 100% rename from _posts/09-01-01-Testing.md rename to _posts/10-01-01-Testing.md diff --git a/_posts/09-02-01-Test-Driven-Development.md b/_posts/10-02-01-Test-Driven-Development.md similarity index 100% rename from _posts/09-02-01-Test-Driven-Development.md rename to _posts/10-02-01-Test-Driven-Development.md diff --git a/_posts/09-03-01-Behavior-Driven-Development.md b/_posts/10-03-01-Behavior-Driven-Development.md similarity index 100% rename from _posts/09-03-01-Behavior-Driven-Development.md rename to _posts/10-03-01-Behavior-Driven-Development.md diff --git a/_posts/09-04-01-Complementary-Testing-Tools.md b/_posts/10-04-01-Complementary-Testing-Tools.md similarity index 100% rename from _posts/09-04-01-Complementary-Testing-Tools.md rename to _posts/10-04-01-Complementary-Testing-Tools.md diff --git a/_posts/10-01-01-Servers-and-Deployment.md b/_posts/11-01-01-Servers-and-Deployment.md similarity index 100% rename from _posts/10-01-01-Servers-and-Deployment.md rename to _posts/11-01-01-Servers-and-Deployment.md diff --git a/_posts/10-02-01-Platform-as-a-Service.md b/_posts/11-02-01-Platform-as-a-Service.md similarity index 100% rename from _posts/10-02-01-Platform-as-a-Service.md rename to _posts/11-02-01-Platform-as-a-Service.md diff --git a/_posts/10-03-01-Virtual-or-Dedicated-Servers.md b/_posts/11-03-01-Virtual-or-Dedicated-Servers.md similarity index 100% rename from _posts/10-03-01-Virtual-or-Dedicated-Servers.md rename to _posts/11-03-01-Virtual-or-Dedicated-Servers.md diff --git a/_posts/10-04-01-Shared-Servers.md b/_posts/11-04-01-Shared-Servers.md similarity index 100% rename from _posts/10-04-01-Shared-Servers.md rename to _posts/11-04-01-Shared-Servers.md diff --git a/_posts/10-05-01-Building-your-Application.md b/_posts/11-05-01-Building-your-Application.md similarity index 100% rename from _posts/10-05-01-Building-your-Application.md rename to _posts/11-05-01-Building-your-Application.md diff --git a/_posts/11-01-01-Caching.md b/_posts/12-01-01-Caching.md similarity index 100% rename from _posts/11-01-01-Caching.md rename to _posts/12-01-01-Caching.md diff --git a/_posts/11-02-01-Bytecode-Cache.md b/_posts/12-02-01-Bytecode-Cache.md similarity index 100% rename from _posts/11-02-01-Bytecode-Cache.md rename to _posts/12-02-01-Bytecode-Cache.md diff --git a/_posts/11-03-01-Object-Caching.md b/_posts/12-03-01-Object-Caching.md similarity index 100% rename from _posts/11-03-01-Object-Caching.md rename to _posts/12-03-01-Object-Caching.md diff --git a/_posts/12-01-01-Resources.md b/_posts/13-01-01-Resources.md similarity index 100% rename from _posts/12-01-01-Resources.md rename to _posts/13-01-01-Resources.md diff --git a/_posts/12-02-01-Frameworks.md b/_posts/13-02-01-Frameworks.md similarity index 100% rename from _posts/12-02-01-Frameworks.md rename to _posts/13-02-01-Frameworks.md diff --git a/_posts/12-03-01-Components.md b/_posts/13-03-01-Components.md similarity index 100% rename from _posts/12-03-01-Components.md rename to _posts/13-03-01-Components.md diff --git a/_posts/13-01-01-Community.md b/_posts/14-01-01-Community.md similarity index 100% rename from _posts/13-01-01-Community.md rename to _posts/14-01-01-Community.md From 79334026462b892c8a984708ddb4bc9e36d471c2 Mon Sep 17 00:00:00 2001 From: happyaccidents Date: Tue, 26 Nov 2013 14:37:09 +0000 Subject: [PATCH 06/22] Missed a rename --- _posts/{08-01-01-Databases.md => 07-01-01-Databases.md} | 0 ...Errors-and-Exceptions.md => 08-01-01-Errors-and-Exceptions.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename _posts/{08-01-01-Databases.md => 07-01-01-Databases.md} (100%) rename _posts/{07-01-01-Errors-and-Exceptions.md => 08-01-01-Errors-and-Exceptions.md} (100%) diff --git a/_posts/08-01-01-Databases.md b/_posts/07-01-01-Databases.md similarity index 100% rename from _posts/08-01-01-Databases.md rename to _posts/07-01-01-Databases.md diff --git a/_posts/07-01-01-Errors-and-Exceptions.md b/_posts/08-01-01-Errors-and-Exceptions.md similarity index 100% rename from _posts/07-01-01-Errors-and-Exceptions.md rename to _posts/08-01-01-Errors-and-Exceptions.md From 192a207e2db94a2050b025e168b4a729fef4a517 Mon Sep 17 00:00:00 2001 From: happyaccidents Date: Thu, 28 Nov 2013 12:17:44 +0000 Subject: [PATCH 07/22] First draft - Resolves #280 --- _posts/06-01-01-Dependency-Injection.md | 8 ++++ _posts/06-02-01-Basic-Concept.md | 57 +++++++++++++++++++++++++ _posts/06-03-01-Complex-Problem.md | 49 +++++++++++++++++++++ _posts/06-04-01-Containers.md | 14 ++++++ _posts/06-05-01-Further-Reading.md | 11 +++++ 5 files changed, 139 insertions(+) create mode 100644 _posts/06-01-01-Dependency-Injection.md create mode 100644 _posts/06-02-01-Basic-Concept.md create mode 100644 _posts/06-03-01-Complex-Problem.md create mode 100644 _posts/06-04-01-Containers.md create mode 100644 _posts/06-05-01-Further-Reading.md diff --git a/_posts/06-01-01-Dependency-Injection.md b/_posts/06-01-01-Dependency-Injection.md new file mode 100644 index 0000000..3bac06e --- /dev/null +++ b/_posts/06-01-01-Dependency-Injection.md @@ -0,0 +1,8 @@ +--- +title: Dependency Injection +--- + +# Dependency Injection {#dependency_injection_title} + +Dependency Injection is a basic concept that solves a complex problem. As a software design pattern it is being adopted in +some way or another by all major PHP projects. diff --git a/_posts/06-02-01-Basic-Concept.md b/_posts/06-02-01-Basic-Concept.md new file mode 100644 index 0000000..1748afe --- /dev/null +++ b/_posts/06-02-01-Basic-Concept.md @@ -0,0 +1,57 @@ +--- +isChild: true +--- + +## Basic Concept {#basic_concept_title} + +From [Wikipedia](http://en.wikipedia.org/wiki/Dependency_injection): + +> Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it +> possible to change them, whether at run-time or compile-time. + +This quote makes the concept sound much more complicated than it actually is. Dependency Injection is providing a component +with it's dependencies either through constructor injection, method calls or the setting of properties. It is that simple. + +We can demonstrate the concept with a simple, yet naive, example. + +{% highlight php %} +adapter = new MySqlAdapter; + } +} + +class MysqlAdapter {} +{% endhighlight %} + +Here we have a `Database` class that requires an adapter to speak to the database. We instantiate the +adapter in the constructor and create a hard dependency. This code can be refactored to use Dependency Injection +and therefore loosen the dependency. + +{% highlight php %} +adapter = $adapter; + } +} + +class MysqlAdapter {} +{% endhighlight %} + +Now we are giving the `Database` class it's dependency rather than it creating it itself. We could even create a method +that would accept an argument of the dependency and set it that way, or if the `$adapter` property was `public` we could +set it directly. diff --git a/_posts/06-03-01-Complex-Problem.md b/_posts/06-03-01-Complex-Problem.md new file mode 100644 index 0000000..07050d2 --- /dev/null +++ b/_posts/06-03-01-Complex-Problem.md @@ -0,0 +1,49 @@ +--- +isChild: true +--- + +## Complex Problem {#complex_problem_title} + +If you have ever read about Dependency Injection then you have probably seen the terms *"Inversion of Control"* or *"Dependency Inversion Principle"*. +These are the complex problems that Dependency Injection solves, or to be more precise, elegantly solves. + +For years, PHP frameworks have been achieving Inversion of Control, however, the question became, which part of control +are you inverting, and where to? For example, MVC frameworks would generally provide a super object or base controller that other +controllers must extend to gain access to it's dependencies. This **is** Inversion of Control, however, instead of loosening +dependencies, this method simply moved them. + +Dependency Injection allows us to more elegantly solve this problem by only injecting the dependencies we need, when we need them, +without the need for any hard coded dependencies at all. + +Dependency Inversion Principle is the "D" in the S.O.L.I.D set of object oriented design principles that states one should +*"Depend on Abstractions. Do not depend on concretions."*. Put simply, this means our dependencies should be interfaces/contracts or abstract +classes rather than concrete implementations. We can easily refactor the above example to follow this principle. + +{% highlight php %} +adapter = $adapter; + } +} + +interface AdapterInterface {} + +class MysqlAdapter implements AdapterInterface {} +{% endhighlight %} + +There are several benefits to the Database class now depending on an interface rather than a concretion. + +Consider that you are working in a team and the adapter is being worked on by a colleague. In our first example, we would have +to wait for said colleague to finish the adapter before we could properly mock it for our unit tests. Now that the dependency +is an interface/contract we can happily mock that interface knowing that our colleague will build the adapter based on that contract. + +An even bigger benefit to this method is that our code is now much more scalable. If a year down the line we decide that we +want to migrate to a different type of database, we can write an adapter that implements the original interface and inject that instead, +no more refactoring would be required as we can ensure that the adapter follows the contract set by the interface. diff --git a/_posts/06-04-01-Containers.md b/_posts/06-04-01-Containers.md new file mode 100644 index 0000000..b3eca74 --- /dev/null +++ b/_posts/06-04-01-Containers.md @@ -0,0 +1,14 @@ +--- +isChild: true +--- + +## Containers {#containers_title} + +The first thing you should understand about Dependency Injection Containers is that they are not the same thing as Dependency +Injection. A container is a convenience utility that helps us implement Dependency Injection, however, they can be and often +are misused to implement an anti pattern, Service Location. Using a container as a Service Locator within your classes arguably +creates a harder dependency on the container than the dependency you are replacing. It also makes your code much less transparent +and ultimately harder to test. + +Most modern frameworks have their own Dependency Injection Container that allows you to wire your dependencies together through configuration. +What this means in practice is that you can write application code that is as clean and de-coupled as the framework it is built on. diff --git a/_posts/06-05-01-Further-Reading.md b/_posts/06-05-01-Further-Reading.md new file mode 100644 index 0000000..e1d3645 --- /dev/null +++ b/_posts/06-05-01-Further-Reading.md @@ -0,0 +1,11 @@ +--- +isChild: true +--- + +## Further Reading {#further_reading_title} + +- [Learning about Dependency Injection and PHP](http://ralphschindler.com/2011/05/18/learning-about-dependency-injection-and-php) +- [What is Dependency Injection?](http://fabien.potencier.org/article/11/what-is-dependency-injection) +- [Dependency Injection: An analogy](http://mwop.net/blog/260-Dependency-Injection-An-analogy.html) +- [Dependency Injection: Huh?](http://net.tutsplus.com/tutorials/php/dependency-injection-huh/) +- [Dependency Injection as a tool for testing](http://www.happyaccidents.me/dependency-injection-as-a-tool-for-testing/) From ea4a6bebe236b7437cd0afba54233204cb3ef83e Mon Sep 17 00:00:00 2001 From: happyaccidents Date: Thu, 28 Nov 2013 14:00:56 +0000 Subject: [PATCH 08/22] Revisions --- _posts/06-01-01-Dependency-Injection.md | 9 +++++++-- _posts/06-02-01-Basic-Concept.md | 16 +++++----------- _posts/06-03-01-Complex-Problem.md | 9 ++++++++- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/_posts/06-01-01-Dependency-Injection.md b/_posts/06-01-01-Dependency-Injection.md index 3bac06e..e69c4a2 100644 --- a/_posts/06-01-01-Dependency-Injection.md +++ b/_posts/06-01-01-Dependency-Injection.md @@ -4,5 +4,10 @@ title: Dependency Injection # Dependency Injection {#dependency_injection_title} -Dependency Injection is a basic concept that solves a complex problem. As a software design pattern it is being adopted in -some way or another by all major PHP projects. +From [Wikipedia](http://en.wikipedia.org/wiki/Dependency_injection): + +> Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it +> possible to change them, whether at run-time or compile-time. + +This quote makes the concept sound much more complicated than it actually is. Dependency Injection is providing a component +with it's dependencies either through constructor injection, method calls or the setting of properties. It is that simple. diff --git a/_posts/06-02-01-Basic-Concept.md b/_posts/06-02-01-Basic-Concept.md index 1748afe..520415b 100644 --- a/_posts/06-02-01-Basic-Concept.md +++ b/_posts/06-02-01-Basic-Concept.md @@ -4,15 +4,11 @@ isChild: true ## Basic Concept {#basic_concept_title} -From [Wikipedia](http://en.wikipedia.org/wiki/Dependency_injection): +We can demonstrate the concept with a simple, yet naive. -> Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it -> possible to change them, whether at run-time or compile-time. - -This quote makes the concept sound much more complicated than it actually is. Dependency Injection is providing a component -with it's dependencies either through constructor injection, method calls or the setting of properties. It is that simple. - -We can demonstrate the concept with a simple, yet naive, example. +Here we have a `Database` class that requires an adapter to speak to the database. We instantiate the +adapter in the constructor and create a hard dependency. This makes testing difficult and means the `Database` class is +very tightly coupled to the adapter. {% highlight php %} Date: Fri, 29 Nov 2013 09:46:15 +0000 Subject: [PATCH 09/22] Typos and further change re comments --- _posts/06-03-01-Complex-Problem.md | 26 +++++++++++++------------- _posts/06-04-01-Containers.md | 10 +++++----- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/_posts/06-03-01-Complex-Problem.md b/_posts/06-03-01-Complex-Problem.md index 69e69fb..9fd0f21 100644 --- a/_posts/06-03-01-Complex-Problem.md +++ b/_posts/06-03-01-Complex-Problem.md @@ -4,26 +4,26 @@ isChild: true ## Complex Problem {#complex_problem_title} -If you have ever read about Dependency Injection then you have probably seen the terms *"Inversion of Control"* or *"Dependency Inversion Principle"*. +If you have ever read about Dependency Injection then you have probably seen the terms *"Inversion of Control"* or *"Dependency Inversion Principle"*. These are the complex problems that Dependency Injection solves. ### Inversion of Control -Inversion of Control is as it says, "inverting the control" of a system by keeping organisational control entirely separate from our objects. +Inversion of Control is as it says, "inverting the control" of a system by keeping organisational control entirely separate from our objects. In terms of Dependency Injection, this means loosening our dependencies by controlling and instantiating them elsewhere in the system. -For years, PHP frameworks have been achieving Inversion of Control, however, the question became, which part of control -are you inverting, and where to? For example, MVC frameworks would generally provide a super object or base controller that other -controllers must extend to gain access to it's dependencies. This **is** Inversion of Control, however, instead of loosening +For years, PHP frameworks have been achieving Inversion of Control, however, the question became, which part of control +are you inverting, and where to? For example, MVC frameworks would generally provide a super object or base controller that other +controllers must extend to gain access to its dependencies. This **is** Inversion of Control, however, instead of loosening dependencies, this method simply moved them. -Dependency Injection allows us to more elegantly solve this problem by only injecting the dependencies we need, when we need them, +Dependency Injection allows us to more elegantly solve this problem by only injecting the dependencies we need, when we need them, without the need for any hard coded dependencies at all. ### Dependency Inversion Principle -Dependency Inversion Principle is the "D" in the S.O.L.I.D set of object oriented design principles that states one should -*"Depend on Abstractions. Do not depend on concretions."*. Put simply, this means our dependencies should be interfaces/contracts or abstract +Dependency Inversion Principle is the "D" in the S.O.L.I.D set of object oriented design principles that states one should +*"Depend on Abstractions. Do not depend on concretions."*. Put simply, this means our dependencies should be interfaces/contracts or abstract classes rather than concrete implementations. We can easily refactor the above example to follow this principle. {% highlight php %} @@ -45,12 +45,12 @@ interface AdapterInterface {} class MysqlAdapter implements AdapterInterface {} {% endhighlight %} -There are several benefits to the Database class now depending on an interface rather than a concretion. +There are several benefits to the `Database` class now depending on an interface rather than a concretion. -Consider that you are working in a team and the adapter is being worked on by a colleague. In our first example, we would have -to wait for said colleague to finish the adapter before we could properly mock it for our unit tests. Now that the dependency +Consider that you are working in a team and the adapter is being worked on by a colleague. In our first example, we would have +to wait for said colleague to finish the adapter before we could properly mock it for our unit tests. Now that the dependency is an interface/contract we can happily mock that interface knowing that our colleague will build the adapter based on that contract. -An even bigger benefit to this method is that our code is now much more scalable. If a year down the line we decide that we -want to migrate to a different type of database, we can write an adapter that implements the original interface and inject that instead, +An even bigger benefit to this method is that our code is now much more scalable. If a year down the line we decide that we +want to migrate to a different type of database, we can write an adapter that implements the original interface and inject that instead, no more refactoring would be required as we can ensure that the adapter follows the contract set by the interface. diff --git a/_posts/06-04-01-Containers.md b/_posts/06-04-01-Containers.md index b3eca74..f0e5466 100644 --- a/_posts/06-04-01-Containers.md +++ b/_posts/06-04-01-Containers.md @@ -4,11 +4,11 @@ isChild: true ## Containers {#containers_title} -The first thing you should understand about Dependency Injection Containers is that they are not the same thing as Dependency -Injection. A container is a convenience utility that helps us implement Dependency Injection, however, they can be and often -are misused to implement an anti pattern, Service Location. Using a container as a Service Locator within your classes arguably -creates a harder dependency on the container than the dependency you are replacing. It also makes your code much less transparent +The first thing you should understand about Dependency Injection Containers is that they are not the same thing as Dependency +Injection. A container is a convenience utility that helps us implement Dependency Injection, however, they can be and often +are misused to implement an anti-pattern, Service Location. Injecting a DI container as a Service Locator in to your classes arguably +creates a harder dependency on the container than the dependency you are replacing. It also makes your code much less transparent and ultimately harder to test. -Most modern frameworks have their own Dependency Injection Container that allows you to wire your dependencies together through configuration. +Most modern frameworks have their own Dependency Injection Container that allows you to wire your dependencies together through configuration. What this means in practice is that you can write application code that is as clean and de-coupled as the framework it is built on. From fd21b24e3f48a2f9e9880eb22b1a9ed222e0b210 Mon Sep 17 00:00:00 2001 From: Josh Lockhart Date: Fri, 29 Nov 2013 11:56:00 -0500 Subject: [PATCH 10/22] Fix DI typo --- _posts/06-02-01-Basic-Concept.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_posts/06-02-01-Basic-Concept.md b/_posts/06-02-01-Basic-Concept.md index 520415b..727ba7a 100644 --- a/_posts/06-02-01-Basic-Concept.md +++ b/_posts/06-02-01-Basic-Concept.md @@ -4,10 +4,10 @@ isChild: true ## Basic Concept {#basic_concept_title} -We can demonstrate the concept with a simple, yet naive. +We can demonstrate the concept with a simple, yet naive example. -Here we have a `Database` class that requires an adapter to speak to the database. We instantiate the -adapter in the constructor and create a hard dependency. This makes testing difficult and means the `Database` class is +Here we have a `Database` class that requires an adapter to speak to the database. We instantiate the +adapter in the constructor and create a hard dependency. This makes testing difficult and means the `Database` class is very tightly coupled to the adapter. {% highlight php %} @@ -46,6 +46,6 @@ class Database class MysqlAdapter {} {% endhighlight %} -Now we are giving the `Database` class it's dependency rather than it creating it itself. We could even create a method -that would accept an argument of the dependency and set it that way, or if the `$adapter` property was `public` we could +Now we are giving the `Database` class it's dependency rather than it creating it itself. We could even create a method +that would accept an argument of the dependency and set it that way, or if the `$adapter` property was `public` we could set it directly. From 81ae63d5da54184d0dc85c2c90b4dae2c0ac039f Mon Sep 17 00:00:00 2001 From: Josh Lockhart Date: Fri, 29 Nov 2013 11:57:23 -0500 Subject: [PATCH 11/22] Fix DI typo --- _posts/06-02-01-Basic-Concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/06-02-01-Basic-Concept.md b/_posts/06-02-01-Basic-Concept.md index 727ba7a..fb9954b 100644 --- a/_posts/06-02-01-Basic-Concept.md +++ b/_posts/06-02-01-Basic-Concept.md @@ -46,6 +46,6 @@ class Database class MysqlAdapter {} {% endhighlight %} -Now we are giving the `Database` class it's dependency rather than it creating it itself. We could even create a method +Now we are giving the `Database` class its dependency rather than it creating it itself. We could even create a method that would accept an argument of the dependency and set it that way, or if the `$adapter` property was `public` we could set it directly. From 3bd78009eb2b1e16f64cf00f3158f789d9c5f1fc Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Mon, 2 Dec 2013 10:23:11 -0500 Subject: [PATCH 12/22] Fixed link for Enhance PHP Thanks to @w00 for pointing this one out in #332. --- _posts/10-02-01-Test-Driven-Development.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/_posts/10-02-01-Test-Driven-Development.md b/_posts/10-02-01-Test-Driven-Development.md index f6571d4..71528d6 100644 --- a/_posts/10-02-01-Test-Driven-Development.md +++ b/_posts/10-02-01-Test-Driven-Development.md @@ -30,10 +30,11 @@ you run a project which accepts pull requests then you should suggest this as a [PHPUnit](http://phpunit.de) is the de-facto testing framework for writing unit tests for PHP applications, but there are several alternatives -* [SimpleTest](http://simpletest.org) -* [Enhance PHP](http://www.enhance-php.com/) -* [PUnit](http://punit.smf.me.uk/) * [atoum](https://github.com/atoum/atoum) +* [Enhance PHP](https://github.com/Enhance-PHP/Enhance-PHP) +* [PUnit](http://punit.smf.me.uk/) +* [SimpleTest](http://simpletest.org) + ### Integration Testing From 67df3eb54e7e20e9310ca05657f12f8e2bff4d47 Mon Sep 17 00:00:00 2001 From: Ryan Koven Date: Tue, 3 Dec 2013 13:45:16 -0800 Subject: [PATCH 13/22] Remove an extraneous 'to'; rectify an instance of an incorrect verb tense; small adjust to punctuation. Original text noted that it's "usually a good idea to follow to common patterns". Removed extra 'to'. In MVC section the sentence "The model-view-controller (MVC) pattern... let..." should be changed to "The model-view-controller (MVC) pattern...lets..." Also added a semicolon to a sentence in the Factory section that Strunk and White would agree enhances the clarity of the sentence. --- pages/Design-Patterns.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pages/Design-Patterns.md b/pages/Design-Patterns.md index 4a3fe45..64618c2 100644 --- a/pages/Design-Patterns.md +++ b/pages/Design-Patterns.md @@ -6,7 +6,7 @@ title: Design Patterns # Design Patterns There are numerous ways to structure the code and project for you web application, and you can put as much or as little -thought as you like into architecting. But it is usually a good idea to follow to common patterns because it will make +thought as you like into architecting. But it is usually a good idea to follow common patterns because it will make your code easier to manage and easier for others to understand. * [Architectural pattern on Wikipedia](https://en.wikipedia.org/wiki/Architectural_pattern) @@ -51,7 +51,7 @@ print_r($veyron->get_make_and_model()); // outputs "Bugatti Veyron" {% endhighlight %} This code uses a factory to create the Automobile object. There are two possible benefits to building your code this -way, the first is that if you need to change, rename, or replace the Automobile class later on you can do so and you +way; the first is that if you need to change, rename, or replace the Automobile class later on you can do so and you will only have to modify the code in the factory, instead of every place in your project that uses the Automobile class. The second possible benefit is that if creating the object is a complicated job you can do all of the work in the factory, instead of repeating it every time you want to create a new instance. @@ -250,11 +250,7 @@ and gives you a central place to hook in code that should be run for every reque ## Model-View-Controller -The model-view-controller (MVC) pattern and its relatives HMVC and MVVM let you break up code into logical objects that -serve very specific purposes. Models serve as a data access layer where data is fetched and returned in formats usable -throughout your application. Controllers handle the request, process the data returned from models and load views to -send in the response. And views are display templates (markup, xml, etc) that are sent in the response to the web -browser. +The model-view-controller (MVC) pattern and its relatives HMVC and MVVM lets you break up code into logical objects that serve very specific purposes. Models serve as a data access layer where data is fetched and returned in formats usable throughout your application. Controllers handle the request, process the data returned from models and load views to send in the response. And views are display templates (markup, xml, etc) that are sent in the response to the web browser. MVC is the most common architectural pattern used in the popular [PHP frameworks](https://github.com/codeguy/php-the-right-way/wiki/Frameworks). From c406b927230a61d6daeff384fc771500224f7228 Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Sat, 7 Dec 2013 09:26:04 -0500 Subject: [PATCH 14/22] Updated mwop's Twitter account --- _posts/13-01-01-Resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/13-01-01-Resources.md b/_posts/13-01-01-Resources.md index 3837fbc..9466aa5 100644 --- a/_posts/13-01-01-Resources.md +++ b/_posts/13-01-01-Resources.md @@ -12,7 +12,7 @@ * [Derick Rethans](http://twitter.com/derickr) * [Chris Shiflett](http://twitter.com/shiflett) * [Sebastian Bergmann](http://twitter.com/s_bergmann) -* [Matthew Weier O'Phinney](http://twitter.com/weierophinney) +* [Matthew Weier O'Phinney](http://twitter.com/mwop) * [Pádraic Brady](http://twitter.com/padraicb) * [Anthony Ferrara](http://twitter.com/ircmaxell) * [Nikita Popov](http://twitter.com/nikita_ppv) From 710cba2569c15d94127438a21a05ea7e2bceaf83 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Sun, 8 Dec 2013 16:02:22 +0100 Subject: [PATCH 15/22] coding style fix --- _posts/07-01-01-Databases.md | 2 +- _posts/09-03-01-Password-Hashing.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_posts/07-01-01-Databases.md b/_posts/07-01-01-Databases.md index 5f024fa..7f37417 100644 --- a/_posts/07-01-01-Databases.md +++ b/_posts/07-01-01-Databases.md @@ -45,7 +45,7 @@ which will delete all of your users! Instead, you should sanitize the ID input u prepare('SELECT name FROM users WHERE id = :id'); -$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Automatically sanitized by PDO +$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- Automatically sanitized by PDO $stmt->execute(); {% endhighlight %} diff --git a/_posts/09-03-01-Password-Hashing.md b/_posts/09-03-01-Password-Hashing.md index cf9f544..ad82acd 100644 --- a/_posts/09-03-01-Password-Hashing.md +++ b/_posts/09-03-01-Password-Hashing.md @@ -22,9 +22,9 @@ require 'password.php'; $passwordHash = password_hash('secret-password', PASSWORD_DEFAULT); if (password_verify('bad-password', $passwordHash)) { - //Correct Password + // Correct Password } else { - //Wrong password + // Wrong password } {% endhighlight %} From 346e3fabdef5fee80bb8d411b219d39fbbc4b5f4 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Sat, 2 Nov 2013 23:57:11 +0100 Subject: [PATCH 16/22] link to openshift fixed --- _posts/13-01-01-Resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/13-01-01-Resources.md b/_posts/13-01-01-Resources.md index 9466aa5..61c42fe 100644 --- a/_posts/13-01-01-Resources.md +++ b/_posts/13-01-01-Resources.md @@ -29,7 +29,7 @@ (PHP support is undocumented but based on stable Facebook partnership [link](http://net.tutsplus.com/tutorials/php/quick-tip-deploy-php-to-heroku-in-seconds/)) * [fortrabbit](http://fortrabbit.com/) * [Engine Yard Cloud](https://www.engineyard.com/products/cloud) -* [Red Hat OpenShift Platform](http://www.redhat.com/products/cloud-computing/openshift/) +* [Red Hat OpenShift Platform](http://openshift.com) * [dotCloud](http://docs.dotcloud.com/services/php/) * [AWS Elastic Beanstalk](http://aws.amazon.com/elasticbeanstalk/) * [cloudControl](https://www.cloudcontrol.com/) From eb3cdfcbf65b72205c7d5360362051218bdaa5c1 Mon Sep 17 00:00:00 2001 From: Josh Lockhart Date: Fri, 13 Dec 2013 12:10:23 -0500 Subject: [PATCH 17/22] Update GA snippet --- _layouts/default.html | 2 +- _layouts/page.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index aeb97c5..863dfa8 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -23,7 +23,7 @@ _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); diff --git a/_layouts/page.html b/_layouts/page.html index a3556b9..9c22aab 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -22,7 +22,7 @@ _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); From 371e113a91e4ba54e9a4f6e5a3c5b4b7405a24ac Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Wed, 8 Jan 2014 23:12:03 -0500 Subject: [PATCH 18/22] Added a note about VersionEye for Composer --- _posts/04-02-01-Composer-and-Packagist.md | 24 +++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/_posts/04-02-01-Composer-and-Packagist.md b/_posts/04-02-01-Composer-and-Packagist.md index fc67e0b..8cafc09 100644 --- a/_posts/04-02-01-Composer-and-Packagist.md +++ b/_posts/04-02-01-Composer-and-Packagist.md @@ -36,16 +36,18 @@ The path `$HOME/local/bin` (or a directory of your choice) should be in your `$P When you come across documentation that states to run Composer as `php composer.phar install`, you can substitute that with: composer install + +This section will assume you have installed composer globally. ### How to Define and Install Dependencies -Composer keeps track of your project's dependencies in a file called `composer.json`. You can manage it by hand if you like, or use Composer itself. The `php composer.phar require` command adds a project dependency and if you don't have a `composer.json` file, one will be created. Here's an example that adds [Twig][2] as a dependency of your project. Run it in your project's root directory where you've downloaded `composer.phar`: +Composer keeps track of your project's dependencies in a file called `composer.json`. You can manage it by hand if you like, or use Composer itself. The `composer require` command adds a project dependency and if you don't have a `composer.json` file, one will be created. Here's an example that adds [Twig][2] as a dependency of your project. - php composer.phar require twig/twig:~1.8 + composer require twig/twig:~1.8 -Alternatively the `php composer.phar init` command will guide you through creating a full `composer.json` file for your project. Either way, once you've created your `composer.json` file you can tell Composer to download and install your dependencies into the `vendors/` directory. This also applies to projects you've downloaded that already provide a `composer.json` file: +Alternatively the `composer init` command will guide you through creating a full `composer.json` file for your project. Either way, once you've created your `composer.json` file you can tell Composer to download and install your dependencies into the `vendors/` directory. This also applies to projects you've downloaded that already provide a `composer.json` file: - php composer.phar install + composer install Next, add this line to your application's primary PHP file; this will tell PHP to use Composer's autoloader for your project dependencies. @@ -62,14 +64,20 @@ Composer creates a file called `composer.lock` which stores the exact version of This is most useful when you define your version requirements flexibly. For instance a version requirement of ~1.8 means "anything newer than 1.8.0, but less than 2.0.x-dev". You can also use the `*` wildcard as in `1.8.*`. Now Composer's `php composer.phar update` command will upgrade all your dependencies to the newest version that fits the restrictions you define. +### Update Notifcations + +To receive notifications about new version releases you can sign up for [VersionEye][3], a web service that can monitor +your GitHub and BitBucket accounts for `composer.json` files and send emails with new package releases. + ### Checking your dependencies for security issues -The [Security Advisories Checker][3] is a web service and a command-line tool, both will examine your `composer.lock` file and tell you if you need to update any of your dependencies. +The [Security Advisories Checker][4] is a web service and a command-line tool, both will examine your `composer.lock` file and tell you if you need to update any of your dependencies. -* [Learn about Composer][4] +* [Learn about Composer][5] [1]: http://packagist.org/ [2]: http://twig.sensiolabs.org -[3]: https://security.sensiolabs.org/ -[4]: http://getcomposer.org/doc/00-intro.md +[3]: https://www.versioneye.com/ +[4]: https://security.sensiolabs.org/ +[5]: http://getcomposer.org/doc/00-intro.md From 575297558681c212c0129340ee69b4e1db4e92bd Mon Sep 17 00:00:00 2001 From: Antonio Spinelli Date: Fri, 17 Jan 2014 10:42:14 -0200 Subject: [PATCH 19/22] Composer and Pakagist, fix typo --- _posts/04-02-01-Composer-and-Packagist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/04-02-01-Composer-and-Packagist.md b/_posts/04-02-01-Composer-and-Packagist.md index 8cafc09..0d45435 100644 --- a/_posts/04-02-01-Composer-and-Packagist.md +++ b/_posts/04-02-01-Composer-and-Packagist.md @@ -64,7 +64,7 @@ Composer creates a file called `composer.lock` which stores the exact version of This is most useful when you define your version requirements flexibly. For instance a version requirement of ~1.8 means "anything newer than 1.8.0, but less than 2.0.x-dev". You can also use the `*` wildcard as in `1.8.*`. Now Composer's `php composer.phar update` command will upgrade all your dependencies to the newest version that fits the restrictions you define. -### Update Notifcations +### Update Notifications To receive notifications about new version releases you can sign up for [VersionEye][3], a web service that can monitor your GitHub and BitBucket accounts for `composer.json` files and send emails with new package releases. From 960a5c529237025e1901cdf12dcda3ee70430718 Mon Sep 17 00:00:00 2001 From: kfuchs Date: Fri, 31 Jan 2014 10:31:45 -0500 Subject: [PATCH 20/22] Added Propel to the list --- _posts/07-01-01-Databases.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_posts/07-01-01-Databases.md b/_posts/07-01-01-Databases.md index 7f37417..31ee070 100644 --- a/_posts/07-01-01-Databases.md +++ b/_posts/07-01-01-Databases.md @@ -73,6 +73,7 @@ Some abstraction layers have been built using the PSR-0 namespace standard so ca * [Aura SQL][6] * [Doctrine2 DBAL][2] +* [Propel][7] * [ZF2 Db][4] * [ZF1 Db][3] @@ -82,6 +83,7 @@ Some abstraction layers have been built using the PSR-0 namespace standard so ca [4]: http://packages.zendframework.com/docs/latest/manual/en/index.html#zend-db [5]: http://php.net/manual/en/pdo.connections.php [6]: https://github.com/auraphp/Aura.Sql +[7]: http://propelorm.org/Propel/ [mysql]: http://php.net/mysql [mysqli]: http://php.net/mysqli From 822da9c725bae26e08b369d6f4ca2267fb0343cc Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Fri, 31 Jan 2014 16:57:28 -0500 Subject: [PATCH 21/22] Hi PSR-0, this is PSR-4. I'm coming for you. --- _posts/02-01-01-Code-Style-Guide.md | 10 ++++++---- _posts/03-03-01-Namespaces.md | 22 ++++++++++++++++++---- _posts/07-01-01-Databases.md | 4 +++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/_posts/02-01-01-Code-Style-Guide.md b/_posts/02-01-01-Code-Style-Guide.md index f7a6d0c..099d09b 100644 --- a/_posts/02-01-01-Code-Style-Guide.md +++ b/_posts/02-01-01-Code-Style-Guide.md @@ -5,10 +5,10 @@ PHP developers to choose several of these and combine them into a single project (as close as possible) to a common code style to make it easy for developers to mix and match various libraries for their projects. -The [Framework Interop Group][fig] has proposed and approved a series of style recommendations, known as [PSR-0][psr0], -[PSR-1][psr1] and [PSR-2][psr2]. Don't let the funny names confuse you, these recommendations are merely -a set of rules that some projects like Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, etc are starting -to adopt. You can use them for your own projects, or continue to use your own personal style. +The [Framework Interop Group][fig] has proposed and approved a series of style recommendations. Not all of them related +to code-style, but those that do are [PSR-0][psr0], [PSR-1][psr1], [PSR-2][psr2] and [PSR-4][psr4]. These recommendations +are merely a set of rules that some projects like Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, +etc are starting to adopt. You can use them for your own projects, or continue to use your own personal style. Ideally you should write PHP code that adheres to a known standard. This could be any combination of PSR's, or one of the coding standards made by PEAR or Zend. This means other developers can easily read and work with your code, @@ -17,6 +17,7 @@ and applications that implement the components can have consistency even when wo * [Read about PSR-0][psr0] * [Read about PSR-1][psr1] * [Read about PSR-2][psr2] +* [Read about PSR-4][psr4] * [Read about PEAR Coding Standards][pear-cs] * [Read about Zend Coding Standards][zend-cs] * [Read about Symfony Coding Standards][symfony-cs] @@ -34,6 +35,7 @@ by all current and future parties who may be working on the codebase. [psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md [psr1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md [psr2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md +[psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md [pear-cs]: http://pear.php.net/manual/en/standards.php [zend-cs]: http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards [symfony-cs]: http://symfony.com/doc/current/contributing/code/standards.html diff --git a/_posts/03-03-01-Namespaces.md b/_posts/03-03-01-Namespaces.md index bc6eed8..3f1fc23 100644 --- a/_posts/03-03-01-Namespaces.md +++ b/_posts/03-03-01-Namespaces.md @@ -4,16 +4,30 @@ isChild: true ## Namespaces {#namespaces_title} -As mentioned above, the PHP community has a lot of developers creating lots of code. This means that one library's PHP code may use the same class name as another library. When both libraries are used in the same namespace, they collide and cause trouble. +As mentioned above, the PHP community has a lot of developers creating lots of code. This means that +one library's PHP code may use the same class name as another library. When both libraries are used +in the same namespace, they collide and cause trouble. -_Namespaces_ solve this problem. As described in the PHP reference manual, namespaces may be compared to operating system directories that _namespace_ files; two files with the same name may co-exist in separate directories. Likewise, two PHP classes with the same name may co-exist in separate PHP namespaces. It's as simple as that. +_Namespaces_ solve this problem. As described in the PHP reference manual, namespaces may be compared +to operating system directories that _namespace_ files; two files with the same name may co-exist in +separate directories. Likewise, two PHP classes with the same name may co-exist in separate PHP +namespaces. It's as simple as that. -It is important for you to namespace your code so that it may be used by other developers without fear of colliding with other libraries. +It is important for you to namespace your code so that it may be used by other developers without fear +of colliding with other libraries. -One recommended way to use namespaces is outlined in [PSR-0][psr0], which aims to provide a standard file, class and namespace convention to allow plug-and-play code. +One recommended way to use namespaces is outlined in [PSR-0][psr0], which aims to provide a standard file, +class and namespace convention to allow plug-and-play code. + +In December 2013 the PHP-FIG created a new autoloading standard: [PSR-4][psr4], which one day will +probably replace PSR-0. Currently both are still usable, as PSR-4 required PHP 5.3 and many PHP 5.2-only +projects currently implement PSR-0. If you're going to use an autoloader standard for a new application or +package then you almost certainly want to look into PSR-4. * [Read about Namespaces][namespaces] * [Read about PSR-0][psr0] +* [Read about PSR-4][psr4] [namespaces]: http://php.net/manual/en/language.namespaces.php [psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md +[psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md \ No newline at end of file diff --git a/_posts/07-01-01-Databases.md b/_posts/07-01-01-Databases.md index 31ee070..17c5e51 100644 --- a/_posts/07-01-01-Databases.md +++ b/_posts/07-01-01-Databases.md @@ -69,7 +69,7 @@ one database system that another is missing from another by wrapping your querie This will of course add a little overhead, but if you are building a portable application that needs to work with MySQL, PostgreSQL and SQLite then a little overhead will be worth it the sake of code cleanliness. -Some abstraction layers have been built using the PSR-0 namespace standard so can be installed in any application you like: +Some abstraction layers have been built using the [PSR-0][psr0] or [PSR-4][psr4] namespace standards so can be installed in any application you like: * [Aura SQL][6] * [Doctrine2 DBAL][2] @@ -88,3 +88,5 @@ Some abstraction layers have been built using the PSR-0 namespace standard so ca [mysql]: http://php.net/mysql [mysqli]: http://php.net/mysqli [pgsql]: http://php.net/pgsql +[psr0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md +[psr4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md From 3de54f0946593c6dd78e0bee91cace30a94bc07b Mon Sep 17 00:00:00 2001 From: Phil Sturgeon Date: Fri, 31 Jan 2014 16:58:37 -0500 Subject: [PATCH 22/22] s/d/s. --- _posts/03-03-01-Namespaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/03-03-01-Namespaces.md b/_posts/03-03-01-Namespaces.md index 3f1fc23..23c7280 100644 --- a/_posts/03-03-01-Namespaces.md +++ b/_posts/03-03-01-Namespaces.md @@ -20,7 +20,7 @@ One recommended way to use namespaces is outlined in [PSR-0][psr0], which aims t class and namespace convention to allow plug-and-play code. In December 2013 the PHP-FIG created a new autoloading standard: [PSR-4][psr4], which one day will -probably replace PSR-0. Currently both are still usable, as PSR-4 required PHP 5.3 and many PHP 5.2-only +probably replace PSR-0. Currently both are still usable, as PSR-4 requires PHP 5.3 and many PHP 5.2-only projects currently implement PSR-0. If you're going to use an autoloader standard for a new application or package then you almost certainly want to look into PSR-4.